Thread: pgsql: Centralize json and jsonb handling of datetime types
Centralize json and jsonb handling of datetime types The creates a single function JsonEncodeDateTime which will format these data types in an efficient and consistent manner. This will be all the more important when we come to jsonpath so we don't have to implement yet more code doing the same thing in two more places. This also extends the code to handle time and timetz types which were not previously handled specially. This requires exposing the time2tm and timetz2tm functions. Patch from Nikita Glukhov Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/cc4feded0a31d2b732d4ea68613115cb720e624e Modified Files -------------- src/backend/utils/adt/date.c | 6 +-- src/backend/utils/adt/json.c | 122 ++++++++++++++++++++++++++++++++---------- src/backend/utils/adt/jsonb.c | 70 ++++-------------------- src/include/utils/date.h | 4 +- src/include/utils/jsonapi.h | 2 + 5 files changed, 109 insertions(+), 95 deletions(-)
On Wed, Jan 17, 2018 at 9:29 AM, Andrew Dunstan <andrew@dunslane.net> wrote: > Centralize json and jsonb handling of datetime types [ ... ] > src/include/utils/date.h | 4 +- I noticed that these changes cause the following warning to be emitted when compiling with gcc (GCC) 6.2.0: In file included from gram.y:63:0: ../../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); Attached is a fix. Thanks, Amit
Attachment
On 2018-01-17 01:29, Andrew Dunstan wrote: > Centralize json and jsonb handling of datetime types [...] > https://git.postgresql.org/pg/commitdiff/cc4feded0a31d2b732d4ea68613115cb720e624e > > Modified Files > -------------- > src/backend/utils/adt/date.c | 6 +-- > src/backend/utils/adt/json.c | 122 > ++++++++++++++++++++++++++++++++---------- > src/backend/utils/adt/jsonb.c | 70 ++++-------------------- > src/include/utils/date.h | 4 +- > src/include/utils/jsonapi.h | 2 + > 5 files changed, 109 insertions(+), 95 deletions(-) Latest gcc 7.2.0 compile shows these warnings (I suppose these come from this commit): Compiling core: In file included from gram.y:63:0: ../../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ^~~~~ In file included from formatting.c:92:0: ../../../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ... while contrib adds: In file included from btree_gin.c:12:0: ../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ^~~~~ In file included from btree_utils_num.c:9:0: ../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ^~~~~ In file included from btree_time.c:9:0: ../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ^~~~~ In file included from btree_date.c:9:0: ../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); No errors, and 'make check' and 'make check-world' are both OK. thanks, Erik Rijkers
On 2018-01-17 01:29, Andrew Dunstan wrote: > Centralize json and jsonb handling of datetime types [...] > https://git.postgresql.org/pg/commitdiff/cc4feded0a31d2b732d4ea68613115cb720e624e > > Modified Files > -------------- > src/backend/utils/adt/date.c | 6 +-- > src/backend/utils/adt/json.c | 122 > ++++++++++++++++++++++++++++++++---------- > src/backend/utils/adt/jsonb.c | 70 ++++-------------------- > src/include/utils/date.h | 4 +- > src/include/utils/jsonapi.h | 2 + > 5 files changed, 109 insertions(+), 95 deletions(-) Latest gcc 7.2.0 compile shows these warnings (I suppose these come from this commit): Compiling core: In file included from gram.y:63:0: ../../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ^~~~~ In file included from formatting.c:92:0: ../../../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ... while contrib adds: In file included from btree_gin.c:12:0: ../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ^~~~~ In file included from btree_utils_num.c:9:0: ../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ^~~~~ In file included from btree_time.c:9:0: ../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); ^~~~~ In file included from btree_date.c:9:0: ../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); ^~~~~ ../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ declared inside parameter list will not be visible outside of this definition or declaration extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); No errors, and 'make check' and 'make check-world' are both OK. thanks, Erik Rijkers
On 01/17/2018 12:34 AM, Amit Langote wrote: > On Wed, Jan 17, 2018 at 9:29 AM, Andrew Dunstan <andrew@dunslane.net> wrote: >> Centralize json and jsonb handling of datetime types > [ ... ] > >> src/include/utils/date.h | 4 +- > I noticed that these changes cause the following warning to be emitted > when compiling with gcc (GCC) 6.2.0: > > In file included from gram.y:63:0: > ../../../src/include/utils/date.h:76:41: warning: ‘struct pg_tm’ > declared inside parameter list will not be visible outside of this > definition or declaration > extern int time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec); > ^~~~~ > ../../../src/include/utils/date.h:77:46: warning: ‘struct pg_tm’ > declared inside parameter list will not be visible outside of this > definition or declaration > extern int timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp); > > Attached is a fix. > Thanks, this is the right fix but in the wrong place. I have added the include in the file where pg_tm is actually used. cheers andrew -- Andrew Dunstan https://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
On Wed, Jan 17, 2018 at 5:34 PM, Andrew Dunstan <andrew.dunstan@2ndquadrant.com> wrote: > > > On 01/17/2018 12:34 AM, Amit Langote wrote: >> On Wed, Jan 17, 2018 at 9:29 AM, Andrew Dunstan <andrew@dunslane.net> wrote: >>> Centralize json and jsonb handling of datetime types >> [ ... ] >> >>> src/include/utils/date.h | 4 +- >> I noticed that these changes cause the following warning to be emitted >> when compiling with gcc (GCC) 6.2.0: >> >> Attached is a fix. >> > > Thanks, this is the right fix but in the wrong place. I have added the > include in the file where pg_tm is actually used. Thank you. Regards, Amit