diff options
author | Thomas G. Lockhart <lockhart@fourpalms.org> | 2000-02-16 17:26:26 +0000 |
---|---|---|
committer | Thomas G. Lockhart <lockhart@fourpalms.org> | 2000-02-16 17:26:26 +0000 |
commit | 41f1f5b76ad8e177a2b19116cbf41384f93f3851 (patch) | |
tree | 2165e6c833bc96f32e2d2b45c1d40b71e9c82ab7 /src/backend/utils/adt/formatting.c | |
parent | c97672b08325d722cf5807ffede9fd31ee070f72 (diff) | |
download | postgresql-41f1f5b76ad8e177a2b19116cbf41384f93f3851.tar.gz postgresql-41f1f5b76ad8e177a2b19116cbf41384f93f3851.zip |
Implement "date/time grand unification".
Transform datetime and timespan into timestamp and interval.
Deprecate datetime and timespan, though translate to new types in gram.y.
Transform all datetime and timespan catalog entries into new types.
Make "INTERVAL" reserved word allowed as a column identifier in gram.y.
Remove dt.h, dt.c files, and retarget datetime.h, datetime.c as utility
routines for all date/time types.
date.{h,c} now deals with date, time types.
timestamp.{h,c} now deals with timestamp, interval types.
nabstime.{h,c} now deals with abstime, reltime, tinterval types.
Make NUMERIC a known native type for purposes of type coersion. Not tested.
Diffstat (limited to 'src/backend/utils/adt/formatting.c')
-rw-r--r-- | src/backend/utils/adt/formatting.c | 97 |
1 files changed, 38 insertions, 59 deletions
diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index e8f6d2cd477..7281d4f4dce 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -1,45 +1,45 @@ /* ----------------------------------------------------------------------- * formatting.c * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.3 2000/02/08 15:56:55 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.4 2000/02/16 17:24:48 thomas Exp $ * * * Portions Copyright (c) 1999-2000, PostgreSQL, Inc * * - * TO_CHAR(); TO_DATETIME(); TO_DATE(); TO_NUMBER(); + * TO_CHAR(); TO_TIMESTAMP(); TO_DATE(); TO_NUMBER(); * - * The PostgreSQL routines for a DateTime/int/float/numeric formatting, + * The PostgreSQL routines for a timestamp/int/float/numeric formatting, * inspire with Oracle TO_CHAR() / TO_DATE() / TO_NUMBER() routines. * * * Cache & Memory: * Routines use (itself) internal cache for format pictures. If - * new format arg is same as a last format string, routines not + * new format arg is same as a last format string, routines do not * call the format-parser. * - * The cache use static buffer and is persistent across transactions. If - * format-picture is bigger than cache buffer, parser is called always. + * The cache uses a static buffer and is persistent across transactions. + * If format-picture is bigger than cache buffer, parser is called always. * * NOTE for Number version: * All in this version is implemented as keywords ( => not used * suffixes), because a format picture is for *one* item (number) - * only. It not is as a datetime version, where each keyword (can) + * only. It not is as a timestamp version, where each keyword (can) * has suffix. * - * NOTE for DateTime version: - * In this modul is *not* used POSIX 'struct tm' type, but + * NOTE for Timestamp routines: + * In this module the POSIX 'struct tm' type is *not* used, but rather * PgSQL type, which has tm_mon based on one (*non* zero) and * year *not* based on 1900, but is used full year number. - * Modul support AC / BC years. + * Module supports AC / BC years. * * Supported types for to_char(): * - * Timestamp, DateTime, Numeric, int4, int8, float4, float8 + * Timestamp, Numeric, int4, int8, float4, float8 * * Supported types for reverse conversion: * - * Datetime - to_datetime() + * Timestamp - to_timestamp() * Date - to_date() * Numeric - to_number() * @@ -108,7 +108,7 @@ #define MAXDOUBLEWIDTH 128 /* ---------- - * External (defined in PgSQL dt.c (datetime utils)) + * External (defined in PgSQL dt.c (timestamp utils)) * ---------- */ extern char *months[], /* month abbreviation */ @@ -1377,14 +1377,14 @@ dch_time(int arg, char *inout, int suf, int flag, FormatNode *node) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout)-1; } else if (flag == FROM_CHAR) - elog(ERROR, "to_datatime()/to_timestamp(): SSSS is not supported"); + elog(ERROR, "to_datatime(): SSSS is not supported"); } return -1; } #define CHECK_SEQ_SEARCH(_l, _s) { \ if (_l <= 0) { \ - elog(ERROR, "to_datatime()/to_timestamp(): bad value for %s", _s); \ + elog(ERROR, "to_datatime(): bad value for %s", _s); \ } \ } @@ -1600,7 +1600,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node) return 1; } else if (flag == FROM_CHAR) - elog(ERROR, "to_datatime()/to_timestamp(): WW is not supported"); + elog(ERROR, "to_datatime(): WW is not supported"); case DCH_Q: if (flag == TO_CHAR) { sprintf(inout, "%d", (tm->tm_mon-1)/3+1); @@ -1611,7 +1611,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node) return 0; } else if (flag == FROM_CHAR) - elog(ERROR, "to_datatime()/to_timestamp(): Q is not supported"); + elog(ERROR, "to_datatime(): Q is not supported"); case DCH_CC: if (flag == TO_CHAR) { @@ -1625,7 +1625,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node) return strlen(p_inout)-1; } else if (flag == FROM_CHAR) - elog(ERROR, "to_datatime()/to_timestamp(): CC is not supported"); + elog(ERROR, "to_datatime(): CC is not supported"); case DCH_Y_YYY: if (flag == TO_CHAR) { i= YEAR_ABS(tm->tm_year) / 1000; @@ -1764,7 +1764,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node) return 0; } else if (flag == FROM_CHAR) - elog(ERROR, "to_datatime()/to_timestamp(): W is not supported"); + elog(ERROR, "to_datatime(): W is not supported"); case DCH_J: if (flag == TO_CHAR) { @@ -1773,7 +1773,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node) str_numth(p_inout, inout, S_TH_TYPE(suf)); return strlen(p_inout)-1; } else if (flag == FROM_CHAR) - elog(ERROR, "to_datatime()/to_timestamp(): J is not supported"); + elog(ERROR, "to_datatime(): J is not supported"); } return -1; } @@ -1783,11 +1783,11 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node) ***************************************************************************/ /* ------------------- - * DATETIME to_char() + * TIMESTAMP to_char() * ------------------- */ text * -datetime_to_char(DateTime *dt, text *fmt) +timestamp_to_char(Timestamp *dt, text *fmt) { static FormatNode CacheFormat[ DCH_CACHE_SIZE +1]; static char CacheStr[ DCH_CACHE_SIZE +1]; @@ -1814,14 +1814,14 @@ datetime_to_char(DateTime *dt, text *fmt) tm->tm_mday =1; tm->tm_isdst =0; tm->tm_mon =1; - if (DATETIME_IS_EPOCH(*dt)) + if (TIMESTAMP_IS_EPOCH(*dt)) { - datetime2tm(SetDateTime(*dt), NULL, tm, &fsec, NULL); - } else if (DATETIME_IS_CURRENT(*dt)) { - datetime2tm(SetDateTime(*dt), &tz, tm, &fsec, &tzn); + timestamp2tm(SetTimestamp(*dt), NULL, tm, &fsec, NULL); + } else if (TIMESTAMP_IS_CURRENT(*dt)) { + timestamp2tm(SetTimestamp(*dt), &tz, tm, &fsec, &tzn); } else { - if (datetime2tm(*dt, &tz, tm, &fsec, &tzn) != 0) - elog(ERROR, "to_char(): Unable to convert datetime to tm"); + if (timestamp2tm(*dt, &tz, tm, &fsec, &tzn) != 0) + elog(ERROR, "to_char(): Unable to convert timestamp to tm"); } tm->tm_wday = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + 1) % 7; @@ -1902,32 +1902,22 @@ datetime_to_char(DateTime *dt, text *fmt) } -/* ------------------- - * TIMESTAMP to_char() - * ------------------- - */ -text * -timestamp_to_char(time_t dt, text *fmt) -{ - return datetime_to_char( timestamp_datetime(dt), fmt); -} - /* --------------------- - * TO_DATETIME() + * TO_TIMESTAMP() * - * Make DateTime from date_str which is formated at argument 'fmt' - * ( to_datetime is reverse to_char() ) + * Make Timestamp from date_str which is formated at argument 'fmt' + * ( to_timestamp is reverse to_char() ) * --------------------- */ -DateTime * -to_datetime(text *date_str, text *fmt) +Timestamp * +to_timestamp(text *date_str, text *fmt) { static FormatNode CacheFormat[ DCH_CACHE_SIZE +1]; static char CacheStr[ DCH_CACHE_SIZE +1]; FormatNode *format; int flag=0; - DateTime *result; + Timestamp *result; char *str; int len=0, fsec=0, @@ -1942,7 +1932,7 @@ to_datetime(text *date_str, text *fmt) tm->tm_mday =1; tm->tm_isdst =0; tm->tm_mon =1; - result = palloc(sizeof(DateTime)); + result = palloc(sizeof(Timestamp)); len = VARSIZE(fmt) - VARHDRSZ; @@ -2060,8 +2050,8 @@ to_datetime(text *date_str, text *fmt) #ifdef DEBUG_TO_FROM_CHAR NOTICE_TM; #endif - if (tm2datetime(tm, fsec, &tz, result) != 0) - elog(ERROR, "to_datatime()/to_timestamp(): can't convert 'tm' to datetime."); + if (tm2timestamp(tm, fsec, &tz, result) != 0) + elog(ERROR, "to_datatime(): can't convert 'tm' to timestamp."); return result; } @@ -2074,18 +2064,7 @@ to_datetime(text *date_str, text *fmt) DateADT to_date(text *date_str, text *fmt) { - return datetime_date( to_datetime(date_str, fmt) ); -} - -/* ---------- - * TO_TIMESTAMP - * Make timestamp from date_str which is formated at argument 'fmt' - * ---------- - */ -time_t -to_timestamp(text *date_str, text *fmt) -{ - return datetime_timestamp( to_datetime(date_str, fmt) ); + return timestamp_date( to_timestamp(date_str, fmt) ); } /********************************************************************** |