1997-03-15 00:21:12 +01:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
1999-02-14 00:22:53 +01:00
|
|
|
* datetime.c
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
* Support functions for date/time types.
|
1997-03-15 00:21:12 +01:00
|
|
|
*
|
2002-06-20 22:29:54 +02:00
|
|
|
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
1997-03-15 00:21:12 +01:00
|
|
|
*
|
|
|
|
*
|
|
|
|
* IDENTIFICATION
|
2003-02-19 04:48:11 +01:00
|
|
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.100 2003/02/19 03:48:10 momjian Exp $
|
1997-03-15 00:21:12 +01:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
2000-07-13 00:59:15 +02:00
|
|
|
#include "postgres.h"
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
#include <ctype.h>
|
|
|
|
#include <errno.h>
|
1997-04-04 10:55:29 +02:00
|
|
|
#include <float.h>
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
#include <limits.h>
|
2003-01-16 01:26:49 +01:00
|
|
|
#include <math.h>
|
2000-07-13 00:59:15 +02:00
|
|
|
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
#include "miscadmin.h"
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
#include "utils/datetime.h"
|
2003-01-16 01:26:49 +01:00
|
|
|
#include "utils/guc.h"
|
1997-03-15 00:21:12 +01:00
|
|
|
|
2001-07-10 03:41:47 +02:00
|
|
|
|
2000-06-09 00:38:00 +02:00
|
|
|
static int DecodeNumber(int flen, char *field,
|
2001-10-25 07:50:21 +02:00
|
|
|
int fmask, int *tmask,
|
2002-04-21 21:52:18 +02:00
|
|
|
struct tm * tm, fsec_t *fsec, int *is2digits);
|
2000-06-09 00:38:00 +02:00
|
|
|
static int DecodeNumberField(int len, char *str,
|
2001-10-25 07:50:21 +02:00
|
|
|
int fmask, int *tmask,
|
2002-04-21 21:52:18 +02:00
|
|
|
struct tm * tm, fsec_t *fsec, int *is2digits);
|
2000-06-09 00:38:00 +02:00
|
|
|
static int DecodeTime(char *str, int fmask, int *tmask,
|
2002-04-21 21:52:18 +02:00
|
|
|
struct tm * tm, fsec_t *fsec);
|
2000-06-09 00:38:00 +02:00
|
|
|
static int DecodeTimezone(char *str, int *tzp);
|
|
|
|
static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel);
|
2001-03-22 05:01:46 +01:00
|
|
|
static int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm);
|
2000-04-12 19:17:23 +02:00
|
|
|
static int DecodePosixTimezone(char *str, int *val);
|
2003-01-16 01:26:49 +01:00
|
|
|
static void TrimTrailingZeros(char *str);
|
2000-03-16 15:38:42 +01:00
|
|
|
|
2001-07-10 03:41:47 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int day_tab[2][13] = {
|
|
|
|
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
|
2002-09-04 22:31:48 +02:00
|
|
|
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}};
|
1997-09-07 07:04:48 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
2002-09-04 22:31:48 +02:00
|
|
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL};
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
|
2002-09-04 22:31:48 +02:00
|
|
|
"Thursday", "Friday", "Saturday", NULL};
|
1997-09-07 07:04:48 +02:00
|
|
|
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/*****************************************************************************
|
|
|
|
* PRIVATE ROUTINES *
|
|
|
|
*****************************************************************************/
|
1997-03-15 00:21:12 +01:00
|
|
|
|
2002-08-04 08:44:47 +02:00
|
|
|
/*
|
|
|
|
* Definitions for squeezing values into "value"
|
|
|
|
* We set aside a high bit for a sign, and scale the timezone offsets
|
|
|
|
* in minutes by a factor of 15 (so can represent quarter-hour increments).
|
|
|
|
*/
|
2001-07-10 03:41:47 +02:00
|
|
|
#define ABS_SIGNBIT ((char) 0200)
|
|
|
|
#define VALMASK ((char) 0177)
|
2002-08-04 08:44:47 +02:00
|
|
|
#define POS(n) (n)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
#define NEG(n) ((n)|ABS_SIGNBIT)
|
|
|
|
#define SIGNEDCHAR(c) ((c)&ABS_SIGNBIT? -((c)&VALMASK): (c))
|
2002-08-04 08:44:47 +02:00
|
|
|
#define FROMVAL(tp) (-SIGNEDCHAR((tp)->value) * 15) /* uncompress */
|
|
|
|
#define TOVAL(tp, v) ((tp)->value = ((v) < 0? NEG((-(v))/15): POS(v)/15))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
|
|
|
/*
|
2003-01-16 01:26:49 +01:00
|
|
|
* datetktbl holds date/time keywords.
|
|
|
|
*
|
|
|
|
* Note that this table must be strictly alphabetically ordered to allow an
|
|
|
|
* O(ln(N)) search algorithm to be used.
|
2001-12-29 19:31:48 +01:00
|
|
|
*
|
2003-01-16 01:26:49 +01:00
|
|
|
* The text field is NOT guaranteed to be NULL-terminated.
|
2002-08-04 08:44:47 +02:00
|
|
|
*
|
2001-12-29 19:31:48 +01:00
|
|
|
* To keep this table reasonably small, we divide the lexval for TZ and DTZ
|
2002-08-04 08:44:47 +02:00
|
|
|
* entries by 15 (so they are on 15 minute boundaries) and truncate the text
|
2003-01-16 01:26:49 +01:00
|
|
|
* field at TOKMAXLEN characters.
|
2002-08-04 08:44:47 +02:00
|
|
|
* Formerly, we divided by 10 rather than 15 but there are a few time zones
|
|
|
|
* which are 30 or 45 minutes away from an even hour, most are on an hour
|
|
|
|
* boundary, and none on other boundaries.
|
2001-12-29 19:31:48 +01:00
|
|
|
*
|
|
|
|
* Let's include all strings from my current zinc time zone database.
|
|
|
|
* Not all of them are unique, or even very understandable, so we will
|
|
|
|
* leave some commented out for now.
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*/
|
|
|
|
static datetkn datetktbl[] = {
|
2001-09-28 10:09:14 +02:00
|
|
|
/* text, token, lexval */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{EARLY, RESERV, DTK_EARLY}, /* "-infinity" reserved for "early time" */
|
2003-01-16 01:26:49 +01:00
|
|
|
{"abstime", IGNORE_DTF, 0}, /* for pre-v6.1 "Invalid Abstime" */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"acsst", DTZ, POS(42)}, /* Cent. Australia */
|
|
|
|
{"acst", DTZ, NEG(16)}, /* Atlantic/Porto Acre */
|
|
|
|
{"act", TZ, NEG(20)}, /* Atlantic/Porto Acre */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{DA_D, ADBC, AD}, /* "ad" for years >= 0 */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"adt", DTZ, NEG(12)}, /* Atlantic Daylight Time */
|
|
|
|
{"aesst", DTZ, POS(44)}, /* E. Australia */
|
|
|
|
{"aest", TZ, POS(40)}, /* Australia Eastern Std Time */
|
|
|
|
{"aft", TZ, POS(18)}, /* Kabul */
|
|
|
|
{"ahst", TZ, NEG(40)}, /* Alaska-Hawaii Std Time */
|
|
|
|
{"akdt", DTZ, NEG(32)}, /* Alaska Daylight Time */
|
|
|
|
{"akst", DTZ, NEG(36)}, /* Alaska Standard Time */
|
2002-09-04 22:31:48 +02:00
|
|
|
{"allballs", RESERV, DTK_ZULU}, /* 00:00:00 */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"almst", TZ, POS(28)}, /* Almaty Savings Time */
|
2003-01-16 01:26:49 +01:00
|
|
|
{"almt", TZ, POS(24)}, /* Almaty Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"am", AMPM, AM},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"amst", DTZ, POS(20)}, /* Armenia Summer Time (Yerevan) */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-08-04 08:44:47 +02:00
|
|
|
{"amst", DTZ, NEG(12)}, /* Porto Velho */
|
2002-02-25 17:17:04 +01:00
|
|
|
#endif
|
2003-01-16 01:26:49 +01:00
|
|
|
{"amt", TZ, POS(16)}, /* Armenia Time (Yerevan) */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"anast", DTZ, POS(52)}, /* Anadyr Summer Time (Russia) */
|
|
|
|
{"anat", TZ, POS(48)}, /* Anadyr Time (Russia) */
|
2003-01-16 01:26:49 +01:00
|
|
|
{"apr", MONTH, 4},
|
|
|
|
{"april", MONTH, 4},
|
2002-02-25 17:17:04 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
aqtst
|
|
|
|
aqtt
|
|
|
|
arst
|
2002-02-25 17:17:04 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"art", TZ, NEG(12)}, /* Argentina Time */
|
2002-02-25 17:17:04 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
ashst
|
|
|
|
ast /* Atlantic Standard Time, Arabia Standard
|
|
|
|
* Time, Acre Standard Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"ast", TZ, NEG(16)}, /* Atlantic Std Time (Canada) */
|
|
|
|
{"at", IGNORE_DTF, 0}, /* "at" (throwaway) */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"aug", MONTH, 8},
|
|
|
|
{"august", MONTH, 8},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"awsst", DTZ, POS(36)}, /* W. Australia */
|
|
|
|
{"awst", TZ, POS(32)}, /* W. Australia */
|
|
|
|
{"awt", DTZ, NEG(12)},
|
|
|
|
{"azost", DTZ, POS(0)}, /* Azores Summer Time */
|
|
|
|
{"azot", TZ, NEG(4)}, /* Azores Time */
|
|
|
|
{"azst", DTZ, POS(20)}, /* Azerbaijan Summer Time */
|
|
|
|
{"azt", TZ, POS(16)}, /* Azerbaijan Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{DB_C, ADBC, BC}, /* "bc" for years < 0 */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"bdst", TZ, POS(8)}, /* British Double Summer Time */
|
|
|
|
{"bdt", TZ, POS(24)}, /* Dacca */
|
|
|
|
{"bnt", TZ, POS(32)}, /* Brunei Darussalam Time */
|
|
|
|
{"bort", TZ, POS(32)}, /* Borneo Time (Indonesia) */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
bortst
|
|
|
|
bost
|
2002-02-25 17:17:04 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"bot", TZ, NEG(16)}, /* Bolivia Time */
|
|
|
|
{"bra", TZ, NEG(12)}, /* Brazil Time */
|
2002-02-25 17:17:04 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
brst
|
|
|
|
brt
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"bst", DTZ, POS(4)}, /* British Summer Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-08-04 08:44:47 +02:00
|
|
|
{"bst", TZ, NEG(12)}, /* Brazil Standard Time */
|
|
|
|
{"bst", DTZ, NEG(44)}, /* Bering Summer Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"bt", TZ, POS(12)}, /* Baghdad Time */
|
|
|
|
{"btt", TZ, POS(24)}, /* Bhutan Time */
|
|
|
|
{"cadt", DTZ, POS(42)}, /* Central Australian DST */
|
|
|
|
{"cast", TZ, POS(38)}, /* Central Australian ST */
|
|
|
|
{"cat", TZ, NEG(40)}, /* Central Alaska Time */
|
|
|
|
{"cct", TZ, POS(32)}, /* China Coast Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-08-04 08:44:47 +02:00
|
|
|
{"cct", TZ, POS(26)}, /* Indian Cocos (Island) Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"cdt", DTZ, NEG(20)}, /* Central Daylight Time */
|
|
|
|
{"cest", DTZ, POS(8)}, /* Central European Dayl.Time */
|
2002-09-04 22:31:48 +02:00
|
|
|
{"cet", TZ, POS(4)}, /* Central European Time */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"cetdst", DTZ, POS(8)}, /* Central European Dayl.Time */
|
2002-09-04 22:31:48 +02:00
|
|
|
{"chadt", DTZ, POS(55)}, /* Chatham Island Daylight Time (13:45) */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"chast", TZ, POS(51)}, /* Chatham Island Time (12:45) */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
ckhst
|
2002-02-25 17:17:04 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"ckt", TZ, POS(48)}, /* Cook Islands Time */
|
|
|
|
{"clst", DTZ, NEG(12)}, /* Chile Summer Time */
|
|
|
|
{"clt", TZ, NEG(16)}, /* Chile Time */
|
2002-02-25 17:17:04 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
cost
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"cot", TZ, NEG(20)}, /* Columbia Time */
|
|
|
|
{"cst", TZ, NEG(24)}, /* Central Standard Time */
|
2003-01-16 01:26:49 +01:00
|
|
|
{DCURRENT, RESERV, DTK_CURRENT}, /* "current" is always now */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
cvst
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"cvt", TZ, POS(28)}, /* Christmas Island Time (Indian Ocean) */
|
|
|
|
{"cxt", TZ, POS(28)}, /* Christmas Island Time (Indian Ocean) */
|
2001-12-29 19:31:48 +01:00
|
|
|
{"d", UNITS, DTK_DAY}, /* "day of month" for ISO input */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"davt", TZ, POS(28)}, /* Davis Time (Antarctica) */
|
|
|
|
{"ddut", TZ, POS(40)}, /* Dumont-d'Urville Time (Antarctica) */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"dec", MONTH, 12},
|
|
|
|
{"december", MONTH, 12},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"dnt", TZ, POS(4)}, /* Dansk Normal Tid */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"dow", RESERV, DTK_DOW}, /* day of week */
|
|
|
|
{"doy", RESERV, DTK_DOY}, /* day of year */
|
|
|
|
{"dst", DTZMOD, 6},
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-08-04 08:44:47 +02:00
|
|
|
{"dusst", DTZ, POS(24)}, /* Dushanbe Summer Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"easst", DTZ, NEG(20)}, /* Easter Island Summer Time */
|
|
|
|
{"east", TZ, NEG(24)}, /* Easter Island Time */
|
|
|
|
{"eat", TZ, POS(12)}, /* East Africa Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-08-04 08:44:47 +02:00
|
|
|
{"east", DTZ, POS(16)}, /* Indian Antananarivo Savings Time */
|
|
|
|
{"eat", TZ, POS(12)}, /* Indian Antananarivo Time */
|
|
|
|
{"ect", TZ, NEG(16)}, /* Eastern Caribbean Time */
|
|
|
|
{"ect", TZ, NEG(20)}, /* Ecuador Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"edt", DTZ, NEG(16)}, /* Eastern Daylight Time */
|
|
|
|
{"eest", DTZ, POS(12)}, /* Eastern Europe Summer Time */
|
|
|
|
{"eet", TZ, POS(8)}, /* East. Europe, USSR Zone 1 */
|
|
|
|
{"eetdst", DTZ, POS(12)}, /* Eastern Europe Daylight Time */
|
|
|
|
{"egst", DTZ, POS(0)}, /* East Greenland Summer Time */
|
|
|
|
{"egt", TZ, NEG(4)}, /* East Greenland Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
ehdt
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{EPOCH, RESERV, DTK_EPOCH}, /* "epoch" reserved for system epoch time */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"est", TZ, NEG(20)}, /* Eastern Standard Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"feb", MONTH, 2},
|
|
|
|
{"february", MONTH, 2},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"fjst", DTZ, NEG(52)}, /* Fiji Summer Time (13 hour offset!) */
|
|
|
|
{"fjt", TZ, NEG(48)}, /* Fiji Time */
|
|
|
|
{"fkst", DTZ, NEG(12)}, /* Falkland Islands Summer Time */
|
|
|
|
{"fkt", TZ, NEG(8)}, /* Falkland Islands Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
fnst
|
|
|
|
fnt
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"fri", DOW, 5},
|
|
|
|
{"friday", DOW, 5},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"fst", TZ, POS(4)}, /* French Summer Time */
|
|
|
|
{"fwt", DTZ, POS(8)}, /* French Winter Time */
|
|
|
|
{"galt", TZ, NEG(24)}, /* Galapagos Time */
|
|
|
|
{"gamt", TZ, NEG(36)}, /* Gambier Time */
|
|
|
|
{"gest", DTZ, POS(20)}, /* Georgia Summer Time */
|
|
|
|
{"get", TZ, POS(16)}, /* Georgia Time */
|
|
|
|
{"gft", TZ, NEG(12)}, /* French Guiana Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
ghst
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"gilt", TZ, POS(48)}, /* Gilbert Islands Time */
|
|
|
|
{"gmt", TZ, POS(0)}, /* Greenwish Mean Time */
|
|
|
|
{"gst", TZ, POS(40)}, /* Guam Std Time, USSR Zone 9 */
|
|
|
|
{"gyt", TZ, NEG(16)}, /* Guyana Time */
|
2001-12-29 19:31:48 +01:00
|
|
|
{"h", UNITS, DTK_HOUR}, /* "hour" */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
hadt
|
|
|
|
hast
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"hdt", DTZ, NEG(36)}, /* Hawaii/Alaska Daylight Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
hkst
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"hkt", TZ, POS(32)}, /* Hong Kong Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-08-04 08:44:47 +02:00
|
|
|
{"hmt", TZ, POS(12)}, /* Hellas ? ? */
|
2002-09-04 22:31:48 +02:00
|
|
|
hovst
|
|
|
|
hovt
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"hst", TZ, NEG(40)}, /* Hawaii Std Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
hwt
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"ict", TZ, POS(28)}, /* Indochina Time */
|
|
|
|
{"idle", TZ, POS(48)}, /* Intl. Date Line, East */
|
|
|
|
{"idlw", TZ, NEG(48)}, /* Intl. Date Line, West */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
idt /* Israeli, Iran, Indian Daylight Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{LATE, RESERV, DTK_LATE}, /* "infinity" reserved for "late time" */
|
2002-09-04 22:31:48 +02:00
|
|
|
{INVALID, RESERV, DTK_INVALID}, /* "invalid" reserved for bad time */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"iot", TZ, POS(20)}, /* Indian Chagos Time */
|
|
|
|
{"irkst", DTZ, POS(36)}, /* Irkutsk Summer Time */
|
|
|
|
{"irkt", TZ, POS(32)}, /* Irkutsk Time */
|
|
|
|
{"irt", TZ, POS(14)}, /* Iran Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
isst
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"ist", TZ, POS(8)}, /* Israel */
|
|
|
|
{"it", TZ, POS(14)}, /* Iran Time */
|
2001-12-29 19:31:48 +01:00
|
|
|
{"j", UNITS, DTK_JULIAN},
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"jan", MONTH, 1},
|
|
|
|
{"january", MONTH, 1},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"javt", TZ, POS(28)}, /* Java Time (07:00? see JT) */
|
|
|
|
{"jayt", TZ, POS(36)}, /* Jayapura Time (Indonesia) */
|
2001-12-29 19:31:48 +01:00
|
|
|
{"jd", UNITS, DTK_JULIAN},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"jst", TZ, POS(36)}, /* Japan Std Time,USSR Zone 8 */
|
|
|
|
{"jt", TZ, POS(30)}, /* Java Time (07:30? see JAVT) */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"jul", MONTH, 7},
|
2001-12-29 19:31:48 +01:00
|
|
|
{"julian", UNITS, DTK_JULIAN},
|
2001-12-21 07:03:27 +01:00
|
|
|
{"july", MONTH, 7},
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"jun", MONTH, 6},
|
|
|
|
{"june", MONTH, 6},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"kdt", DTZ, POS(40)}, /* Korea Daylight Time */
|
|
|
|
{"kgst", DTZ, POS(24)}, /* Kyrgyzstan Summer Time */
|
|
|
|
{"kgt", TZ, POS(20)}, /* Kyrgyzstan Time */
|
|
|
|
{"kost", TZ, POS(48)}, /* Kosrae Time */
|
|
|
|
{"krast", DTZ, POS(28)}, /* Krasnoyarsk Summer Time */
|
|
|
|
{"krat", TZ, POS(32)}, /* Krasnoyarsk Standard Time */
|
|
|
|
{"kst", TZ, POS(36)}, /* Korea Standard Time */
|
|
|
|
{"lhdt", DTZ, POS(44)}, /* Lord Howe Daylight Time, Australia */
|
|
|
|
{"lhst", TZ, POS(42)}, /* Lord Howe Standard Time, Australia */
|
|
|
|
{"ligt", TZ, POS(40)}, /* From Melbourne, Australia */
|
2002-09-04 22:31:48 +02:00
|
|
|
{"lint", TZ, POS(56)}, /* Line Islands Time (Kiribati; +14
|
|
|
|
* hours!) */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"lkt", TZ, POS(24)}, /* Lanka Time */
|
2001-12-29 19:31:48 +01:00
|
|
|
{"m", UNITS, DTK_MONTH}, /* "month" for ISO input */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"magst", DTZ, POS(48)}, /* Magadan Summer Time */
|
|
|
|
{"magt", TZ, POS(44)}, /* Magadan Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"mar", MONTH, 3},
|
|
|
|
{"march", MONTH, 3},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"mart", TZ, NEG(38)}, /* Marquesas Time */
|
|
|
|
{"mawt", TZ, POS(24)}, /* Mawson, Antarctica */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"may", MONTH, 5},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"mdt", DTZ, NEG(24)}, /* Mountain Daylight Time */
|
|
|
|
{"mest", DTZ, POS(8)}, /* Middle Europe Summer Time */
|
|
|
|
{"met", TZ, POS(4)}, /* Middle Europe Time */
|
|
|
|
{"metdst", DTZ, POS(8)}, /* Middle Europe Daylight Time */
|
|
|
|
{"mewt", TZ, POS(4)}, /* Middle Europe Winter Time */
|
|
|
|
{"mez", TZ, POS(4)}, /* Middle Europe Zone */
|
|
|
|
{"mht", TZ, POS(48)}, /* Kwajalein */
|
2001-12-29 19:31:48 +01:00
|
|
|
{"mm", UNITS, DTK_MINUTE}, /* "minute" for ISO input */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"mmt", TZ, POS(26)}, /* Myannar Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"mon", DOW, 1},
|
|
|
|
{"monday", DOW, 1},
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
most
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"mpt", TZ, POS(40)}, /* North Mariana Islands Time */
|
|
|
|
{"msd", DTZ, POS(16)}, /* Moscow Summer Time */
|
|
|
|
{"msk", TZ, POS(12)}, /* Moscow Time */
|
|
|
|
{"mst", TZ, NEG(28)}, /* Mountain Standard Time */
|
|
|
|
{"mt", TZ, POS(34)}, /* Moluccas Time */
|
|
|
|
{"mut", TZ, POS(16)}, /* Mauritius Island Time */
|
|
|
|
{"mvt", TZ, POS(20)}, /* Maldives Island Time */
|
|
|
|
{"myt", TZ, POS(32)}, /* Malaysia Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
ncst
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"nct", TZ, POS(44)}, /* New Caledonia Time */
|
|
|
|
{"ndt", DTZ, NEG(10)}, /* Nfld. Daylight Time */
|
|
|
|
{"nft", TZ, NEG(14)}, /* Newfoundland Standard Time */
|
|
|
|
{"nor", TZ, POS(4)}, /* Norway Standard Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"nov", MONTH, 11},
|
|
|
|
{"november", MONTH, 11},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"novst", DTZ, POS(28)}, /* Novosibirsk Summer Time */
|
|
|
|
{"novt", TZ, POS(24)}, /* Novosibirsk Standard Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{NOW, RESERV, DTK_NOW}, /* current transaction time */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"npt", TZ, POS(23)}, /* Nepal Standard Time (GMT-5:45) */
|
|
|
|
{"nst", TZ, NEG(14)}, /* Nfld. Standard Time */
|
|
|
|
{"nt", TZ, NEG(44)}, /* Nome Time */
|
|
|
|
{"nut", TZ, NEG(44)}, /* Niue Time */
|
|
|
|
{"nzdt", DTZ, POS(52)}, /* New Zealand Daylight Time */
|
|
|
|
{"nzst", TZ, POS(48)}, /* New Zealand Standard Time */
|
|
|
|
{"nzt", TZ, POS(48)}, /* New Zealand Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"oct", MONTH, 10},
|
|
|
|
{"october", MONTH, 10},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"omsst", DTZ, POS(28)}, /* Omsk Summer Time */
|
|
|
|
{"omst", TZ, POS(24)}, /* Omsk Time */
|
|
|
|
{"on", IGNORE_DTF, 0}, /* "on" (throwaway) */
|
|
|
|
{"pdt", DTZ, NEG(28)}, /* Pacific Daylight Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
pest
|
2002-02-25 17:17:04 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"pet", TZ, NEG(20)}, /* Peru Time */
|
|
|
|
{"petst", DTZ, POS(52)}, /* Petropavlovsk-Kamchatski Summer Time */
|
|
|
|
{"pett", TZ, POS(48)}, /* Petropavlovsk-Kamchatski Time */
|
|
|
|
{"pgt", TZ, POS(40)}, /* Papua New Guinea Time */
|
|
|
|
{"phot", TZ, POS(52)}, /* Phoenix Islands (Kiribati) Time */
|
2002-02-25 17:17:04 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
phst
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"pht", TZ, POS(32)}, /* Phillipine Time */
|
|
|
|
{"pkt", TZ, POS(20)}, /* Pakistan Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"pm", AMPM, PM},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"pmdt", DTZ, NEG(8)}, /* Pierre & Miquelon Daylight Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
pmst
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"pont", TZ, POS(44)}, /* Ponape Time (Micronesia) */
|
|
|
|
{"pst", TZ, NEG(32)}, /* Pacific Standard Time */
|
|
|
|
{"pwt", TZ, POS(36)}, /* Palau Time */
|
|
|
|
{"pyst", DTZ, NEG(12)}, /* Paraguay Summer Time */
|
|
|
|
{"pyt", TZ, NEG(16)}, /* Paraguay Time */
|
|
|
|
{"ret", DTZ, POS(16)}, /* Reunion Island Time */
|
2001-12-29 19:31:48 +01:00
|
|
|
{"s", UNITS, DTK_SECOND}, /* "seconds" for ISO input */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"sadt", DTZ, POS(42)}, /* S. Australian Dayl. Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
samst
|
|
|
|
samt
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"sast", TZ, POS(38)}, /* South Australian Std Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"sat", DOW, 6},
|
|
|
|
{"saturday", DOW, 6},
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
sbt
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"sct", DTZ, POS(16)}, /* Mahe Island Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"sep", MONTH, 9},
|
|
|
|
{"sept", MONTH, 9},
|
|
|
|
{"september", MONTH, 9},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"set", TZ, NEG(4)}, /* Seychelles Time ?? */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
sgt
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"sst", DTZ, POS(8)}, /* Swedish Summer Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"sun", DOW, 0},
|
|
|
|
{"sunday", DOW, 0},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"swt", TZ, POS(4)}, /* Swedish Winter Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
syot
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-02-25 17:17:04 +01:00
|
|
|
{"t", ISOTIME, DTK_TIME}, /* Filler for ISO time fields */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"tft", TZ, POS(20)}, /* Kerguelen Time */
|
2003-01-16 01:26:49 +01:00
|
|
|
{"that", TZ, NEG(40)}, /* Tahiti Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"thu", DOW, 4},
|
|
|
|
{"thur", DOW, 4},
|
|
|
|
{"thurs", DOW, 4},
|
|
|
|
{"thursday", DOW, 4},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"tjt", TZ, POS(20)}, /* Tajikistan Time */
|
|
|
|
{"tkt", TZ, NEG(40)}, /* Tokelau Time */
|
|
|
|
{"tmt", TZ, POS(20)}, /* Turkmenistan Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{TODAY, RESERV, DTK_TODAY}, /* midnight */
|
|
|
|
{TOMORROW, RESERV, DTK_TOMORROW}, /* tomorrow midnight */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
tost
|
2002-02-25 17:17:04 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"tot", TZ, POS(52)}, /* Tonga Time */
|
2002-02-25 17:17:04 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
tpt
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"truk", TZ, POS(40)}, /* Truk Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"tue", DOW, 2},
|
|
|
|
{"tues", DOW, 2},
|
|
|
|
{"tuesday", DOW, 2},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"tvt", TZ, POS(48)}, /* Tuvalu Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
uct
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"ulast", DTZ, POS(36)}, /* Ulan Bator Summer Time */
|
|
|
|
{"ulat", TZ, POS(32)}, /* Ulan Bator Time */
|
2000-11-06 16:57:00 +01:00
|
|
|
{"undefined", RESERV, DTK_INVALID}, /* pre-v6.1 invalid time */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"ut", TZ, POS(0)},
|
|
|
|
{"utc", TZ, POS(0)},
|
|
|
|
{"uyst", DTZ, NEG(8)}, /* Uruguay Summer Time */
|
|
|
|
{"uyt", TZ, NEG(12)}, /* Uruguay Time */
|
|
|
|
{"uzst", DTZ, POS(24)}, /* Uzbekistan Summer Time */
|
|
|
|
{"uzt", TZ, POS(20)}, /* Uzbekistan Time */
|
|
|
|
{"vet", TZ, NEG(16)}, /* Venezuela Time */
|
|
|
|
{"vlast", DTZ, POS(44)}, /* Vladivostok Summer Time */
|
|
|
|
{"vlat", TZ, POS(40)}, /* Vladivostok Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
vust
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"vut", TZ, POS(44)}, /* Vanuata Time */
|
|
|
|
{"wadt", DTZ, POS(32)}, /* West Australian DST */
|
|
|
|
{"wakt", TZ, POS(48)}, /* Wake Time */
|
2001-11-21 06:58:51 +01:00
|
|
|
#if 0
|
2002-09-04 22:31:48 +02:00
|
|
|
warst
|
2001-11-21 06:58:51 +01:00
|
|
|
#endif
|
2002-08-04 08:44:47 +02:00
|
|
|
{"wast", TZ, POS(28)}, /* West Australian Std Time */
|
|
|
|
{"wat", TZ, NEG(4)}, /* West Africa Time */
|
|
|
|
{"wdt", DTZ, POS(36)}, /* West Australian DST */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"wed", DOW, 3},
|
|
|
|
{"wednesday", DOW, 3},
|
|
|
|
{"weds", DOW, 3},
|
2002-08-04 08:44:47 +02:00
|
|
|
{"west", DTZ, POS(4)}, /* Western Europe Summer Time */
|
|
|
|
{"wet", TZ, POS(0)}, /* Western Europe */
|
|
|
|
{"wetdst", DTZ, POS(4)}, /* Western Europe Daylight Savings Time */
|
|
|
|
{"wft", TZ, POS(48)}, /* Wallis and Futuna Time */
|
|
|
|
{"wgst", DTZ, NEG(8)}, /* West Greenland Summer Time */
|
|
|
|
{"wgt", TZ, NEG(12)}, /* West Greenland Time */
|
|
|
|
{"wst", TZ, POS(32)}, /* West Australian Standard Time */
|
2001-12-29 19:31:48 +01:00
|
|
|
{"y", UNITS, DTK_YEAR}, /* "year" for ISO input */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"yakst", DTZ, POS(40)}, /* Yakutsk Summer Time */
|
|
|
|
{"yakt", TZ, POS(36)}, /* Yakutsk Time */
|
|
|
|
{"yapt", TZ, POS(40)}, /* Yap Time (Micronesia) */
|
|
|
|
{"ydt", DTZ, NEG(32)}, /* Yukon Daylight Time */
|
|
|
|
{"yekst", DTZ, POS(24)}, /* Yekaterinburg Summer Time */
|
|
|
|
{"yekt", TZ, POS(20)}, /* Yekaterinburg Time */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{YESTERDAY, RESERV, DTK_YESTERDAY}, /* yesterday midnight */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"yst", TZ, NEG(36)}, /* Yukon Standard Time */
|
|
|
|
{"z", TZ, POS(0)}, /* time zone tag per ISO-8601 */
|
|
|
|
{"zp4", TZ, NEG(16)}, /* UTC +4 hours. */
|
|
|
|
{"zp5", TZ, NEG(20)}, /* UTC +5 hours. */
|
|
|
|
{"zp6", TZ, NEG(24)}, /* UTC +6 hours. */
|
|
|
|
{ZULU, TZ, POS(0)}, /* UTC */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
static unsigned int szdatetktbl = sizeof datetktbl / sizeof datetktbl[0];
|
|
|
|
|
2001-06-18 18:14:44 +02:00
|
|
|
/* Used for SET australian_timezones to override North American ones */
|
|
|
|
static datetkn australian_datetktbl[] = {
|
2002-08-04 08:44:47 +02:00
|
|
|
{"acst", TZ, POS(38)}, /* Cent. Australia */
|
|
|
|
{"cst", TZ, POS(42)}, /* Australia Central Std Time */
|
|
|
|
{"east", TZ, POS(40)}, /* East Australian Std Time */
|
|
|
|
{"est", TZ, POS(40)}, /* Australia Eastern Std Time */
|
|
|
|
{"sat", TZ, POS(38)},
|
2001-06-18 18:14:44 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
static unsigned int australian_szdatetktbl = sizeof australian_datetktbl /
|
2001-10-25 07:50:21 +02:00
|
|
|
sizeof australian_datetktbl[0];
|
2001-06-18 18:14:44 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
static datetkn deltatktbl[] = {
|
2001-10-18 19:30:21 +02:00
|
|
|
/* text, token, lexval */
|
2002-08-04 08:44:47 +02:00
|
|
|
{"@", IGNORE_DTF, 0}, /* postgres relative prefix */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{DAGO, AGO, 0}, /* "ago" indicates negative time offset */
|
2001-10-18 19:30:21 +02:00
|
|
|
{"c", UNITS, DTK_CENTURY}, /* "century" relative */
|
|
|
|
{"cent", UNITS, DTK_CENTURY}, /* "century" relative */
|
|
|
|
{"centuries", UNITS, DTK_CENTURY}, /* "centuries" relative */
|
|
|
|
{DCENTURY, UNITS, DTK_CENTURY}, /* "century" relative */
|
2001-10-25 07:50:21 +02:00
|
|
|
{"d", UNITS, DTK_DAY}, /* "day" relative */
|
|
|
|
{DDAY, UNITS, DTK_DAY}, /* "day" relative */
|
|
|
|
{"days", UNITS, DTK_DAY}, /* "days" relative */
|
|
|
|
{"dec", UNITS, DTK_DECADE}, /* "decade" relative */
|
2002-09-04 22:31:48 +02:00
|
|
|
{DDECADE, UNITS, DTK_DECADE}, /* "decade" relative */
|
|
|
|
{"decades", UNITS, DTK_DECADE}, /* "decades" relative */
|
2003-01-16 01:26:49 +01:00
|
|
|
{"decs", UNITS, DTK_DECADE}, /* "decades" relative */
|
2001-10-25 07:50:21 +02:00
|
|
|
{"h", UNITS, DTK_HOUR}, /* "hour" relative */
|
|
|
|
{DHOUR, UNITS, DTK_HOUR}, /* "hour" relative */
|
|
|
|
{"hours", UNITS, DTK_HOUR}, /* "hours" relative */
|
|
|
|
{"hr", UNITS, DTK_HOUR}, /* "hour" relative */
|
|
|
|
{"hrs", UNITS, DTK_HOUR}, /* "hours" relative */
|
2002-09-04 22:31:48 +02:00
|
|
|
{INVALID, RESERV, DTK_INVALID}, /* reserved for invalid time */
|
2001-10-25 07:50:21 +02:00
|
|
|
{"m", UNITS, DTK_MINUTE}, /* "minute" relative */
|
2002-09-04 22:31:48 +02:00
|
|
|
{"microsecon", UNITS, DTK_MICROSEC}, /* "microsecond" relative */
|
|
|
|
{"mil", UNITS, DTK_MILLENNIUM}, /* "millennium" relative */
|
|
|
|
{"millennia", UNITS, DTK_MILLENNIUM}, /* "millennia" relative */
|
|
|
|
{DMILLENNIUM, UNITS, DTK_MILLENNIUM}, /* "millennium" relative */
|
|
|
|
{"millisecon", UNITS, DTK_MILLISEC}, /* relative */
|
|
|
|
{"mils", UNITS, DTK_MILLENNIUM}, /* "millennia" relative */
|
|
|
|
{"min", UNITS, DTK_MINUTE}, /* "minute" relative */
|
2001-10-28 07:26:15 +01:00
|
|
|
{"mins", UNITS, DTK_MINUTE}, /* "minutes" relative */
|
2001-10-18 19:30:21 +02:00
|
|
|
{DMINUTE, UNITS, DTK_MINUTE}, /* "minute" relative */
|
|
|
|
{"minutes", UNITS, DTK_MINUTE}, /* "minutes" relative */
|
2001-10-25 07:50:21 +02:00
|
|
|
{"mon", UNITS, DTK_MONTH}, /* "months" relative */
|
|
|
|
{"mons", UNITS, DTK_MONTH}, /* "months" relative */
|
|
|
|
{DMONTH, UNITS, DTK_MONTH}, /* "month" relative */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"months", UNITS, DTK_MONTH},
|
|
|
|
{"ms", UNITS, DTK_MILLISEC},
|
|
|
|
{"msec", UNITS, DTK_MILLISEC},
|
|
|
|
{DMILLISEC, UNITS, DTK_MILLISEC},
|
|
|
|
{"mseconds", UNITS, DTK_MILLISEC},
|
|
|
|
{"msecs", UNITS, DTK_MILLISEC},
|
2001-10-28 07:26:15 +01:00
|
|
|
{"qtr", UNITS, DTK_QUARTER}, /* "quarter" relative */
|
2002-09-04 22:31:48 +02:00
|
|
|
{DQUARTER, UNITS, DTK_QUARTER}, /* "quarter" relative */
|
|
|
|
{"reltime", IGNORE_DTF, 0}, /* pre-v6.1 "Undefined Reltime" */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"s", UNITS, DTK_SECOND},
|
|
|
|
{"sec", UNITS, DTK_SECOND},
|
|
|
|
{DSECOND, UNITS, DTK_SECOND},
|
|
|
|
{"seconds", UNITS, DTK_SECOND},
|
|
|
|
{"secs", UNITS, DTK_SECOND},
|
2002-09-04 22:31:48 +02:00
|
|
|
{DTIMEZONE, UNITS, DTK_TZ}, /* "timezone" time offset */
|
2001-10-25 07:50:21 +02:00
|
|
|
{"timezone_h", UNITS, DTK_TZ_HOUR}, /* timezone hour units */
|
2002-09-04 22:31:48 +02:00
|
|
|
{"timezone_m", UNITS, DTK_TZ_MINUTE}, /* timezone minutes units */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{"undefined", RESERV, DTK_INVALID}, /* pre-v6.1 invalid time */
|
2002-09-04 22:31:48 +02:00
|
|
|
{"us", UNITS, DTK_MICROSEC}, /* "microsecond" relative */
|
2001-10-18 19:30:21 +02:00
|
|
|
{"usec", UNITS, DTK_MICROSEC}, /* "microsecond" relative */
|
|
|
|
{DMICROSEC, UNITS, DTK_MICROSEC}, /* "microsecond" relative */
|
|
|
|
{"useconds", UNITS, DTK_MICROSEC}, /* "microseconds" relative */
|
|
|
|
{"usecs", UNITS, DTK_MICROSEC}, /* "microseconds" relative */
|
|
|
|
{"w", UNITS, DTK_WEEK}, /* "week" relative */
|
|
|
|
{DWEEK, UNITS, DTK_WEEK}, /* "week" relative */
|
|
|
|
{"weeks", UNITS, DTK_WEEK}, /* "weeks" relative */
|
|
|
|
{"y", UNITS, DTK_YEAR}, /* "year" relative */
|
|
|
|
{DYEAR, UNITS, DTK_YEAR}, /* "year" relative */
|
|
|
|
{"years", UNITS, DTK_YEAR}, /* "years" relative */
|
|
|
|
{"yr", UNITS, DTK_YEAR}, /* "year" relative */
|
|
|
|
{"yrs", UNITS, DTK_YEAR}, /* "years" relative */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
static unsigned int szdeltatktbl = sizeof deltatktbl / sizeof deltatktbl[0];
|
|
|
|
|
2003-01-16 01:26:49 +01:00
|
|
|
static datetkn *datecache[MAXDATEFIELDS] = {NULL};
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2003-01-16 01:26:49 +01:00
|
|
|
static datetkn *deltacache[MAXDATEFIELDS] = {NULL};
|
1997-03-15 00:21:12 +01:00
|
|
|
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/*
|
|
|
|
* Calendar time to Julian date conversions.
|
|
|
|
* Julian date is commonly used in astronomical applications,
|
|
|
|
* since it is numerically accurate and computationally simple.
|
|
|
|
* The algorithms here will accurately convert between Julian day
|
|
|
|
* and calendar date for all non-negative Julian days
|
2003-02-19 04:48:11 +01:00
|
|
|
* (i.e. from Nov 24, -4713 on).
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*
|
2001-09-28 10:09:14 +02:00
|
|
|
* These routines will be used by other date/time packages
|
|
|
|
* - thomas 97/02/25
|
2003-02-19 04:48:11 +01:00
|
|
|
*
|
|
|
|
* Rewritten to eliminate overflow problems. This now allows the
|
|
|
|
* routines to work correctly for all Julian day counts from
|
|
|
|
* 0 to 2147483647 (Nov 24, -4713 to Jun 3, 5874898) assuming
|
|
|
|
* a 32-bit integer. Longer types should also work to the limits
|
|
|
|
* of their precision.
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*/
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int
|
|
|
|
date2j(int y, int m, int d)
|
1997-03-15 00:21:12 +01:00
|
|
|
{
|
2003-02-19 04:48:11 +01:00
|
|
|
int julian;
|
|
|
|
int century;
|
|
|
|
|
|
|
|
if (m > 2) {
|
|
|
|
m += 1;
|
|
|
|
y += 4800;
|
|
|
|
} else {
|
|
|
|
m += 13;
|
|
|
|
y += 4799;
|
|
|
|
}
|
|
|
|
|
|
|
|
century = y/100;
|
|
|
|
julian = y*365 - 32167;
|
|
|
|
julian += y/4 - century + century/4;
|
|
|
|
julian += 7834*m/256 + d;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
2003-02-19 04:48:11 +01:00
|
|
|
return julian;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
} /* date2j() */
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
void
|
|
|
|
j2date(int jd, int *year, int *month, int *day)
|
1997-03-15 00:21:12 +01:00
|
|
|
{
|
2003-02-19 04:48:11 +01:00
|
|
|
unsigned int julian;
|
|
|
|
unsigned int quad;
|
|
|
|
unsigned int extra;
|
|
|
|
int y;
|
|
|
|
|
|
|
|
julian = jd;
|
|
|
|
julian += 32044;
|
|
|
|
quad = julian/146097;
|
|
|
|
extra = (julian - quad*146097)*4 + 3;
|
|
|
|
julian += 60 + quad*3 + extra/146097;
|
|
|
|
quad = julian/1461;
|
|
|
|
julian -= quad*1461;
|
|
|
|
y = julian * 4 / 1461;
|
|
|
|
julian = ((y != 0) ? ((julian + 305) % 365) : ((julian + 306) % 366))
|
|
|
|
+ 123;
|
|
|
|
y += quad*4;
|
|
|
|
*year = y - 4800;
|
|
|
|
quad = julian * 2141 / 65536;
|
|
|
|
*day = julian - 7834*quad/256;
|
|
|
|
*month = (quad + 10) % 12 + 1;
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return;
|
|
|
|
} /* j2date() */
|
1997-03-15 00:21:12 +01:00
|
|
|
|
|
|
|
int
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
j2day(int date)
|
1997-03-15 00:21:12 +01:00
|
|
|
{
|
2003-02-19 04:48:11 +01:00
|
|
|
unsigned int day;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2003-02-19 04:48:11 +01:00
|
|
|
day = date;
|
|
|
|
day += 1;
|
|
|
|
day %= 7;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
2003-02-19 04:48:11 +01:00
|
|
|
return (int) day;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
} /* j2day() */
|
|
|
|
|
|
|
|
|
2001-10-20 03:02:22 +02:00
|
|
|
/* TrimTrailingZeros()
|
|
|
|
* ... resulting from printing numbers with full precision.
|
|
|
|
*/
|
2003-01-16 01:26:49 +01:00
|
|
|
static void
|
2001-10-18 19:30:21 +02:00
|
|
|
TrimTrailingZeros(char *str)
|
|
|
|
{
|
2001-10-25 07:50:21 +02:00
|
|
|
int len = strlen(str);
|
2001-10-18 19:30:21 +02:00
|
|
|
|
2001-10-20 03:02:22 +02:00
|
|
|
#if 0
|
2001-10-18 19:30:21 +02:00
|
|
|
/* chop off trailing one to cope with interval rounding */
|
|
|
|
if (strcmp((str + len - 4), "0001") == 0)
|
|
|
|
{
|
|
|
|
len -= 4;
|
|
|
|
*(str + len) = '\0';
|
|
|
|
}
|
2001-10-20 03:02:22 +02:00
|
|
|
#endif
|
2001-10-18 19:30:21 +02:00
|
|
|
|
2003-01-29 02:08:42 +01:00
|
|
|
/* chop off trailing zeros... but leave at least 2 fractional digits */
|
2001-10-18 19:30:21 +02:00
|
|
|
while ((*(str + len - 1) == '0')
|
|
|
|
&& (*(str + len - 3) != '.'))
|
|
|
|
{
|
|
|
|
len--;
|
|
|
|
*(str + len) = '\0';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* ParseDateTime()
|
|
|
|
* Break string into tokens based on a date/time context.
|
2001-12-29 19:31:48 +01:00
|
|
|
* Several field types are assigned:
|
2002-09-04 22:31:48 +02:00
|
|
|
* DTK_NUMBER - digits and (possibly) a decimal point
|
|
|
|
* DTK_DATE - digits and two delimiters, or digits and text
|
|
|
|
* DTK_TIME - digits, colon delimiters, and possibly a decimal point
|
|
|
|
* DTK_STRING - text (no digits)
|
|
|
|
* DTK_SPECIAL - leading "+" or "-" followed by text
|
|
|
|
* DTK_TZ - leading "+" or "-" followed by digits
|
2001-12-29 19:31:48 +01:00
|
|
|
* Note that some field types can hold unexpected items:
|
2002-09-04 22:31:48 +02:00
|
|
|
* DTK_NUMBER can hold date fields (yy.ddd)
|
|
|
|
* DTK_STRING can hold months (January) and time zones (PST)
|
|
|
|
* DTK_DATE can hold Posix time zones (GMT-8)
|
1997-10-25 07:16:09 +02:00
|
|
|
*/
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int
|
|
|
|
ParseDateTime(char *timestr, char *lowstr,
|
|
|
|
char **field, int *ftype, int maxfields, int *numfields)
|
1997-03-15 00:21:12 +01:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int nf = 0;
|
|
|
|
char *cp = timestr;
|
|
|
|
char *lp = lowstr;
|
|
|
|
|
|
|
|
/* outer loop through fields */
|
|
|
|
while (*cp != '\0')
|
|
|
|
{
|
|
|
|
field[nf] = lp;
|
|
|
|
|
|
|
|
/* leading digit? then date or time */
|
2001-12-29 19:31:48 +01:00
|
|
|
if (isdigit((unsigned char) *cp))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
*lp++ = *cp++;
|
2000-12-03 21:45:40 +01:00
|
|
|
while (isdigit((unsigned char) *cp))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*lp++ = *cp++;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* time field? */
|
|
|
|
if (*cp == ':')
|
|
|
|
{
|
|
|
|
ftype[nf] = DTK_TIME;
|
2001-09-28 10:09:14 +02:00
|
|
|
*lp++ = *cp++;
|
2000-12-03 21:45:40 +01:00
|
|
|
while (isdigit((unsigned char) *cp) ||
|
|
|
|
(*cp == ':') || (*cp == '.'))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*lp++ = *cp++;
|
|
|
|
}
|
|
|
|
/* date field? allow embedded text month */
|
|
|
|
else if ((*cp == '-') || (*cp == '/') || (*cp == '.'))
|
|
|
|
{
|
2001-12-29 19:31:48 +01:00
|
|
|
/* save delimiting character to use later */
|
2002-09-04 22:31:48 +02:00
|
|
|
char *dp = cp;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
2001-09-28 10:09:14 +02:00
|
|
|
*lp++ = *cp++;
|
|
|
|
/* second field is all digits? then no embedded text month */
|
|
|
|
if (isdigit((unsigned char) *cp))
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
ftype[nf] = ((*dp == '.') ? DTK_NUMBER : DTK_DATE);
|
2001-12-29 19:31:48 +01:00
|
|
|
while (isdigit((unsigned char) *cp))
|
2001-09-28 10:09:14 +02:00
|
|
|
*lp++ = *cp++;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* insist that the delimiters match to get a
|
|
|
|
* three-field date.
|
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
if (*cp == *dp)
|
|
|
|
{
|
|
|
|
ftype[nf] = DTK_DATE;
|
|
|
|
*lp++ = *cp++;
|
|
|
|
while (isdigit((unsigned char) *cp) || (*cp == *dp))
|
|
|
|
*lp++ = *cp++;
|
|
|
|
}
|
2001-09-28 10:09:14 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-12-29 19:31:48 +01:00
|
|
|
ftype[nf] = DTK_DATE;
|
|
|
|
while (isalnum((unsigned char) *cp) || (*cp == *dp))
|
2001-09-28 10:09:14 +02:00
|
|
|
*lp++ = tolower((unsigned char) *cp++);
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
2002-09-04 22:31:48 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* otherwise, number only and will determine year, month, day,
|
|
|
|
* or concatenated fields later...
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*/
|
|
|
|
else
|
|
|
|
ftype[nf] = DTK_NUMBER;
|
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* Leading decimal point? Then fractional seconds... */
|
|
|
|
else if (*cp == '.')
|
|
|
|
{
|
|
|
|
*lp++ = *cp++;
|
|
|
|
while (isdigit((unsigned char) *cp))
|
|
|
|
*lp++ = *cp++;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
ftype[nf] = DTK_NUMBER;
|
|
|
|
}
|
2002-09-04 22:31:48 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/*
|
|
|
|
* text? then date string, month, day of week, special, or
|
|
|
|
* timezone
|
|
|
|
*/
|
2000-12-03 21:45:40 +01:00
|
|
|
else if (isalpha((unsigned char) *cp))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
ftype[nf] = DTK_STRING;
|
2000-12-03 21:45:40 +01:00
|
|
|
*lp++ = tolower((unsigned char) *cp++);
|
|
|
|
while (isalpha((unsigned char) *cp))
|
|
|
|
*lp++ = tolower((unsigned char) *cp++);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2000-04-12 19:17:23 +02:00
|
|
|
/*
|
|
|
|
* Full date string with leading text month? Could also be a
|
|
|
|
* POSIX time zone...
|
2000-03-16 15:38:42 +01:00
|
|
|
*/
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if ((*cp == '-') || (*cp == '/') || (*cp == '.'))
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
char *dp = cp;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
ftype[nf] = DTK_DATE;
|
2001-12-29 19:31:48 +01:00
|
|
|
*lp++ = *cp++;
|
|
|
|
while (isdigit((unsigned char) *cp) || (*cp == *dp))
|
|
|
|
*lp++ = *cp++;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* skip leading spaces */
|
2000-12-03 21:45:40 +01:00
|
|
|
else if (isspace((unsigned char) *cp))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
cp++;
|
|
|
|
continue;
|
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* sign? then special or numeric timezone */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
else if ((*cp == '+') || (*cp == '-'))
|
|
|
|
{
|
|
|
|
*lp++ = *cp++;
|
|
|
|
/* soak up leading whitespace */
|
2000-12-03 21:45:40 +01:00
|
|
|
while (isspace((unsigned char) *cp))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
cp++;
|
|
|
|
/* numeric timezone? */
|
2000-12-03 21:45:40 +01:00
|
|
|
if (isdigit((unsigned char) *cp))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
ftype[nf] = DTK_TZ;
|
|
|
|
*lp++ = *cp++;
|
2000-12-03 21:45:40 +01:00
|
|
|
while (isdigit((unsigned char) *cp) ||
|
|
|
|
(*cp == ':') || (*cp == '.'))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*lp++ = *cp++;
|
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* special? */
|
2000-12-03 21:45:40 +01:00
|
|
|
else if (isalpha((unsigned char) *cp))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
ftype[nf] = DTK_SPECIAL;
|
2000-12-03 21:45:40 +01:00
|
|
|
*lp++ = tolower((unsigned char) *cp++);
|
|
|
|
while (isalpha((unsigned char) *cp))
|
|
|
|
*lp++ = tolower((unsigned char) *cp++);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* otherwise something wrong... */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
else
|
|
|
|
return -1;
|
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* ignore punctuation but use as delimiter */
|
2000-12-03 21:45:40 +01:00
|
|
|
else if (ispunct((unsigned char) *cp))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
cp++;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* otherwise, something is not right... */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
else
|
|
|
|
return -1;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
/* force in a delimiter after each field */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*lp++ = '\0';
|
|
|
|
nf++;
|
|
|
|
if (nf > MAXDATEFIELDS)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
*numfields = nf;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return 0;
|
|
|
|
} /* ParseDateTime() */
|
|
|
|
|
|
|
|
|
|
|
|
/* DecodeDateTime()
|
|
|
|
* Interpret previously parsed fields for general date and time.
|
|
|
|
* Return 0 if full date, 1 if only time, and -1 if problems.
|
|
|
|
* External format(s):
|
|
|
|
* "<weekday> <month>-<day>-<year> <hour>:<minute>:<second>"
|
|
|
|
* "Fri Feb-7-1997 15:23:27"
|
|
|
|
* "Feb-7-1997 15:23:27"
|
|
|
|
* "2-7-1997 15:23:27"
|
|
|
|
* "1997-2-7 15:23:27"
|
|
|
|
* "1997.038 15:23:27" (day of year 1-366)
|
|
|
|
* Also supports input in compact time:
|
|
|
|
* "970207 152327"
|
|
|
|
* "97038 152327"
|
2001-12-29 19:31:48 +01:00
|
|
|
* "20011225T040506.789-07"
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*
|
|
|
|
* Use the system-provided functions to get the current time zone
|
|
|
|
* if not specified in the input string.
|
|
|
|
* If the date is outside the time_t system-supported time range,
|
2001-12-29 19:31:48 +01:00
|
|
|
* then assume UTC time zone. - thomas 1997-05-27
|
1997-10-25 07:16:09 +02:00
|
|
|
*/
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int
|
|
|
|
DecodeDateTime(char **field, int *ftype, int nf,
|
2002-04-21 21:52:18 +02:00
|
|
|
int *dtype, struct tm * tm, fsec_t *fsec, int *tzp)
|
1997-03-15 00:21:12 +01:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int fmask = 0,
|
|
|
|
tmask,
|
|
|
|
type;
|
2002-09-04 22:31:48 +02:00
|
|
|
int ptype = 0; /* "prefix type" for ISO y2001m02d04
|
|
|
|
* format */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int i;
|
2001-12-29 19:31:48 +01:00
|
|
|
int val;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int mer = HR24;
|
|
|
|
int haveTextMonth = FALSE;
|
|
|
|
int is2digits = FALSE;
|
|
|
|
int bc = FALSE;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
/***
|
2001-10-25 07:50:21 +02:00
|
|
|
* We'll insist on at least all of the date fields, but initialize the
|
|
|
|
* remaining fields in case they are not set later...
|
2001-12-29 19:31:48 +01:00
|
|
|
***/
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*dtype = DTK_DATE;
|
|
|
|
tm->tm_hour = 0;
|
|
|
|
tm->tm_min = 0;
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
*fsec = 0;
|
2001-12-29 19:31:48 +01:00
|
|
|
/* don't know daylight savings time status apriori */
|
|
|
|
tm->tm_isdst = -1;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (tzp != NULL)
|
|
|
|
*tzp = 0;
|
|
|
|
|
|
|
|
for (i = 0; i < nf; i++)
|
|
|
|
{
|
|
|
|
switch (ftype[i])
|
|
|
|
{
|
|
|
|
case DTK_DATE:
|
2001-12-29 19:31:48 +01:00
|
|
|
/***
|
|
|
|
* Integral julian day with attached time zone?
|
|
|
|
* All other forms with JD will be separated into
|
|
|
|
* distinct fields, so we handle just this case here.
|
|
|
|
***/
|
|
|
|
if (ptype == DTK_JULIAN)
|
2001-09-28 10:09:14 +02:00
|
|
|
{
|
2001-10-25 07:50:21 +02:00
|
|
|
char *cp;
|
2001-12-29 19:31:48 +01:00
|
|
|
int val;
|
2000-04-12 19:17:23 +02:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
if (tzp == NULL)
|
2001-09-28 10:09:14 +02:00
|
|
|
return -1;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
val = strtol(field[i], &cp, 10);
|
|
|
|
if (*cp != '-')
|
|
|
|
return -1;
|
2001-09-28 10:09:14 +02:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
j2date(val, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
|
|
|
/* Get the time zone from the end of the string */
|
|
|
|
if (DecodeTimezone(cp, tzp) != 0)
|
|
|
|
return -1;
|
2001-09-28 10:09:14 +02:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
tmask = DTK_DATE_M | DTK_TIME_M | DTK_M(TZ);
|
|
|
|
ptype = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/***
|
2001-10-25 07:50:21 +02:00
|
|
|
* Already have a date? Then this might be a POSIX time
|
2001-12-29 19:31:48 +01:00
|
|
|
* zone with an embedded dash (e.g. "PST-3" == "EST") or
|
|
|
|
* a run-together time with trailing time zone (e.g. hhmmss-zz).
|
|
|
|
* - thomas 2001-12-25
|
|
|
|
***/
|
|
|
|
else if (((fmask & DTK_DATE_M) == DTK_DATE_M)
|
|
|
|
|| (ptype != 0))
|
2000-03-16 15:38:42 +01:00
|
|
|
{
|
2001-12-29 19:31:48 +01:00
|
|
|
/* No time zone accepted? Then quit... */
|
|
|
|
if (tzp == NULL)
|
2000-03-16 15:38:42 +01:00
|
|
|
return -1;
|
|
|
|
|
2001-12-31 00:09:42 +01:00
|
|
|
if (isdigit((unsigned char) *field[i]) || ptype != 0)
|
2001-12-29 19:31:48 +01:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
char *cp;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
2001-12-29 19:40:58 +01:00
|
|
|
if (ptype != 0)
|
|
|
|
{
|
|
|
|
/* Sanity check; should not fail this test */
|
|
|
|
if (ptype != DTK_TIME)
|
|
|
|
return -1;
|
|
|
|
ptype = 0;
|
|
|
|
}
|
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* Starts with a digit but we already have a time
|
|
|
|
* field? Then we are in trouble with a date and
|
|
|
|
* time already...
|
2001-12-29 19:31:48 +01:00
|
|
|
*/
|
|
|
|
if ((fmask & DTK_TIME_M) == DTK_TIME_M)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if ((cp = strchr(field[i], '-')) == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* Get the time zone from the end of the string */
|
|
|
|
if (DecodeTimezone(cp, tzp) != 0)
|
|
|
|
return -1;
|
|
|
|
*cp = '\0';
|
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* Then read the rest of the field as a
|
|
|
|
* concatenated time
|
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
if ((ftype[i] = DecodeNumberField(strlen(field[i]), field[i], fmask,
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits)) < 0)
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* modify tmask after returning from
|
|
|
|
* DecodeNumberField()
|
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
tmask |= DTK_M(TZ);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (DecodePosixTimezone(field[i], tzp) != 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
ftype[i] = DTK_TZ;
|
|
|
|
tmask = DTK_M(TZ);
|
|
|
|
}
|
2000-03-16 15:38:42 +01:00
|
|
|
}
|
|
|
|
else if (DecodeDate(field[i], fmask, &tmask, tm) != 0)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return -1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_TIME:
|
|
|
|
if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0)
|
|
|
|
return -1;
|
|
|
|
|
2001-10-25 07:50:21 +02:00
|
|
|
/*
|
|
|
|
* Check upper limit on hours; other limits checked in
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
* DecodeTime()
|
|
|
|
*/
|
|
|
|
if (tm->tm_hour > 23)
|
|
|
|
return -1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_TZ:
|
2000-03-16 15:38:42 +01:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
int tz;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
|
|
|
if (tzp == NULL)
|
|
|
|
return -1;
|
2000-03-16 15:38:42 +01:00
|
|
|
|
|
|
|
if (DecodeTimezone(field[i], &tz) != 0)
|
|
|
|
return -1;
|
|
|
|
|
2000-04-12 19:17:23 +02:00
|
|
|
/*
|
|
|
|
* Already have a time zone? Then maybe this is the
|
|
|
|
* second field of a POSIX time: EST+3 (equivalent to
|
|
|
|
* PST)
|
2000-03-16 15:38:42 +01:00
|
|
|
*/
|
|
|
|
if ((i > 0) && ((fmask & DTK_M(TZ)) != 0)
|
2001-09-28 10:09:14 +02:00
|
|
|
&& (ftype[i - 1] == DTK_TZ)
|
|
|
|
&& (isalpha((unsigned char) *field[i - 1])))
|
2000-03-16 15:38:42 +01:00
|
|
|
{
|
|
|
|
*tzp -= tz;
|
|
|
|
tmask = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*tzp = tz;
|
|
|
|
tmask = DTK_M(TZ);
|
|
|
|
}
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_NUMBER:
|
2002-09-04 22:31:48 +02:00
|
|
|
|
2001-10-25 07:50:21 +02:00
|
|
|
/*
|
|
|
|
* Was this an "ISO date" with embedded field labels? An
|
|
|
|
* example is "y2001m02d04" - thomas 2001-02-04
|
2001-09-28 10:09:14 +02:00
|
|
|
*/
|
|
|
|
if (ptype != 0)
|
|
|
|
{
|
2001-10-25 07:50:21 +02:00
|
|
|
char *cp;
|
|
|
|
int val;
|
2001-09-28 10:09:14 +02:00
|
|
|
|
|
|
|
val = strtol(field[i], &cp, 10);
|
2002-09-04 22:31:48 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* only a few kinds are allowed to have an embedded
|
|
|
|
* decimal
|
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
if (*cp == '.')
|
|
|
|
switch (ptype)
|
|
|
|
{
|
|
|
|
case DTK_JULIAN:
|
|
|
|
case DTK_TIME:
|
|
|
|
case DTK_SECOND:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if (*cp != '\0')
|
2001-09-28 10:09:14 +02:00
|
|
|
return -1;
|
|
|
|
|
2001-10-25 07:50:21 +02:00
|
|
|
switch (ptype)
|
|
|
|
{
|
2001-12-29 19:31:48 +01:00
|
|
|
case DTK_YEAR:
|
2001-09-28 10:09:14 +02:00
|
|
|
tm->tm_year = val;
|
2001-12-29 19:31:48 +01:00
|
|
|
tmask = DTK_M(YEAR);
|
2001-09-28 10:09:14 +02:00
|
|
|
break;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
case DTK_MONTH:
|
2002-09-04 22:31:48 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* already have a month and hour? then assume
|
|
|
|
* minutes
|
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
if (((fmask & DTK_M(MONTH)) != 0)
|
|
|
|
&& ((fmask & DTK_M(HOUR)) != 0))
|
|
|
|
{
|
|
|
|
tm->tm_min = val;
|
|
|
|
tmask = DTK_M(MINUTE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tm->tm_mon = val;
|
|
|
|
tmask = DTK_M(MONTH);
|
|
|
|
}
|
2001-09-28 10:09:14 +02:00
|
|
|
break;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
case DTK_DAY:
|
2001-09-28 10:09:14 +02:00
|
|
|
tm->tm_mday = val;
|
2001-12-29 19:31:48 +01:00
|
|
|
tmask = DTK_M(DAY);
|
2001-09-28 10:09:14 +02:00
|
|
|
break;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
case DTK_HOUR:
|
2001-09-28 10:09:14 +02:00
|
|
|
tm->tm_hour = val;
|
2001-12-29 19:31:48 +01:00
|
|
|
tmask = DTK_M(HOUR);
|
2001-09-28 10:09:14 +02:00
|
|
|
break;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
case DTK_MINUTE:
|
2001-09-28 10:09:14 +02:00
|
|
|
tm->tm_min = val;
|
2001-12-29 19:31:48 +01:00
|
|
|
tmask = DTK_M(MINUTE);
|
2001-09-28 10:09:14 +02:00
|
|
|
break;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
case DTK_SECOND:
|
2001-09-28 10:09:14 +02:00
|
|
|
tm->tm_sec = val;
|
2001-12-29 19:31:48 +01:00
|
|
|
tmask = DTK_M(SECOND);
|
|
|
|
if (*cp == '.')
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
double frac;
|
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
frac = strtod(cp, &cp);
|
2001-12-29 19:31:48 +01:00
|
|
|
if (*cp != '\0')
|
|
|
|
return -1;
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
*fsec = frac * 1000000;
|
|
|
|
#else
|
|
|
|
*fsec = frac;
|
|
|
|
#endif
|
2001-12-29 19:31:48 +01:00
|
|
|
}
|
2001-09-28 10:09:14 +02:00
|
|
|
break;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
case DTK_TZ:
|
|
|
|
tmask = DTK_M(TZ);
|
|
|
|
if (DecodeTimezone(field[i], tzp) != 0)
|
|
|
|
return -1;
|
|
|
|
break;
|
2001-10-25 07:50:21 +02:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
case DTK_JULIAN:
|
|
|
|
/***
|
|
|
|
* previous field was a label for "julian date"?
|
|
|
|
***/
|
|
|
|
tmask = DTK_DATE_M;
|
2001-09-28 10:09:14 +02:00
|
|
|
j2date(val, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
2002-04-21 21:52:18 +02:00
|
|
|
/* fractional Julian Day? */
|
2001-12-29 19:31:48 +01:00
|
|
|
if (*cp == '.')
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
double time;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
|
|
|
time = strtod(cp, &cp);
|
|
|
|
if (*cp != '\0')
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
tmask |= DTK_TIME_M;
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
2002-09-04 22:31:48 +02:00
|
|
|
dt2time((time * 86400000000), &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#else
|
2002-09-04 22:31:48 +02:00
|
|
|
dt2time((time * 86400), &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
2001-12-29 19:31:48 +01:00
|
|
|
}
|
|
|
|
break;
|
2001-09-28 10:09:14 +02:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
case DTK_TIME:
|
|
|
|
/* previous field was "t" for ISO time */
|
|
|
|
if ((ftype[i] = DecodeNumberField(strlen(field[i]), field[i], (fmask | DTK_DATE_M),
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits)) < 0)
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (tmask != DTK_TIME_M)
|
|
|
|
return -1;
|
2001-09-28 10:09:14 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
ptype = 0;
|
|
|
|
*dtype = DTK_DATE;
|
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
else
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
char *cp;
|
|
|
|
int flen;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
|
|
|
flen = strlen(field[i]);
|
|
|
|
cp = strchr(field[i], '.');
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
/* Embedded decimal and no date yet? */
|
|
|
|
if ((cp != NULL) && !(fmask & DTK_DATE_M))
|
|
|
|
{
|
|
|
|
if (DecodeDate(field[i], fmask, &tmask, tm) != 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/* embedded decimal and several digits before? */
|
|
|
|
else if ((cp != NULL) && ((flen - strlen(cp)) > 2))
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* Interpret as a concatenated date or time Set
|
|
|
|
* the type field to allow decoding other fields
|
|
|
|
* later. Example: 20011223 or 040506
|
2001-12-29 19:31:48 +01:00
|
|
|
*/
|
|
|
|
if ((ftype[i] = DecodeNumberField(flen, field[i], fmask,
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits)) < 0)
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
else if (flen > 4)
|
|
|
|
{
|
|
|
|
if ((ftype[i] = DecodeNumberField(flen, field[i], fmask,
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits)) < 0)
|
|
|
|
return -1;
|
2001-12-29 19:31:48 +01:00
|
|
|
}
|
|
|
|
/* otherwise it is a single date/time field... */
|
|
|
|
else if (DecodeNumber(flen, field[i], fmask,
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits) != 0)
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_STRING:
|
|
|
|
case DTK_SPECIAL:
|
|
|
|
type = DecodeSpecial(i, field[i], &val);
|
2002-06-11 15:40:53 +02:00
|
|
|
if (type == IGNORE_DTF)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
continue;
|
|
|
|
|
|
|
|
tmask = DTK_M(type);
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case RESERV:
|
|
|
|
switch (val)
|
|
|
|
{
|
2001-09-28 10:09:14 +02:00
|
|
|
case DTK_CURRENT:
|
2001-11-21 06:58:51 +01:00
|
|
|
elog(ERROR, "'CURRENT' is no longer supported");
|
|
|
|
return -1;
|
|
|
|
break;
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case DTK_NOW:
|
|
|
|
tmask = (DTK_DATE_M | DTK_TIME_M | DTK_M(TZ));
|
|
|
|
*dtype = DTK_DATE;
|
2001-09-28 10:09:14 +02:00
|
|
|
GetCurrentTimeUsec(tm, fsec);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (tzp != NULL)
|
|
|
|
*tzp = CTimeZone;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_YESTERDAY:
|
|
|
|
tmask = DTK_DATE_M;
|
|
|
|
*dtype = DTK_DATE;
|
2002-06-11 15:40:53 +02:00
|
|
|
GetCurrentDateTime(tm);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
j2date((date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - 1),
|
|
|
|
&tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
|
|
|
tm->tm_hour = 0;
|
|
|
|
tm->tm_min = 0;
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_TODAY:
|
|
|
|
tmask = DTK_DATE_M;
|
|
|
|
*dtype = DTK_DATE;
|
2002-06-11 15:40:53 +02:00
|
|
|
GetCurrentDateTime(tm);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tm->tm_hour = 0;
|
|
|
|
tm->tm_min = 0;
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_TOMORROW:
|
|
|
|
tmask = DTK_DATE_M;
|
|
|
|
*dtype = DTK_DATE;
|
2002-06-11 15:40:53 +02:00
|
|
|
GetCurrentDateTime(tm);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
j2date((date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + 1),
|
|
|
|
&tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
|
|
|
tm->tm_hour = 0;
|
|
|
|
tm->tm_min = 0;
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_ZULU:
|
|
|
|
tmask = (DTK_TIME_M | DTK_M(TZ));
|
|
|
|
*dtype = DTK_DATE;
|
|
|
|
tm->tm_hour = 0;
|
|
|
|
tm->tm_min = 0;
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
if (tzp != NULL)
|
|
|
|
*tzp = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
*dtype = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MONTH:
|
2000-04-12 19:17:23 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/*
|
|
|
|
* already have a (numeric) month? then see if we
|
|
|
|
* can substitute...
|
|
|
|
*/
|
|
|
|
if ((fmask & DTK_M(MONTH)) && (!haveTextMonth)
|
|
|
|
&& (!(fmask & DTK_M(DAY)))
|
|
|
|
&& ((tm->tm_mon >= 1) && (tm->tm_mon <= 31)))
|
|
|
|
{
|
|
|
|
tm->tm_mday = tm->tm_mon;
|
|
|
|
tmask = DTK_M(DAY);
|
|
|
|
}
|
|
|
|
haveTextMonth = TRUE;
|
|
|
|
tm->tm_mon = val;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTZMOD:
|
|
|
|
|
|
|
|
/*
|
|
|
|
* daylight savings time modifier (solves "MET
|
|
|
|
* DST" syntax)
|
|
|
|
*/
|
|
|
|
tmask |= DTK_M(DTZ);
|
|
|
|
tm->tm_isdst = 1;
|
|
|
|
if (tzp == NULL)
|
|
|
|
return -1;
|
|
|
|
*tzp += val * 60;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTZ:
|
|
|
|
|
|
|
|
/*
|
|
|
|
* set mask for TZ here _or_ check for DTZ later
|
|
|
|
* when getting default timezone
|
|
|
|
*/
|
|
|
|
tmask |= DTK_M(TZ);
|
|
|
|
tm->tm_isdst = 1;
|
|
|
|
if (tzp == NULL)
|
|
|
|
return -1;
|
|
|
|
*tzp = val * 60;
|
2000-03-16 15:38:42 +01:00
|
|
|
ftype[i] = DTK_TZ;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case TZ:
|
|
|
|
tm->tm_isdst = 0;
|
|
|
|
if (tzp == NULL)
|
|
|
|
return -1;
|
|
|
|
*tzp = val * 60;
|
2000-03-16 15:38:42 +01:00
|
|
|
ftype[i] = DTK_TZ;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
break;
|
|
|
|
|
2002-06-11 15:40:53 +02:00
|
|
|
case IGNORE_DTF:
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case AMPM:
|
|
|
|
mer = val;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ADBC:
|
|
|
|
bc = (val == BC);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DOW:
|
|
|
|
tm->tm_wday = val;
|
|
|
|
break;
|
|
|
|
|
2001-09-28 10:09:14 +02:00
|
|
|
case UNITS:
|
|
|
|
tmask = 0;
|
2001-10-20 03:02:22 +02:00
|
|
|
ptype = val;
|
2001-09-28 10:09:14 +02:00
|
|
|
break;
|
|
|
|
|
2002-01-01 03:54:33 +01:00
|
|
|
case ISOTIME:
|
2002-09-04 22:31:48 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This is a filler field "t" indicating that the
|
|
|
|
* next field is time. Try to verify that this is
|
|
|
|
* sensible.
|
2001-12-29 19:31:48 +01:00
|
|
|
*/
|
2001-10-20 03:02:22 +02:00
|
|
|
tmask = 0;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
|
|
|
/* No preceeding date? Then quit... */
|
|
|
|
if ((fmask & DTK_DATE_M) != DTK_DATE_M)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/***
|
|
|
|
* We will need one of the following fields:
|
2002-09-04 22:31:48 +02:00
|
|
|
* DTK_NUMBER should be hhmmss.fff
|
|
|
|
* DTK_TIME should be hh:mm:ss.fff
|
|
|
|
* DTK_DATE should be hhmmss-zz
|
2001-12-29 19:31:48 +01:00
|
|
|
***/
|
|
|
|
if ((i >= (nf - 1))
|
|
|
|
|| ((ftype[i + 1] != DTK_NUMBER)
|
|
|
|
&& (ftype[i + 1] != DTK_TIME)
|
|
|
|
&& (ftype[i + 1] != DTK_DATE)))
|
2001-09-28 10:09:14 +02:00
|
|
|
return -1;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
|
|
|
ptype = val;
|
2001-09-28 10:09:14 +02:00
|
|
|
break;
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tmask & fmask)
|
|
|
|
return -1;
|
|
|
|
fmask |= tmask;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* there is no year zero in AD/BC notation; i.e. "1 BC" == year 0 */
|
|
|
|
if (bc)
|
|
|
|
{
|
|
|
|
if (tm->tm_year > 0)
|
|
|
|
tm->tm_year = -(tm->tm_year - 1);
|
|
|
|
else
|
2001-11-19 10:05:02 +01:00
|
|
|
elog(ERROR, "Inconsistent use of year %04d and 'BC'", tm->tm_year);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
else if (is2digits)
|
|
|
|
{
|
|
|
|
if (tm->tm_year < 70)
|
|
|
|
tm->tm_year += 2000;
|
|
|
|
else if (tm->tm_year < 100)
|
|
|
|
tm->tm_year += 1900;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((mer != HR24) && (tm->tm_hour > 12))
|
|
|
|
return -1;
|
|
|
|
if ((mer == AM) && (tm->tm_hour == 12))
|
|
|
|
tm->tm_hour = 0;
|
|
|
|
else if ((mer == PM) && (tm->tm_hour != 12))
|
|
|
|
tm->tm_hour += 12;
|
|
|
|
|
|
|
|
/* do additional checking for full date specs... */
|
|
|
|
if (*dtype == DTK_DATE)
|
|
|
|
{
|
|
|
|
if ((fmask & DTK_DATE_M) != DTK_DATE_M)
|
|
|
|
return ((fmask & DTK_TIME_M) == DTK_TIME_M) ? 1 : -1;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* check for valid day of month, now that we know for sure the
|
|
|
|
* month and year...
|
|
|
|
*/
|
|
|
|
if ((tm->tm_mday < 1)
|
|
|
|
|| (tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]))
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* timezone not specified? then find local timezone if possible */
|
|
|
|
if (((fmask & DTK_DATE_M) == DTK_DATE_M)
|
|
|
|
&& (tzp != NULL) && (!(fmask & DTK_M(TZ))))
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* daylight savings time modifier but no standard timezone?
|
|
|
|
* then error
|
|
|
|
*/
|
|
|
|
if (fmask & DTK_M(DTZMOD))
|
|
|
|
return -1;
|
|
|
|
|
2001-05-04 00:53:07 +02:00
|
|
|
*tzp = DetermineLocalTimeZone(tm);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
} /* DecodeDateTime() */
|
|
|
|
|
|
|
|
|
|
|
|
/* DetermineLocalTimeZone()
|
2002-09-03 21:46:32 +02:00
|
|
|
*
|
2001-05-04 00:53:07 +02:00
|
|
|
* Given a struct tm in which tm_year, tm_mon, tm_mday, tm_hour, tm_min, and
|
|
|
|
* tm_sec fields are set, attempt to determine the applicable local zone
|
|
|
|
* (ie, regular or daylight-savings time) at that time. Set the struct tm's
|
|
|
|
* tm_isdst field accordingly, and return the actual timezone offset.
|
|
|
|
*
|
2002-09-03 21:46:32 +02:00
|
|
|
* This subroutine exists to centralize uses of mktime() and defend against
|
|
|
|
* mktime() bugs/restrictions on various platforms. This should be
|
|
|
|
* the *only* call of mktime() in the backend.
|
2001-05-04 00:53:07 +02:00
|
|
|
*/
|
|
|
|
int
|
|
|
|
DetermineLocalTimeZone(struct tm * tm)
|
|
|
|
{
|
|
|
|
int tz;
|
|
|
|
|
2001-10-18 19:30:21 +02:00
|
|
|
if (HasCTZSet)
|
2002-09-03 21:46:32 +02:00
|
|
|
{
|
|
|
|
tm->tm_isdst = 0; /* for lack of a better idea */
|
2001-10-18 19:30:21 +02:00
|
|
|
tz = CTimeZone;
|
2002-09-03 21:46:32 +02:00
|
|
|
}
|
2001-10-18 19:30:21 +02:00
|
|
|
else if (IS_VALID_UTIME(tm->tm_year, tm->tm_mon, tm->tm_mday))
|
2001-05-04 00:53:07 +02:00
|
|
|
{
|
2000-10-29 14:17:34 +01:00
|
|
|
#if defined(HAVE_TM_ZONE) || defined(HAVE_INT_TIMEZONE)
|
2001-10-25 07:50:21 +02:00
|
|
|
|
2001-05-04 00:53:07 +02:00
|
|
|
/*
|
2001-10-25 07:50:21 +02:00
|
|
|
* Some buggy mktime() implementations may change the
|
|
|
|
* year/month/day when given a time right at a DST boundary. To
|
|
|
|
* prevent corruption of the caller's data, give mktime() a
|
|
|
|
* copy...
|
2001-05-04 00:53:07 +02:00
|
|
|
*/
|
|
|
|
struct tm tt,
|
|
|
|
*tmp = &tt;
|
|
|
|
|
|
|
|
*tmp = *tm;
|
|
|
|
/* change to Unix conventions for year/month */
|
|
|
|
tmp->tm_year -= 1900;
|
|
|
|
tmp->tm_mon -= 1;
|
|
|
|
|
|
|
|
/* indicate timezone unknown */
|
|
|
|
tmp->tm_isdst = -1;
|
|
|
|
|
2002-09-03 21:46:32 +02:00
|
|
|
if (mktime(tmp) != ((time_t) -1) &&
|
|
|
|
tmp->tm_isdst >= 0)
|
|
|
|
{
|
|
|
|
/* mktime() succeeded, trust its result */
|
|
|
|
tm->tm_isdst = tmp->tm_isdst;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2001-03-22 05:01:46 +01:00
|
|
|
#if defined(HAVE_TM_ZONE)
|
2002-09-03 21:46:32 +02:00
|
|
|
/* tm_gmtoff is Sun/DEC-ism */
|
2001-05-04 00:53:07 +02:00
|
|
|
tz = -(tmp->tm_gmtoff);
|
2001-03-22 05:01:46 +01:00
|
|
|
#elif defined(HAVE_INT_TIMEZONE)
|
2002-09-03 21:46:32 +02:00
|
|
|
tz = ((tmp->tm_isdst > 0) ? (TIMEZONE_GLOBAL - 3600) : TIMEZONE_GLOBAL);
|
2001-11-05 18:46:40 +01:00
|
|
|
#endif /* HAVE_INT_TIMEZONE */
|
2002-09-03 21:46:32 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* We have a buggy (not to say deliberately brain damaged)
|
|
|
|
* mktime(). Work around it by using localtime() instead.
|
|
|
|
*
|
|
|
|
* First, generate the time_t value corresponding to the given
|
|
|
|
* y/m/d/h/m/s taken as GMT time. This will not overflow (at
|
|
|
|
* least not for time_t taken as signed) because of the range
|
|
|
|
* check we did above.
|
|
|
|
*/
|
|
|
|
long day,
|
|
|
|
mysec,
|
|
|
|
locsec,
|
|
|
|
delta1,
|
|
|
|
delta2;
|
|
|
|
time_t mytime;
|
|
|
|
|
|
|
|
day = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) -
|
|
|
|
date2j(1970, 1, 1));
|
|
|
|
mysec = tm->tm_sec + (tm->tm_min + (day * 24 + tm->tm_hour) * 60) * 60;
|
|
|
|
mytime = (time_t) mysec;
|
2002-09-04 22:31:48 +02:00
|
|
|
|
2002-09-03 21:46:32 +02:00
|
|
|
/*
|
2002-09-04 22:31:48 +02:00
|
|
|
* Use localtime to convert that time_t to broken-down time,
|
|
|
|
* and reassemble to get a representation of local time.
|
2002-09-03 21:46:32 +02:00
|
|
|
*/
|
|
|
|
tmp = localtime(&mytime);
|
|
|
|
day = (date2j(tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday) -
|
|
|
|
date2j(1970, 1, 1));
|
|
|
|
locsec = tmp->tm_sec + (tmp->tm_min + (day * 24 + tmp->tm_hour) * 60) * 60;
|
2002-09-04 22:31:48 +02:00
|
|
|
|
2002-09-03 21:46:32 +02:00
|
|
|
/*
|
2002-09-04 22:31:48 +02:00
|
|
|
* The local time offset corresponding to that GMT time is now
|
|
|
|
* computable as mysec - locsec.
|
2002-09-03 21:46:32 +02:00
|
|
|
*/
|
|
|
|
delta1 = mysec - locsec;
|
2002-09-04 22:31:48 +02:00
|
|
|
|
2002-09-03 21:46:32 +02:00
|
|
|
/*
|
2002-09-04 22:31:48 +02:00
|
|
|
* However, if that GMT time and the local time we are
|
|
|
|
* actually interested in are on opposite sides of a
|
|
|
|
* daylight-savings-time transition, then this is not the time
|
|
|
|
* offset we want. So, adjust the time_t to be what we think
|
|
|
|
* the GMT time corresponding to our target local time is, and
|
|
|
|
* repeat the localtime() call and delta calculation. We may
|
|
|
|
* have to do it twice before we have a trustworthy delta.
|
2002-09-03 21:46:32 +02:00
|
|
|
*
|
|
|
|
* Note: think not to put a loop here, since if we've been given
|
2002-09-04 22:31:48 +02:00
|
|
|
* an "impossible" local time (in the gap during a
|
|
|
|
* spring-forward transition) we'd never get out of the loop.
|
|
|
|
* Twice is enough to give the behavior we want, which is that
|
|
|
|
* "impossible" times are taken as standard time, while at a
|
|
|
|
* fall-back boundary ambiguous times are also taken as
|
|
|
|
* standard.
|
2002-09-03 21:46:32 +02:00
|
|
|
*/
|
|
|
|
mysec += delta1;
|
|
|
|
mytime = (time_t) mysec;
|
|
|
|
tmp = localtime(&mytime);
|
|
|
|
day = (date2j(tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday) -
|
|
|
|
date2j(1970, 1, 1));
|
|
|
|
locsec = tmp->tm_sec + (tmp->tm_min + (day * 24 + tmp->tm_hour) * 60) * 60;
|
|
|
|
delta2 = mysec - locsec;
|
|
|
|
if (delta2 != delta1)
|
|
|
|
{
|
|
|
|
mysec += (delta2 - delta1);
|
|
|
|
mytime = (time_t) mysec;
|
|
|
|
tmp = localtime(&mytime);
|
|
|
|
day = (date2j(tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday) -
|
|
|
|
date2j(1970, 1, 1));
|
|
|
|
locsec = tmp->tm_sec + (tmp->tm_min + (day * 24 + tmp->tm_hour) * 60) * 60;
|
|
|
|
delta2 = mysec - locsec;
|
|
|
|
}
|
|
|
|
tm->tm_isdst = tmp->tm_isdst;
|
|
|
|
tz = (int) delta2;
|
|
|
|
}
|
2001-03-22 05:01:46 +01:00
|
|
|
#else /* not (HAVE_TM_ZONE || HAVE_INT_TIMEZONE) */
|
2001-05-04 00:53:07 +02:00
|
|
|
tm->tm_isdst = 0;
|
|
|
|
tz = CTimeZone;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
#endif
|
2001-05-04 00:53:07 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-12-29 19:31:48 +01:00
|
|
|
/* Given date is out of range, so assume UTC */
|
2001-05-04 00:53:07 +02:00
|
|
|
tm->tm_isdst = 0;
|
|
|
|
tz = 0;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
2001-05-04 00:53:07 +02:00
|
|
|
return tz;
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* DecodeTimeOnly()
|
|
|
|
* Interpret parsed string as time fields only.
|
2000-03-15 00:06:59 +01:00
|
|
|
* Note that support for time zone is here for
|
|
|
|
* SQL92 TIME WITH TIME ZONE, but it reveals
|
|
|
|
* bogosity with SQL92 date/time standards, since
|
|
|
|
* we must infer a time zone from current time.
|
|
|
|
* - thomas 2000-03-10
|
2001-12-29 19:31:48 +01:00
|
|
|
* Allow specifying date to get a better time zone,
|
|
|
|
* if time zones are allowed. - thomas 2001-12-26
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
*/
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int
|
2000-03-15 00:06:59 +01:00
|
|
|
DecodeTimeOnly(char **field, int *ftype, int nf,
|
2002-04-21 21:52:18 +02:00
|
|
|
int *dtype, struct tm * tm, fsec_t *fsec, int *tzp)
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
{
|
2001-12-29 19:31:48 +01:00
|
|
|
int fmask = 0,
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tmask,
|
|
|
|
type;
|
2002-09-04 22:31:48 +02:00
|
|
|
int ptype = 0; /* "prefix type" for ISO h04mm05s06 format */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int i;
|
2001-12-29 19:31:48 +01:00
|
|
|
int val;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int is2digits = FALSE;
|
|
|
|
int mer = HR24;
|
|
|
|
|
|
|
|
*dtype = DTK_TIME;
|
|
|
|
tm->tm_hour = 0;
|
|
|
|
tm->tm_min = 0;
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
*fsec = 0;
|
2001-12-29 19:31:48 +01:00
|
|
|
/* don't know daylight savings time status apriori */
|
|
|
|
tm->tm_isdst = -1;
|
|
|
|
|
2000-03-15 00:06:59 +01:00
|
|
|
if (tzp != NULL)
|
|
|
|
*tzp = 0;
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
for (i = 0; i < nf; i++)
|
|
|
|
{
|
|
|
|
switch (ftype[i])
|
|
|
|
{
|
2000-03-16 15:38:42 +01:00
|
|
|
case DTK_DATE:
|
2002-09-04 22:31:48 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Time zone not allowed? Then should not accept dates or
|
|
|
|
* time zones no matter what else!
|
2000-03-16 15:38:42 +01:00
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
if (tzp == NULL)
|
2000-03-16 15:38:42 +01:00
|
|
|
return -1;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
/* Under limited circumstances, we will accept a date... */
|
|
|
|
if ((i == 0) && (nf >= 2)
|
2002-09-04 22:31:48 +02:00
|
|
|
&& ((ftype[nf - 1] == DTK_DATE)
|
2001-12-29 19:31:48 +01:00
|
|
|
|| (ftype[1] == DTK_TIME)))
|
|
|
|
{
|
|
|
|
if (DecodeDate(field[i], fmask, &tmask, tm) != 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/* otherwise, this is a time and/or time zone */
|
|
|
|
else
|
|
|
|
{
|
2001-12-31 00:09:42 +01:00
|
|
|
if (isdigit((unsigned char) *field[i]))
|
2001-12-29 19:31:48 +01:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
char *cp;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* Starts with a digit but we already have a time
|
|
|
|
* field? Then we are in trouble with time
|
|
|
|
* already...
|
2001-12-29 19:31:48 +01:00
|
|
|
*/
|
|
|
|
if ((fmask & DTK_TIME_M) == DTK_TIME_M)
|
|
|
|
return -1;
|
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* Should not get here and fail. Sanity check
|
|
|
|
* only...
|
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
if ((cp = strchr(field[i], '-')) == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* Get the time zone from the end of the string */
|
|
|
|
if (DecodeTimezone(cp, tzp) != 0)
|
|
|
|
return -1;
|
|
|
|
*cp = '\0';
|
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* Then read the rest of the field as a
|
|
|
|
* concatenated time
|
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
if ((ftype[i] = DecodeNumberField(strlen(field[i]), field[i], (fmask | DTK_DATE_M),
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits)) < 0)
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
tmask |= DTK_M(TZ);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (DecodePosixTimezone(field[i], tzp) != 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
ftype[i] = DTK_TZ;
|
|
|
|
tmask = DTK_M(TZ);
|
|
|
|
}
|
|
|
|
}
|
2000-03-16 15:38:42 +01:00
|
|
|
break;
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case DTK_TIME:
|
2001-12-29 19:31:48 +01:00
|
|
|
if (DecodeTime(field[i], (fmask | DTK_DATE_M), &tmask, tm, fsec) != 0)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return -1;
|
|
|
|
break;
|
|
|
|
|
2000-03-15 00:06:59 +01:00
|
|
|
case DTK_TZ:
|
|
|
|
if (tzp == NULL)
|
|
|
|
return -1;
|
2000-03-16 15:38:42 +01:00
|
|
|
|
|
|
|
{
|
2000-04-12 19:17:23 +02:00
|
|
|
int tz;
|
2000-03-16 15:38:42 +01:00
|
|
|
|
|
|
|
if (DecodeTimezone(field[i], &tz) != 0)
|
|
|
|
return -1;
|
|
|
|
|
2000-04-12 19:17:23 +02:00
|
|
|
/*
|
|
|
|
* Already have a time zone? Then maybe this is the
|
|
|
|
* second field of a POSIX time: EST+3 (equivalent to
|
|
|
|
* PST)
|
2000-03-16 15:38:42 +01:00
|
|
|
*/
|
|
|
|
if ((i > 0) && ((fmask & DTK_M(TZ)) != 0)
|
2000-12-03 21:45:40 +01:00
|
|
|
&& (ftype[i - 1] == DTK_TZ) && (isalpha((unsigned char) *field[i - 1])))
|
2000-03-16 15:38:42 +01:00
|
|
|
{
|
|
|
|
*tzp -= tz;
|
|
|
|
tmask = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
*tzp = tz;
|
|
|
|
tmask = DTK_M(TZ);
|
|
|
|
}
|
|
|
|
}
|
2000-03-15 00:06:59 +01:00
|
|
|
break;
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case DTK_NUMBER:
|
2002-09-04 22:31:48 +02:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
/*
|
|
|
|
* Was this an "ISO time" with embedded field labels? An
|
|
|
|
* example is "h04m05s06" - thomas 2001-02-04
|
|
|
|
*/
|
|
|
|
if (ptype != 0)
|
|
|
|
{
|
|
|
|
char *cp;
|
|
|
|
int val;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
/* Only accept a date under limited circumstances */
|
|
|
|
switch (ptype)
|
|
|
|
{
|
|
|
|
case DTK_JULIAN:
|
|
|
|
case DTK_YEAR:
|
|
|
|
case DTK_MONTH:
|
|
|
|
case DTK_DAY:
|
|
|
|
if (tzp == NULL)
|
|
|
|
return -1;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
val = strtol(field[i], &cp, 10);
|
2002-09-04 22:31:48 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* only a few kinds are allowed to have an embedded
|
|
|
|
* decimal
|
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
if (*cp == '.')
|
|
|
|
switch (ptype)
|
|
|
|
{
|
|
|
|
case DTK_JULIAN:
|
|
|
|
case DTK_TIME:
|
|
|
|
case DTK_SECOND:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if (*cp != '\0')
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
switch (ptype)
|
|
|
|
{
|
|
|
|
case DTK_YEAR:
|
|
|
|
tm->tm_year = val;
|
|
|
|
tmask = DTK_M(YEAR);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_MONTH:
|
2002-09-04 22:31:48 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* already have a month and hour? then assume
|
|
|
|
* minutes
|
|
|
|
*/
|
2001-12-29 19:31:48 +01:00
|
|
|
if (((fmask & DTK_M(MONTH)) != 0)
|
|
|
|
&& ((fmask & DTK_M(HOUR)) != 0))
|
|
|
|
{
|
|
|
|
tm->tm_min = val;
|
|
|
|
tmask = DTK_M(MINUTE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
tm->tm_mon = val;
|
|
|
|
tmask = DTK_M(MONTH);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_DAY:
|
|
|
|
tm->tm_mday = val;
|
|
|
|
tmask = DTK_M(DAY);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_HOUR:
|
|
|
|
tm->tm_hour = val;
|
|
|
|
tmask = DTK_M(HOUR);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_MINUTE:
|
|
|
|
tm->tm_min = val;
|
|
|
|
tmask = DTK_M(MINUTE);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_SECOND:
|
|
|
|
tm->tm_sec = val;
|
|
|
|
tmask = DTK_M(SECOND);
|
|
|
|
if (*cp == '.')
|
|
|
|
{
|
|
|
|
*fsec = strtod(cp, &cp);
|
|
|
|
if (*cp != '\0')
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_TZ:
|
|
|
|
tmask = DTK_M(TZ);
|
|
|
|
if (DecodeTimezone(field[i], tzp) != 0)
|
|
|
|
return -1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_JULIAN:
|
|
|
|
/***
|
|
|
|
* previous field was a label for "julian date"?
|
|
|
|
***/
|
|
|
|
tmask = DTK_DATE_M;
|
|
|
|
j2date(val, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
|
|
|
if (*cp == '.')
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
double time;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
|
|
|
time = strtod(cp, &cp);
|
|
|
|
if (*cp != '\0')
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
tmask |= DTK_TIME_M;
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
2002-09-04 22:31:48 +02:00
|
|
|
dt2time((time * 86400000000), &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#else
|
2002-09-04 22:31:48 +02:00
|
|
|
dt2time((time * 86400), &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
2001-12-29 19:31:48 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_TIME:
|
|
|
|
/* previous field was "t" for ISO time */
|
|
|
|
if ((ftype[i] = DecodeNumberField(strlen(field[i]), field[i], (fmask | DTK_DATE_M),
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits)) < 0)
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (tmask != DTK_TIME_M)
|
|
|
|
return -1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
ptype = 0;
|
|
|
|
*dtype = DTK_DATE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
char *cp;
|
|
|
|
int flen;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
|
|
|
flen = strlen(field[i]);
|
|
|
|
cp = strchr(field[i], '.');
|
|
|
|
|
|
|
|
/* Embedded decimal? */
|
|
|
|
if (cp != NULL)
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* Under limited circumstances, we will accept a
|
|
|
|
* date...
|
|
|
|
*/
|
|
|
|
if ((i == 0) && ((nf >= 2) && (ftype[nf - 1] == DTK_DATE)))
|
2001-12-29 19:31:48 +01:00
|
|
|
{
|
|
|
|
if (DecodeDate(field[i], fmask, &tmask, tm) != 0)
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/* embedded decimal and several digits before? */
|
|
|
|
else if ((flen - strlen(cp)) > 2)
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* Interpret as a concatenated date or time
|
|
|
|
* Set the type field to allow decoding other
|
|
|
|
* fields later. Example: 20011223 or 040506
|
2001-12-29 19:31:48 +01:00
|
|
|
*/
|
|
|
|
if ((ftype[i] = DecodeNumberField(flen, field[i], fmask,
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits)) < 0)
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
else if (flen > 4)
|
|
|
|
{
|
|
|
|
if ((ftype[i] = DecodeNumberField(flen, field[i], fmask,
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits)) < 0)
|
|
|
|
return -1;
|
2001-12-29 19:31:48 +01:00
|
|
|
}
|
|
|
|
/* otherwise it is a single date/time field... */
|
|
|
|
else if (DecodeNumber(flen, field[i], fmask,
|
2002-09-04 22:31:48 +02:00
|
|
|
&tmask, tm, fsec, &is2digits) != 0)
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_STRING:
|
|
|
|
case DTK_SPECIAL:
|
|
|
|
type = DecodeSpecial(i, field[i], &val);
|
2002-06-11 15:40:53 +02:00
|
|
|
if (type == IGNORE_DTF)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
continue;
|
|
|
|
|
|
|
|
tmask = DTK_M(type);
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case RESERV:
|
|
|
|
switch (val)
|
|
|
|
{
|
2001-11-21 06:58:51 +01:00
|
|
|
case DTK_CURRENT:
|
|
|
|
elog(ERROR, "'CURRENT' is no longer supported");
|
|
|
|
return -1;
|
|
|
|
break;
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case DTK_NOW:
|
|
|
|
tmask = DTK_TIME_M;
|
|
|
|
*dtype = DTK_TIME;
|
2001-10-04 19:10:11 +02:00
|
|
|
GetCurrentTimeUsec(tm, fsec);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_ZULU:
|
|
|
|
tmask = (DTK_TIME_M | DTK_M(TZ));
|
|
|
|
*dtype = DTK_TIME;
|
|
|
|
tm->tm_hour = 0;
|
|
|
|
tm->tm_min = 0;
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
tm->tm_isdst = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
2000-03-16 15:38:42 +01:00
|
|
|
case DTZMOD:
|
|
|
|
|
|
|
|
/*
|
|
|
|
* daylight savings time modifier (solves "MET
|
|
|
|
* DST" syntax)
|
|
|
|
*/
|
|
|
|
tmask |= DTK_M(DTZ);
|
|
|
|
tm->tm_isdst = 1;
|
|
|
|
if (tzp == NULL)
|
|
|
|
return -1;
|
|
|
|
*tzp += val * 60;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTZ:
|
|
|
|
|
|
|
|
/*
|
|
|
|
* set mask for TZ here _or_ check for DTZ later
|
|
|
|
* when getting default timezone
|
|
|
|
*/
|
|
|
|
tmask |= DTK_M(TZ);
|
|
|
|
tm->tm_isdst = 1;
|
|
|
|
if (tzp == NULL)
|
|
|
|
return -1;
|
|
|
|
*tzp = val * 60;
|
|
|
|
ftype[i] = DTK_TZ;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case TZ:
|
|
|
|
tm->tm_isdst = 0;
|
|
|
|
if (tzp == NULL)
|
|
|
|
return -1;
|
|
|
|
*tzp = val * 60;
|
|
|
|
ftype[i] = DTK_TZ;
|
|
|
|
break;
|
|
|
|
|
2002-06-11 15:40:53 +02:00
|
|
|
case IGNORE_DTF:
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case AMPM:
|
|
|
|
mer = val;
|
|
|
|
break;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
case UNITS:
|
|
|
|
tmask = 0;
|
|
|
|
ptype = val;
|
|
|
|
break;
|
|
|
|
|
2002-01-01 03:54:33 +01:00
|
|
|
case ISOTIME:
|
2001-12-29 19:31:48 +01:00
|
|
|
tmask = 0;
|
|
|
|
|
|
|
|
/***
|
|
|
|
* We will need one of the following fields:
|
2002-09-04 22:31:48 +02:00
|
|
|
* DTK_NUMBER should be hhmmss.fff
|
|
|
|
* DTK_TIME should be hh:mm:ss.fff
|
|
|
|
* DTK_DATE should be hhmmss-zz
|
2001-12-29 19:31:48 +01:00
|
|
|
***/
|
|
|
|
if ((i >= (nf - 1))
|
|
|
|
|| ((ftype[i + 1] != DTK_NUMBER)
|
|
|
|
&& (ftype[i + 1] != DTK_TIME)
|
|
|
|
&& (ftype[i + 1] != DTK_DATE)))
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
ptype = val;
|
|
|
|
break;
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tmask & fmask)
|
|
|
|
return -1;
|
|
|
|
fmask |= tmask;
|
|
|
|
}
|
1997-05-16 09:19:50 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if ((mer != HR24) && (tm->tm_hour > 12))
|
|
|
|
return -1;
|
|
|
|
if ((mer == AM) && (tm->tm_hour == 12))
|
|
|
|
tm->tm_hour = 0;
|
|
|
|
else if ((mer == PM) && (tm->tm_hour != 12))
|
|
|
|
tm->tm_hour += 12;
|
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
if (((tm->tm_hour < 0) || (tm->tm_hour > 23))
|
|
|
|
|| ((tm->tm_min < 0) || (tm->tm_min > 59))
|
|
|
|
|| ((tm->tm_sec < 0) || (tm->tm_sec > 60))
|
|
|
|
|| (*fsec < INT64CONST(0)) || (*fsec >= INT64CONST(1000000)))
|
|
|
|
return -1;
|
|
|
|
#else
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (((tm->tm_hour < 0) || (tm->tm_hour > 23))
|
|
|
|
|| ((tm->tm_min < 0) || (tm->tm_min > 59))
|
|
|
|
|| ((tm->tm_sec < 0) || ((tm->tm_sec + *fsec) >= 60)))
|
|
|
|
return -1;
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if ((fmask & DTK_TIME_M) != DTK_TIME_M)
|
|
|
|
return -1;
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
2000-03-15 00:06:59 +01:00
|
|
|
/* timezone not specified? then find local timezone if possible */
|
|
|
|
if ((tzp != NULL) && (!(fmask & DTK_M(TZ))))
|
|
|
|
{
|
2000-04-12 19:17:23 +02:00
|
|
|
struct tm tt,
|
|
|
|
*tmp = &tt;
|
2000-03-15 00:06:59 +01:00
|
|
|
|
|
|
|
/*
|
2000-04-12 19:17:23 +02:00
|
|
|
* daylight savings time modifier but no standard timezone? then
|
|
|
|
* error
|
2000-03-15 00:06:59 +01:00
|
|
|
*/
|
|
|
|
if (fmask & DTK_M(DTZMOD))
|
|
|
|
return -1;
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
if ((fmask & DTK_DATE_M) == 0)
|
2002-06-11 15:40:53 +02:00
|
|
|
GetCurrentDateTime(tmp);
|
2001-12-29 19:31:48 +01:00
|
|
|
else
|
|
|
|
{
|
|
|
|
tmp->tm_year = tm->tm_year;
|
|
|
|
tmp->tm_mon = tm->tm_mon;
|
|
|
|
tmp->tm_mday = tm->tm_mday;
|
|
|
|
}
|
2000-03-15 00:06:59 +01:00
|
|
|
tmp->tm_hour = tm->tm_hour;
|
|
|
|
tmp->tm_min = tm->tm_min;
|
|
|
|
tmp->tm_sec = tm->tm_sec;
|
2001-05-04 00:53:07 +02:00
|
|
|
*tzp = DetermineLocalTimeZone(tmp);
|
2000-03-15 00:06:59 +01:00
|
|
|
tm->tm_isdst = tmp->tm_isdst;
|
|
|
|
}
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return 0;
|
|
|
|
} /* DecodeTimeOnly() */
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* DecodeDate()
|
|
|
|
* Decode date string which includes delimiters.
|
|
|
|
* Insist on a complete set of fields.
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
*/
|
2000-06-09 00:38:00 +02:00
|
|
|
static int
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
DecodeDate(char *str, int fmask, int *tmask, struct tm * tm)
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
{
|
2002-04-21 21:52:18 +02:00
|
|
|
fsec_t fsec;
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int nf = 0;
|
|
|
|
int i,
|
|
|
|
len;
|
|
|
|
int bc = FALSE;
|
|
|
|
int is2digits = FALSE;
|
|
|
|
int type,
|
|
|
|
val,
|
|
|
|
dmask = 0;
|
|
|
|
char *field[MAXDATEFIELDS];
|
|
|
|
|
|
|
|
/* parse this string... */
|
|
|
|
while ((*str != '\0') && (nf < MAXDATEFIELDS))
|
|
|
|
{
|
|
|
|
/* skip field separators */
|
2000-12-03 21:45:40 +01:00
|
|
|
while (!isalnum((unsigned char) *str))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
str++;
|
|
|
|
|
|
|
|
field[nf] = str;
|
2000-12-03 21:45:40 +01:00
|
|
|
if (isdigit((unsigned char) *str))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2000-12-03 21:45:40 +01:00
|
|
|
while (isdigit((unsigned char) *str))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
str++;
|
|
|
|
}
|
2000-12-03 21:45:40 +01:00
|
|
|
else if (isalpha((unsigned char) *str))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2000-12-03 21:45:40 +01:00
|
|
|
while (isalpha((unsigned char) *str))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
str++;
|
|
|
|
}
|
|
|
|
|
2001-09-28 10:09:14 +02:00
|
|
|
/* Just get rid of any non-digit, non-alpha characters... */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (*str != '\0')
|
|
|
|
*str++ = '\0';
|
|
|
|
nf++;
|
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
/* don't allow too many fields */
|
|
|
|
if (nf > 3)
|
|
|
|
return -1;
|
|
|
|
#endif
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*tmask = 0;
|
1997-05-16 09:19:50 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* look first for text fields, since that will be unambiguous month */
|
|
|
|
for (i = 0; i < nf; i++)
|
1997-09-07 07:04:48 +02:00
|
|
|
{
|
2000-12-03 21:45:40 +01:00
|
|
|
if (isalpha((unsigned char) *field[i]))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
type = DecodeSpecial(i, field[i], &val);
|
2002-06-11 15:40:53 +02:00
|
|
|
if (type == IGNORE_DTF)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
continue;
|
|
|
|
|
|
|
|
dmask = DTK_M(type);
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case MONTH:
|
|
|
|
tm->tm_mon = val;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ADBC:
|
|
|
|
bc = (val == BC);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
if (fmask & dmask)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
fmask |= dmask;
|
|
|
|
*tmask |= dmask;
|
|
|
|
|
|
|
|
/* mark this field as being completed */
|
|
|
|
field[i] = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* now pick up remaining numeric fields */
|
|
|
|
for (i = 0; i < nf; i++)
|
|
|
|
{
|
|
|
|
if (field[i] == NULL)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if ((len = strlen(field[i])) <= 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (DecodeNumber(len, field[i], fmask, &dmask, tm, &fsec, &is2digits) != 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (fmask & dmask)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
fmask |= dmask;
|
|
|
|
*tmask |= dmask;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((fmask & ~(DTK_M(DOY) | DTK_M(TZ))) != DTK_DATE_M)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
/* there is no year zero in AD/BC notation; i.e. "1 BC" == year 0 */
|
|
|
|
if (bc)
|
|
|
|
{
|
|
|
|
if (tm->tm_year > 0)
|
|
|
|
tm->tm_year = -(tm->tm_year - 1);
|
|
|
|
else
|
2001-11-19 10:05:02 +01:00
|
|
|
elog(ERROR, "Inconsistent use of year %04d and 'BC'", tm->tm_year);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
else if (is2digits)
|
|
|
|
{
|
|
|
|
if (tm->tm_year < 70)
|
|
|
|
tm->tm_year += 2000;
|
|
|
|
else if (tm->tm_year < 100)
|
|
|
|
tm->tm_year += 1900;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
} /* DecodeDate() */
|
|
|
|
|
|
|
|
|
|
|
|
/* DecodeTime()
|
|
|
|
* Decode time string which includes delimiters.
|
|
|
|
* Only check the lower limit on hours, since this same code
|
|
|
|
* can be used to represent time spans.
|
|
|
|
*/
|
2000-06-09 00:38:00 +02:00
|
|
|
static int
|
2002-04-21 21:52:18 +02:00
|
|
|
DecodeTime(char *str, int fmask, int *tmask, struct tm * tm, fsec_t *fsec)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
char *cp;
|
|
|
|
|
|
|
|
*tmask = DTK_TIME_M;
|
|
|
|
|
|
|
|
tm->tm_hour = strtol(str, &cp, 10);
|
|
|
|
if (*cp != ':')
|
|
|
|
return -1;
|
|
|
|
str = cp + 1;
|
|
|
|
tm->tm_min = strtol(str, &cp, 10);
|
|
|
|
if (*cp == '\0')
|
|
|
|
{
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
*fsec = 0;
|
1997-09-07 07:04:48 +02:00
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
else if (*cp != ':')
|
|
|
|
return -1;
|
1997-09-07 07:04:48 +02:00
|
|
|
else
|
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
str = cp + 1;
|
|
|
|
tm->tm_sec = strtol(str, &cp, 10);
|
|
|
|
if (*cp == '\0')
|
|
|
|
*fsec = 0;
|
|
|
|
else if (*cp == '.')
|
|
|
|
{
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
2002-09-04 22:31:48 +02:00
|
|
|
char fstr[MAXDATELEN + 1];
|
2002-04-21 21:52:18 +02:00
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* OK, we have at most six digits to work with. Let's
|
|
|
|
* construct a string and then do the conversion to an
|
|
|
|
* integer.
|
2002-04-21 21:52:18 +02:00
|
|
|
*/
|
2002-09-04 22:31:48 +02:00
|
|
|
strncpy(fstr, (cp + 1), 7);
|
|
|
|
strcpy((fstr + strlen(fstr)), "000000");
|
|
|
|
*(fstr + 6) = '\0';
|
2002-04-21 21:52:18 +02:00
|
|
|
*fsec = strtol(fstr, &cp, 10);
|
|
|
|
#else
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
str = cp;
|
|
|
|
*fsec = strtod(str, &cp);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
|
|
|
if (*cp != '\0')
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return -1;
|
1997-09-07 07:04:48 +02:00
|
|
|
}
|
1997-05-16 09:19:50 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* do a sanity check */
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
if ((tm->tm_hour < 0)
|
|
|
|
|| (tm->tm_min < 0) || (tm->tm_min > 59)
|
|
|
|
|| (tm->tm_sec < 0) || (tm->tm_sec > 59)
|
|
|
|
|| (*fsec >= INT64CONST(1000000)))
|
|
|
|
return -1;
|
|
|
|
#else
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if ((tm->tm_hour < 0)
|
|
|
|
|| (tm->tm_min < 0) || (tm->tm_min > 59)
|
2002-04-21 21:52:18 +02:00
|
|
|
|| (tm->tm_sec < 0) || (tm->tm_sec > 59)
|
|
|
|
|| (*fsec >= 1))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return -1;
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return 0;
|
|
|
|
} /* DecodeTime() */
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* DecodeNumber()
|
2001-12-29 19:31:48 +01:00
|
|
|
* Interpret plain numeric field as a date value in context.
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
*/
|
2000-06-09 00:38:00 +02:00
|
|
|
static int
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
DecodeNumber(int flen, char *str, int fmask,
|
2002-04-21 21:52:18 +02:00
|
|
|
int *tmask, struct tm * tm, fsec_t *fsec, int *is2digits)
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int val;
|
|
|
|
char *cp;
|
|
|
|
|
|
|
|
*tmask = 0;
|
1997-09-07 07:04:48 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
val = strtol(str, &cp, 10);
|
|
|
|
if (cp == str)
|
|
|
|
return -1;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (*cp == '.')
|
1997-09-07 07:04:48 +02:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* More than two digits? Then could be a date or a run-together
|
|
|
|
* time: 2001.360 20011225 040506.789
|
2001-12-29 19:31:48 +01:00
|
|
|
*/
|
|
|
|
if ((cp - str) > 2)
|
|
|
|
return DecodeNumberField(flen, str, (fmask | DTK_DATE_M),
|
|
|
|
tmask, tm, fsec, is2digits);
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*fsec = strtod(cp, &cp);
|
|
|
|
if (*cp != '\0')
|
|
|
|
return -1;
|
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
else if (*cp != '\0')
|
|
|
|
return -1;
|
1997-09-08 04:41:22 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* Special case day of year? */
|
|
|
|
if ((flen == 3) && (fmask & DTK_M(YEAR))
|
|
|
|
&& ((val >= 1) && (val <= 366)))
|
|
|
|
{
|
|
|
|
*tmask = (DTK_M(DOY) | DTK_M(MONTH) | DTK_M(DAY));
|
|
|
|
tm->tm_yday = val;
|
|
|
|
j2date((date2j(tm->tm_year, 1, 1) + tm->tm_yday - 1),
|
|
|
|
&tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
|
|
|
}
|
1997-09-08 04:41:22 +02:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
/***
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
* Enough digits to be unequivocal year? Used to test for 4 digits or
|
|
|
|
* more, but we now test first for a three-digit doy so anything
|
2001-12-29 19:31:48 +01:00
|
|
|
* bigger than two digits had better be an explicit year.
|
|
|
|
* - thomas 1999-01-09
|
|
|
|
* Back to requiring a 4 digit year. We accept a two digit
|
2000-04-12 19:17:23 +02:00
|
|
|
* year farther down. - thomas 2000-03-28
|
2001-12-29 19:31:48 +01:00
|
|
|
***/
|
2000-03-29 05:57:18 +02:00
|
|
|
else if (flen >= 4)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
*tmask = DTK_M(YEAR);
|
1997-09-08 04:41:22 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* already have a year? then see if we can substitute... */
|
|
|
|
if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(DAY)))
|
|
|
|
&& ((tm->tm_year >= 1) && (tm->tm_year <= 31)))
|
|
|
|
{
|
|
|
|
tm->tm_mday = tm->tm_year;
|
|
|
|
*tmask = DTK_M(DAY);
|
|
|
|
}
|
|
|
|
|
|
|
|
tm->tm_year = val;
|
1997-09-07 07:04:48 +02:00
|
|
|
}
|
2000-03-29 05:57:18 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* already have year? then could be month */
|
|
|
|
else if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(MONTH)))
|
|
|
|
&& ((val >= 1) && (val <= 12)))
|
|
|
|
{
|
|
|
|
*tmask = DTK_M(MONTH);
|
|
|
|
tm->tm_mon = val;
|
|
|
|
}
|
2000-03-29 05:57:18 +02:00
|
|
|
/* no year and EuroDates enabled? then could be day */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
else if ((EuroDates || (fmask & DTK_M(MONTH)))
|
|
|
|
&& (!(fmask & DTK_M(YEAR)) && !(fmask & DTK_M(DAY)))
|
|
|
|
&& ((val >= 1) && (val <= 31)))
|
|
|
|
{
|
|
|
|
*tmask = DTK_M(DAY);
|
|
|
|
tm->tm_mday = val;
|
|
|
|
}
|
|
|
|
else if ((!(fmask & DTK_M(MONTH)))
|
|
|
|
&& ((val >= 1) && (val <= 12)))
|
|
|
|
{
|
|
|
|
*tmask = DTK_M(MONTH);
|
|
|
|
tm->tm_mon = val;
|
|
|
|
}
|
|
|
|
else if ((!(fmask & DTK_M(DAY)))
|
|
|
|
&& ((val >= 1) && (val <= 31)))
|
|
|
|
{
|
|
|
|
*tmask = DTK_M(DAY);
|
|
|
|
tm->tm_mday = val;
|
|
|
|
}
|
2000-04-12 19:17:23 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Check for 2 or 4 or more digits, but currently we reach here only
|
|
|
|
* if two digits. - thomas 2000-03-28
|
2000-03-29 05:57:18 +02:00
|
|
|
*/
|
|
|
|
else if (!(fmask & DTK_M(YEAR))
|
|
|
|
&& ((flen >= 4) || (flen == 2)))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
*tmask = DTK_M(YEAR);
|
|
|
|
tm->tm_year = val;
|
|
|
|
|
|
|
|
/* adjust ONLY if exactly two digits... */
|
|
|
|
*is2digits = (flen == 2);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return -1;
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return 0;
|
|
|
|
} /* DecodeNumber() */
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
1997-05-16 09:19:50 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* DecodeNumberField()
|
2001-12-29 19:31:48 +01:00
|
|
|
* Interpret numeric string as a concatenated date or time field.
|
|
|
|
* Use the context of previously decoded fields to help with
|
|
|
|
* the interpretation.
|
1997-05-16 09:19:50 +02:00
|
|
|
*/
|
2000-06-09 00:38:00 +02:00
|
|
|
static int
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
DecodeNumberField(int len, char *str, int fmask,
|
2002-09-04 22:31:48 +02:00
|
|
|
int *tmask, struct tm * tm, fsec_t *fsec, int *is2digits)
|
1997-05-16 09:19:50 +02:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
char *cp;
|
1997-05-16 09:19:50 +02:00
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* Have a decimal point? Then this is a date or something with a
|
|
|
|
* seconds field...
|
2001-12-29 19:31:48 +01:00
|
|
|
*/
|
|
|
|
if ((cp = strchr(str, '.')) != NULL)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
2002-09-04 22:31:48 +02:00
|
|
|
char fstr[MAXDATELEN + 1];
|
2002-04-21 21:52:18 +02:00
|
|
|
|
2002-09-04 22:31:48 +02:00
|
|
|
/*
|
|
|
|
* OK, we have at most six digits to care about. Let's construct a
|
|
|
|
* string and then do the conversion to an integer.
|
|
|
|
*/
|
|
|
|
strcpy(fstr, (cp + 1));
|
|
|
|
strcpy((fstr + strlen(fstr)), "000000");
|
|
|
|
*(fstr + 6) = '\0';
|
|
|
|
*fsec = strtol(fstr, NULL, 10);
|
2002-04-21 21:52:18 +02:00
|
|
|
#else
|
2001-12-29 19:31:48 +01:00
|
|
|
*fsec = strtod(cp, NULL);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
2001-12-29 19:31:48 +01:00
|
|
|
*cp = '\0';
|
|
|
|
len = strlen(str);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* No decimal point and no complete date yet? */
|
|
|
|
else if ((fmask & DTK_DATE_M) != DTK_DATE_M)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2001-12-29 19:31:48 +01:00
|
|
|
/* yyyymmdd? */
|
|
|
|
if (len == 8)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2001-12-29 19:31:48 +01:00
|
|
|
*tmask = DTK_DATE_M;
|
|
|
|
|
|
|
|
tm->tm_mday = atoi(str + 6);
|
|
|
|
*(str + 6) = '\0';
|
|
|
|
tm->tm_mon = atoi(str + 4);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*(str + 4) = '\0';
|
2001-12-29 19:31:48 +01:00
|
|
|
tm->tm_year = atoi(str + 0);
|
|
|
|
|
|
|
|
return DTK_DATE;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* yymmdd? */
|
|
|
|
else if (len == 6)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
*tmask = DTK_DATE_M;
|
|
|
|
tm->tm_mday = atoi(str + 4);
|
|
|
|
*(str + 4) = '\0';
|
|
|
|
tm->tm_mon = atoi(str + 2);
|
|
|
|
*(str + 2) = '\0';
|
|
|
|
tm->tm_year = atoi(str + 0);
|
|
|
|
*is2digits = TRUE;
|
2001-12-29 19:31:48 +01:00
|
|
|
|
|
|
|
return DTK_DATE;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
/* yyddd? */
|
|
|
|
else if (len == 5)
|
|
|
|
{
|
|
|
|
*tmask = DTK_DATE_M;
|
|
|
|
tm->tm_mday = atoi(str + 2);
|
|
|
|
*(str + 2) = '\0';
|
|
|
|
tm->tm_mon = 1;
|
|
|
|
tm->tm_year = atoi(str + 0);
|
|
|
|
*is2digits = TRUE;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
return DTK_DATE;
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
2001-12-29 19:31:48 +01:00
|
|
|
|
|
|
|
/* not all time fields are specified? */
|
|
|
|
if ((fmask & DTK_TIME_M) != DTK_TIME_M)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2001-12-29 19:31:48 +01:00
|
|
|
/* hhmmss */
|
|
|
|
if (len == 6)
|
|
|
|
{
|
|
|
|
*tmask = DTK_TIME_M;
|
|
|
|
tm->tm_sec = atoi(str + 4);
|
|
|
|
*(str + 4) = '\0';
|
|
|
|
tm->tm_min = atoi(str + 2);
|
|
|
|
*(str + 2) = '\0';
|
|
|
|
tm->tm_hour = atoi(str + 0);
|
|
|
|
|
|
|
|
return DTK_TIME;
|
|
|
|
}
|
|
|
|
/* hhmm? */
|
|
|
|
else if (len == 4)
|
|
|
|
{
|
|
|
|
*tmask = DTK_TIME_M;
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
tm->tm_min = atoi(str + 2);
|
|
|
|
*(str + 2) = '\0';
|
|
|
|
tm->tm_hour = atoi(str + 0);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
return DTK_TIME;
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
2001-03-22 05:01:46 +01:00
|
|
|
} /* DecodeNumberField() */
|
1997-05-16 09:19:50 +02:00
|
|
|
|
1997-09-07 07:04:48 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* DecodeTimezone()
|
|
|
|
* Interpret string as a numeric timezone.
|
2002-11-13 18:24:05 +01:00
|
|
|
*
|
|
|
|
* Note: we allow timezone offsets up to 13:59. There are places that
|
|
|
|
* use +1300 summer time.
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*/
|
2000-06-09 00:38:00 +02:00
|
|
|
static int
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
DecodeTimezone(char *str, int *tzp)
|
|
|
|
{
|
|
|
|
int tz;
|
|
|
|
int hr,
|
|
|
|
min;
|
|
|
|
char *cp;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
/* assume leading character is "+" or "-" */
|
|
|
|
hr = strtol((str + 1), &cp, 10);
|
|
|
|
|
|
|
|
/* explicit delimiter? */
|
|
|
|
if (*cp == ':')
|
|
|
|
min = strtol((cp + 1), &cp, 10);
|
2001-12-29 19:31:48 +01:00
|
|
|
/* otherwise, might have run things together... */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
else if ((*cp == '\0') && ((len = strlen(str)) > 3))
|
|
|
|
{
|
|
|
|
min = strtol((str + len - 2), &cp, 10);
|
2001-12-29 19:31:48 +01:00
|
|
|
if ((min < 0) || (min >= 60))
|
|
|
|
return -1;
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*(str + len - 2) = '\0';
|
|
|
|
hr = strtol((str + 1), &cp, 10);
|
2002-11-13 18:24:05 +01:00
|
|
|
if ((hr < 0) || (hr > 13))
|
2001-12-29 19:31:48 +01:00
|
|
|
return -1;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
min = 0;
|
1997-05-16 09:19:50 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tz = (hr * 60 + min) * 60;
|
|
|
|
if (*str == '-')
|
|
|
|
tz = -tz;
|
1997-05-16 09:19:50 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*tzp = -tz;
|
|
|
|
return *cp != '\0';
|
|
|
|
} /* DecodeTimezone() */
|
1997-09-07 07:04:48 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2000-03-16 15:38:42 +01:00
|
|
|
/* DecodePosixTimezone()
|
|
|
|
* Interpret string as a POSIX-compatible timezone:
|
2000-04-12 19:17:23 +02:00
|
|
|
* PST-hh:mm
|
|
|
|
* PST+h
|
2000-03-16 15:38:42 +01:00
|
|
|
* - thomas 2000-03-15
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
DecodePosixTimezone(char *str, int *tzp)
|
|
|
|
{
|
2000-04-12 19:17:23 +02:00
|
|
|
int val,
|
|
|
|
tz;
|
2000-03-16 15:38:42 +01:00
|
|
|
int type;
|
|
|
|
char *cp;
|
|
|
|
char delim;
|
|
|
|
|
|
|
|
cp = str;
|
2000-12-03 21:45:40 +01:00
|
|
|
while ((*cp != '\0') && isalpha((unsigned char) *cp))
|
2000-03-16 15:38:42 +01:00
|
|
|
cp++;
|
|
|
|
|
|
|
|
if (DecodeTimezone(cp, &tz) != 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
delim = *cp;
|
|
|
|
*cp = '\0';
|
2000-04-12 19:17:23 +02:00
|
|
|
type = DecodeSpecial(MAXDATEFIELDS - 1, str, &val);
|
2000-03-16 15:38:42 +01:00
|
|
|
*cp = delim;
|
|
|
|
|
2000-04-12 19:17:23 +02:00
|
|
|
switch (type)
|
2000-03-16 15:38:42 +01:00
|
|
|
{
|
|
|
|
case DTZ:
|
|
|
|
case TZ:
|
|
|
|
*tzp = (val * 60) - tz;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
} /* DecodePosixTimezone() */
|
|
|
|
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* DecodeSpecial()
|
|
|
|
* Decode text string using lookup table.
|
|
|
|
* Implement a cache lookup since it is likely that dates
|
|
|
|
* will be related in format.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
DecodeSpecial(int field, char *lowtoken, int *val)
|
|
|
|
{
|
|
|
|
int type;
|
|
|
|
datetkn *tp;
|
|
|
|
|
|
|
|
if ((datecache[field] != NULL)
|
|
|
|
&& (strncmp(lowtoken, datecache[field]->token, TOKMAXLEN) == 0))
|
|
|
|
tp = datecache[field];
|
|
|
|
else
|
|
|
|
{
|
2001-06-18 18:14:44 +02:00
|
|
|
tp = NULL;
|
|
|
|
if (Australian_timezones)
|
|
|
|
tp = datebsearch(lowtoken, australian_datetktbl,
|
2001-10-25 07:50:21 +02:00
|
|
|
australian_szdatetktbl);
|
2001-06-18 18:14:44 +02:00
|
|
|
if (!tp)
|
|
|
|
tp = datebsearch(lowtoken, datetktbl, szdatetktbl);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
datecache[field] = tp;
|
|
|
|
if (tp == NULL)
|
|
|
|
{
|
2001-09-28 10:09:14 +02:00
|
|
|
type = UNKNOWN_FIELD;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*val = 0;
|
1997-09-07 07:04:48 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
type = tp->type;
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case TZ:
|
|
|
|
case DTZ:
|
|
|
|
case DTZMOD:
|
|
|
|
*val = FROMVAL(tp);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
*val = tp->value;
|
|
|
|
break;
|
|
|
|
}
|
1997-09-07 07:04:48 +02:00
|
|
|
}
|
1997-05-16 09:19:50 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return type;
|
|
|
|
} /* DecodeSpecial() */
|
1997-03-15 00:21:12 +01:00
|
|
|
|
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
/* DecodeInterval()
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
* Interpret previously parsed fields for general time interval.
|
|
|
|
* Return 0 if decoded and -1 if problems.
|
|
|
|
*
|
|
|
|
* Allow "date" field DTK_DATE since this could be just
|
|
|
|
* an unsigned floating point number. - thomas 1997-11-16
|
|
|
|
*
|
|
|
|
* Allow ISO-style time span, with implicit units on number of days
|
2001-11-21 23:57:01 +01:00
|
|
|
* preceding an hh:mm:ss field. - thomas 1998-04-30
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*/
|
|
|
|
int
|
2002-04-21 21:52:18 +02:00
|
|
|
DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct tm * tm, fsec_t *fsec)
|
1997-03-15 00:21:12 +01:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int is_before = FALSE;
|
|
|
|
|
|
|
|
char *cp;
|
|
|
|
int fmask = 0,
|
|
|
|
tmask,
|
|
|
|
type;
|
|
|
|
int i;
|
2000-11-06 16:57:00 +01:00
|
|
|
int val;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
double fval;
|
|
|
|
|
|
|
|
*dtype = DTK_DELTA;
|
|
|
|
|
2002-06-11 15:40:53 +02:00
|
|
|
type = IGNORE_DTF;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tm->tm_year = 0;
|
|
|
|
tm->tm_mon = 0;
|
|
|
|
tm->tm_mday = 0;
|
|
|
|
tm->tm_hour = 0;
|
|
|
|
tm->tm_min = 0;
|
|
|
|
tm->tm_sec = 0;
|
|
|
|
*fsec = 0;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* read through list backwards to pick up units before values */
|
|
|
|
for (i = nf - 1; i >= 0; i--)
|
|
|
|
{
|
|
|
|
switch (ftype[i])
|
|
|
|
{
|
|
|
|
case DTK_TIME:
|
|
|
|
if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0)
|
|
|
|
return -1;
|
|
|
|
type = DTK_DAY;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_TZ:
|
2001-03-22 05:01:46 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/*
|
|
|
|
* Timezone is a token with a leading sign character and
|
2000-11-06 16:57:00 +01:00
|
|
|
* otherwise the same as a non-signed time field
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*/
|
2000-11-06 16:57:00 +01:00
|
|
|
Assert((*field[i] == '-') || (*field[i] == '+'));
|
2001-03-22 05:01:46 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* A single signed number ends up here, but will be
|
|
|
|
* rejected by DecodeTime(). So, work this out to drop
|
|
|
|
* through to DTK_NUMBER, which *can* tolerate this.
|
2000-11-06 16:57:00 +01:00
|
|
|
*/
|
2001-03-22 05:01:46 +01:00
|
|
|
cp = field[i] + 1;
|
2000-11-11 20:55:19 +01:00
|
|
|
while ((*cp != '\0') && (*cp != ':') && (*cp != '.'))
|
2000-11-06 16:57:00 +01:00
|
|
|
cp++;
|
|
|
|
if ((*cp == ':')
|
2001-03-22 05:01:46 +01:00
|
|
|
&& (DecodeTime((field[i] + 1), fmask, &tmask, tm, fsec) == 0))
|
|
|
|
{
|
|
|
|
if (*field[i] == '-')
|
|
|
|
{
|
2000-11-06 16:57:00 +01:00
|
|
|
/* flip the sign on all fields */
|
|
|
|
tm->tm_hour = -tm->tm_hour;
|
|
|
|
tm->tm_min = -tm->tm_min;
|
|
|
|
tm->tm_sec = -tm->tm_sec;
|
|
|
|
*fsec = -(*fsec);
|
|
|
|
}
|
|
|
|
|
2001-03-22 05:01:46 +01:00
|
|
|
/*
|
|
|
|
* Set the next type to be a day, if units are not
|
|
|
|
* specified. This handles the case of '1 +02:03'
|
|
|
|
* since we are reading right to left.
|
2000-11-06 16:57:00 +01:00
|
|
|
*/
|
|
|
|
type = DTK_DAY;
|
|
|
|
tmask = DTK_M(TZ);
|
|
|
|
break;
|
2001-03-22 05:01:46 +01:00
|
|
|
}
|
2002-06-11 15:40:53 +02:00
|
|
|
else if (type == IGNORE_DTF)
|
2001-03-22 05:01:46 +01:00
|
|
|
{
|
|
|
|
if (*cp == '.')
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Got a decimal point? Then assume some sort of
|
|
|
|
* seconds specification
|
|
|
|
*/
|
2000-11-11 20:55:19 +01:00
|
|
|
type = DTK_SECOND;
|
2001-03-22 05:01:46 +01:00
|
|
|
}
|
|
|
|
else if (*cp == '\0')
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Only a signed integer? Then must assume a
|
|
|
|
* timezone-like usage
|
|
|
|
*/
|
2000-11-11 20:55:19 +01:00
|
|
|
type = DTK_HOUR;
|
|
|
|
}
|
2000-11-06 16:57:00 +01:00
|
|
|
}
|
|
|
|
/* DROP THROUGH */
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case DTK_DATE:
|
|
|
|
case DTK_NUMBER:
|
|
|
|
val = strtol(field[i], &cp, 10);
|
2000-11-06 16:57:00 +01:00
|
|
|
|
2002-06-11 15:40:53 +02:00
|
|
|
if (type == IGNORE_DTF)
|
2001-09-28 10:09:14 +02:00
|
|
|
type = DTK_SECOND;
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (*cp == '.')
|
|
|
|
{
|
|
|
|
fval = strtod(cp, &cp);
|
|
|
|
if (*cp != '\0')
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (val < 0)
|
|
|
|
fval = -(fval);
|
|
|
|
}
|
|
|
|
else if (*cp == '\0')
|
|
|
|
fval = 0;
|
|
|
|
else
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
tmask = 0; /* DTK_M(type); */
|
|
|
|
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case DTK_MICROSEC:
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
*fsec += (val + fval);
|
|
|
|
#else
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*fsec += ((val + fval) * 1e-6);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_MILLISEC:
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
*fsec += ((val + fval) * 1000);
|
|
|
|
#else
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*fsec += ((val + fval) * 1e-3);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_SECOND:
|
|
|
|
tm->tm_sec += val;
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
*fsec += (fval * 1000000);
|
|
|
|
#else
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*fsec += fval;
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tmask = DTK_M(SECOND);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_MINUTE:
|
|
|
|
tm->tm_min += val;
|
|
|
|
if (fval != 0)
|
2002-04-21 21:52:18 +02:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
int sec;
|
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
fval *= 60;
|
|
|
|
sec = fval;
|
|
|
|
tm->tm_sec += sec;
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
*fsec += ((fval - sec) * 1000000);
|
|
|
|
#else
|
|
|
|
*fsec += (fval - sec);
|
|
|
|
#endif
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tmask = DTK_M(MINUTE);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_HOUR:
|
|
|
|
tm->tm_hour += val;
|
|
|
|
if (fval != 0)
|
2002-04-21 21:52:18 +02:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
int sec;
|
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
fval *= 3600;
|
|
|
|
sec = fval;
|
|
|
|
tm->tm_sec += sec;
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
*fsec += ((fval - sec) * 1000000);
|
|
|
|
#else
|
|
|
|
*fsec += (fval - sec);
|
|
|
|
#endif
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tmask = DTK_M(HOUR);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_DAY:
|
|
|
|
tm->tm_mday += val;
|
|
|
|
if (fval != 0)
|
2002-04-21 21:52:18 +02:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
int sec;
|
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
fval *= 86400;
|
|
|
|
sec = fval;
|
|
|
|
tm->tm_sec += sec;
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
*fsec += ((fval - sec) * 1000000);
|
|
|
|
#else
|
|
|
|
*fsec += (fval - sec);
|
|
|
|
#endif
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tmask = ((fmask & DTK_M(DAY)) ? 0 : DTK_M(DAY));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_WEEK:
|
|
|
|
tm->tm_mday += val * 7;
|
|
|
|
if (fval != 0)
|
2002-04-21 21:52:18 +02:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
int sec;
|
|
|
|
|
|
|
|
fval *= (7 * 86400);
|
2002-04-21 21:52:18 +02:00
|
|
|
sec = fval;
|
|
|
|
tm->tm_sec += sec;
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
*fsec += ((fval - sec) * 1000000);
|
|
|
|
#else
|
|
|
|
*fsec += (fval - sec);
|
|
|
|
#endif
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tmask = ((fmask & DTK_M(DAY)) ? 0 : DTK_M(DAY));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_MONTH:
|
|
|
|
tm->tm_mon += val;
|
|
|
|
if (fval != 0)
|
2002-04-21 21:52:18 +02:00
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
int sec;
|
|
|
|
|
|
|
|
fval *= (30 * 86400);
|
2002-04-21 21:52:18 +02:00
|
|
|
sec = fval;
|
|
|
|
tm->tm_sec += sec;
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
*fsec += ((fval - sec) * 1000000);
|
|
|
|
#else
|
|
|
|
*fsec += (fval - sec);
|
|
|
|
#endif
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tmask = DTK_M(MONTH);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_YEAR:
|
|
|
|
tm->tm_year += val;
|
|
|
|
if (fval != 0)
|
|
|
|
tm->tm_mon += (fval * 12);
|
|
|
|
tmask = ((fmask & DTK_M(YEAR)) ? 0 : DTK_M(YEAR));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_DECADE:
|
|
|
|
tm->tm_year += val * 10;
|
|
|
|
if (fval != 0)
|
|
|
|
tm->tm_mon += (fval * 120);
|
|
|
|
tmask = ((fmask & DTK_M(YEAR)) ? 0 : DTK_M(YEAR));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_CENTURY:
|
|
|
|
tm->tm_year += val * 100;
|
|
|
|
if (fval != 0)
|
|
|
|
tm->tm_mon += (fval * 1200);
|
|
|
|
tmask = ((fmask & DTK_M(YEAR)) ? 0 : DTK_M(YEAR));
|
|
|
|
break;
|
|
|
|
|
2000-04-14 17:22:10 +02:00
|
|
|
case DTK_MILLENNIUM:
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tm->tm_year += val * 1000;
|
|
|
|
if (fval != 0)
|
|
|
|
tm->tm_mon += (fval * 12000);
|
|
|
|
tmask = ((fmask & DTK_M(YEAR)) ? 0 : DTK_M(YEAR));
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DTK_STRING:
|
|
|
|
case DTK_SPECIAL:
|
|
|
|
type = DecodeUnits(i, field[i], &val);
|
2002-06-11 15:40:53 +02:00
|
|
|
if (type == IGNORE_DTF)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
continue;
|
|
|
|
|
|
|
|
tmask = 0; /* DTK_M(type); */
|
|
|
|
switch (type)
|
|
|
|
{
|
|
|
|
case UNITS:
|
|
|
|
type = val;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case AGO:
|
|
|
|
is_before = TRUE;
|
|
|
|
type = val;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case RESERV:
|
|
|
|
tmask = (DTK_DATE_M || DTK_TIME_M);
|
|
|
|
*dtype = val;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tmask & fmask)
|
|
|
|
return -1;
|
|
|
|
fmask |= tmask;
|
|
|
|
}
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (*fsec != 0)
|
|
|
|
{
|
2002-09-04 22:31:48 +02:00
|
|
|
int sec;
|
2002-04-21 21:52:18 +02:00
|
|
|
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
sec = (*fsec / INT64CONST(1000000));
|
|
|
|
*fsec -= (sec * INT64CONST(1000000));
|
|
|
|
#else
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
TMODULO(*fsec, sec, 1e0);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
tm->tm_sec += sec;
|
|
|
|
}
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (is_before)
|
|
|
|
{
|
|
|
|
*fsec = -(*fsec);
|
|
|
|
tm->tm_sec = -(tm->tm_sec);
|
|
|
|
tm->tm_min = -(tm->tm_min);
|
|
|
|
tm->tm_hour = -(tm->tm_hour);
|
|
|
|
tm->tm_mday = -(tm->tm_mday);
|
|
|
|
tm->tm_mon = -(tm->tm_mon);
|
|
|
|
tm->tm_year = -(tm->tm_year);
|
|
|
|
}
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* ensure that at least one time field has been found */
|
|
|
|
return (fmask != 0) ? 0 : -1;
|
2002-04-21 21:52:18 +02:00
|
|
|
} /* DecodeInterval() */
|
1997-03-15 00:21:12 +01:00
|
|
|
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* DecodeUnits()
|
|
|
|
* Decode text string using lookup table.
|
|
|
|
* This routine supports time interval decoding.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
DecodeUnits(int field, char *lowtoken, int *val)
|
|
|
|
{
|
|
|
|
int type;
|
|
|
|
datetkn *tp;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if ((deltacache[field] != NULL)
|
|
|
|
&& (strncmp(lowtoken, deltacache[field]->token, TOKMAXLEN) == 0))
|
|
|
|
tp = deltacache[field];
|
|
|
|
else
|
|
|
|
tp = datebsearch(lowtoken, deltatktbl, szdeltatktbl);
|
|
|
|
deltacache[field] = tp;
|
|
|
|
if (tp == NULL)
|
|
|
|
{
|
2001-09-28 10:09:14 +02:00
|
|
|
type = UNKNOWN_FIELD;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
*val = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
type = tp->type;
|
|
|
|
if ((type == TZ) || (type == DTZ))
|
|
|
|
*val = FROMVAL(tp);
|
|
|
|
else
|
|
|
|
*val = tp->value;
|
|
|
|
}
|
|
|
|
|
|
|
|
return type;
|
|
|
|
} /* DecodeUnits() */
|
1997-03-15 00:21:12 +01:00
|
|
|
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* datebsearch()
|
|
|
|
* Binary search -- from Knuth (6.2.1) Algorithm B. Special case like this
|
|
|
|
* is WAY faster than the generic bsearch().
|
|
|
|
*/
|
2001-03-22 05:01:46 +01:00
|
|
|
static datetkn *
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
datebsearch(char *key, datetkn *base, unsigned int nel)
|
1997-03-15 00:21:12 +01:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
datetkn *last = base + nel - 1,
|
|
|
|
*position;
|
|
|
|
int result;
|
1997-09-07 07:04:48 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
while (last >= base)
|
|
|
|
{
|
|
|
|
position = base + ((last - base) >> 1);
|
|
|
|
result = key[0] - position->token[0];
|
|
|
|
if (result == 0)
|
|
|
|
{
|
|
|
|
result = strncmp(key, position->token, TOKMAXLEN);
|
|
|
|
if (result == 0)
|
|
|
|
return position;
|
|
|
|
}
|
|
|
|
if (result < 0)
|
|
|
|
last = position - 1;
|
|
|
|
else
|
|
|
|
base = position + 1;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
1997-03-15 00:21:12 +01:00
|
|
|
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* EncodeDateOnly()
|
|
|
|
* Encode date as local time.
|
|
|
|
*/
|
|
|
|
int
|
|
|
|
EncodeDateOnly(struct tm * tm, int style, char *str)
|
|
|
|
{
|
|
|
|
if ((tm->tm_mon < 1) || (tm->tm_mon > 12))
|
|
|
|
return -1;
|
1997-05-16 09:19:50 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
switch (style)
|
|
|
|
{
|
|
|
|
case USE_ISO_DATES:
|
2001-09-28 10:09:14 +02:00
|
|
|
/* compatible with ISO date formats */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (tm->tm_year > 0)
|
|
|
|
sprintf(str, "%04d-%02d-%02d",
|
|
|
|
tm->tm_year, tm->tm_mon, tm->tm_mday);
|
|
|
|
else
|
|
|
|
sprintf(str, "%04d-%02d-%02d %s",
|
|
|
|
-(tm->tm_year - 1), tm->tm_mon, tm->tm_mday, "BC");
|
|
|
|
break;
|
1997-05-16 09:19:50 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case USE_SQL_DATES:
|
2001-09-28 10:09:14 +02:00
|
|
|
/* compatible with Oracle/Ingres date formats */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (EuroDates)
|
|
|
|
sprintf(str, "%02d/%02d", tm->tm_mday, tm->tm_mon);
|
|
|
|
else
|
|
|
|
sprintf(str, "%02d/%02d", tm->tm_mon, tm->tm_mday);
|
|
|
|
if (tm->tm_year > 0)
|
|
|
|
sprintf((str + 5), "/%04d", tm->tm_year);
|
|
|
|
else
|
|
|
|
sprintf((str + 5), "/%04d %s", -(tm->tm_year - 1), "BC");
|
|
|
|
break;
|
1997-07-01 02:22:46 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case USE_GERMAN_DATES:
|
2001-09-28 10:09:14 +02:00
|
|
|
/* German-style date format */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
sprintf(str, "%02d.%02d", tm->tm_mday, tm->tm_mon);
|
|
|
|
if (tm->tm_year > 0)
|
|
|
|
sprintf((str + 5), ".%04d", tm->tm_year);
|
|
|
|
else
|
|
|
|
sprintf((str + 5), ".%04d %s", -(tm->tm_year - 1), "BC");
|
|
|
|
break;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case USE_POSTGRES_DATES:
|
|
|
|
default:
|
2001-09-28 10:09:14 +02:00
|
|
|
/* traditional date-only style for Postgres */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (EuroDates)
|
|
|
|
sprintf(str, "%02d-%02d", tm->tm_mday, tm->tm_mon);
|
|
|
|
else
|
|
|
|
sprintf(str, "%02d-%02d", tm->tm_mon, tm->tm_mday);
|
|
|
|
if (tm->tm_year > 0)
|
|
|
|
sprintf((str + 5), "-%04d", tm->tm_year);
|
|
|
|
else
|
|
|
|
sprintf((str + 5), "-%04d %s", -(tm->tm_year - 1), "BC");
|
|
|
|
break;
|
|
|
|
}
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return TRUE;
|
|
|
|
} /* EncodeDateOnly() */
|
1997-03-15 00:21:12 +01:00
|
|
|
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* EncodeTimeOnly()
|
|
|
|
* Encode time fields only.
|
|
|
|
*/
|
|
|
|
int
|
2002-04-21 21:52:18 +02:00
|
|
|
EncodeTimeOnly(struct tm * tm, fsec_t fsec, int *tzp, int style, char *str)
|
1997-03-15 00:21:12 +01:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if ((tm->tm_hour < 0) || (tm->tm_hour > 24))
|
|
|
|
return -1;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
2001-10-03 07:29:27 +02:00
|
|
|
sprintf(str, "%02d:%02d", tm->tm_hour, tm->tm_min);
|
|
|
|
|
2001-10-25 07:50:21 +02:00
|
|
|
/*
|
2003-01-29 02:08:42 +01:00
|
|
|
* Print fractional seconds if any. The field widths here should be
|
|
|
|
* at least equal to the larger of MAX_TIME_PRECISION and
|
|
|
|
* MAX_TIMESTAMP_PRECISION.
|
2001-10-03 07:29:27 +02:00
|
|
|
*/
|
2001-10-25 07:50:21 +02:00
|
|
|
if (fsec != 0)
|
|
|
|
{
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%02d.%06d", tm->tm_sec, fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#else
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%013.10f", tm->tm_sec + fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
2001-10-03 07:29:27 +02:00
|
|
|
/* chop off trailing pairs of zeros... */
|
|
|
|
while ((strcmp((str + strlen(str) - 2), "00") == 0)
|
|
|
|
&& (*(str + strlen(str) - 3) != '.'))
|
|
|
|
*(str + strlen(str) - 2) = '\0';
|
|
|
|
}
|
|
|
|
else
|
2002-04-21 21:52:18 +02:00
|
|
|
sprintf((str + strlen(str)), ":%02d", tm->tm_sec);
|
1997-03-15 00:21:12 +01:00
|
|
|
|
2000-03-15 00:06:59 +01:00
|
|
|
if (tzp != NULL)
|
|
|
|
{
|
2000-04-12 19:17:23 +02:00
|
|
|
int hour,
|
|
|
|
min;
|
2000-03-15 00:06:59 +01:00
|
|
|
|
|
|
|
hour = -(*tzp / 3600);
|
|
|
|
min = ((abs(*tzp) / 60) % 60);
|
|
|
|
sprintf((str + strlen(str)), ((min != 0) ? "%+03d:%02d" : "%+03d"), hour, min);
|
|
|
|
}
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return TRUE;
|
|
|
|
} /* EncodeTimeOnly() */
|
1997-03-15 00:21:12 +01:00
|
|
|
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
/* EncodeDateTime()
|
|
|
|
* Encode date and time interpreted as local time.
|
|
|
|
* Support several date styles:
|
|
|
|
* Postgres - day mon hh:mm:ss yyyy tz
|
|
|
|
* SQL - mm/dd/yyyy hh:mm:ss.ss tz
|
|
|
|
* ISO - yyyy-mm-dd hh:mm:ss+/-tz
|
2001-12-29 19:31:48 +01:00
|
|
|
* German - dd.mm.yyyy hh:mm:ss tz
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
* Variants (affects order of month and day for Postgres and SQL styles):
|
|
|
|
* US - mm/dd/yyyy
|
|
|
|
* European - dd/mm/yyyy
|
|
|
|
*/
|
|
|
|
int
|
2002-04-21 21:52:18 +02:00
|
|
|
EncodeDateTime(struct tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, char *str)
|
1997-03-15 00:21:12 +01:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int day,
|
|
|
|
hour,
|
|
|
|
min;
|
2002-09-04 22:31:48 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Why are we checking only the month field? Change this to an
|
|
|
|
* assert... if ((tm->tm_mon < 1) || (tm->tm_mon > 12)) return -1;
|
2002-04-21 21:52:18 +02:00
|
|
|
*/
|
|
|
|
Assert((tm->tm_mon >= 1) && (tm->tm_mon <= 12));
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
switch (style)
|
|
|
|
{
|
|
|
|
case USE_ISO_DATES:
|
2002-04-21 21:52:18 +02:00
|
|
|
/* Compatible with ISO-8601 date formats */
|
2001-10-03 07:29:27 +02:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
sprintf(str, "%04d-%02d-%02d %02d:%02d",
|
2002-09-04 22:31:48 +02:00
|
|
|
((tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1)),
|
2002-04-21 21:52:18 +02:00
|
|
|
tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
/*
|
2003-01-29 02:08:42 +01:00
|
|
|
* Print fractional seconds if any. The field widths here should
|
|
|
|
* be at least equal to MAX_TIMESTAMP_PRECISION.
|
|
|
|
*
|
|
|
|
* In float mode, don't print fractional seconds before 1 AD,
|
|
|
|
* since it's unlikely there's any precision left ...
|
2002-04-21 21:52:18 +02:00
|
|
|
*/
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
if (fsec != 0)
|
|
|
|
{
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%02d.%06d", tm->tm_sec, fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#else
|
|
|
|
if ((fsec != 0) && (tm->tm_year > 0))
|
|
|
|
{
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%09.6f", tm->tm_sec + fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
|
|
|
TrimTrailingZeros(str);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
else
|
2002-04-21 21:52:18 +02:00
|
|
|
sprintf((str + strlen(str)), ":%02d", tm->tm_sec);
|
|
|
|
|
|
|
|
if (tm->tm_year <= 0)
|
|
|
|
sprintf((str + strlen(str)), " BC");
|
|
|
|
|
|
|
|
/*
|
2002-09-04 22:31:48 +02:00
|
|
|
* tzp == NULL indicates that we don't want *any* time zone
|
|
|
|
* info in the output string. *tzn != NULL indicates that we
|
|
|
|
* have alpha time zone info available. tm_isdst != -1
|
|
|
|
* indicates that we have a valid time zone translation.
|
2002-04-21 21:52:18 +02:00
|
|
|
*/
|
|
|
|
if ((tzp != NULL) && (tm->tm_isdst >= 0))
|
|
|
|
{
|
|
|
|
hour = -(*tzp / 3600);
|
|
|
|
min = ((abs(*tzp) / 60) % 60);
|
|
|
|
sprintf((str + strlen(str)), ((min != 0) ? "%+03d:%02d" : "%+03d"), hour, min);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
break;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case USE_SQL_DATES:
|
2002-04-21 21:52:18 +02:00
|
|
|
/* Compatible with Oracle/Ingres date formats */
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (EuroDates)
|
|
|
|
sprintf(str, "%02d/%02d", tm->tm_mday, tm->tm_mon);
|
|
|
|
else
|
|
|
|
sprintf(str, "%02d/%02d", tm->tm_mon, tm->tm_mday);
|
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
sprintf((str + 5), "/%04d %02d:%02d",
|
2002-09-04 22:31:48 +02:00
|
|
|
((tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1)),
|
2002-04-21 21:52:18 +02:00
|
|
|
tm->tm_hour, tm->tm_min);
|
|
|
|
|
|
|
|
/*
|
2003-01-29 02:08:42 +01:00
|
|
|
* Print fractional seconds if any. The field widths here should
|
|
|
|
* be at least equal to MAX_TIMESTAMP_PRECISION.
|
|
|
|
*
|
|
|
|
* In float mode, don't print fractional seconds before 1 AD,
|
|
|
|
* since it's unlikely there's any precision left ...
|
2002-04-21 21:52:18 +02:00
|
|
|
*/
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
if (fsec != 0)
|
|
|
|
{
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%02d.%06d", tm->tm_sec, fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#else
|
|
|
|
if ((fsec != 0) && (tm->tm_year > 0))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%09.6f", tm->tm_sec + fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
|
|
|
TrimTrailingZeros(str);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sprintf((str + strlen(str)), ":%02d", tm->tm_sec);
|
2001-10-03 07:29:27 +02:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
if (tm->tm_year <= 0)
|
|
|
|
sprintf((str + strlen(str)), " BC");
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
if ((tzp != NULL) && (tm->tm_isdst >= 0))
|
|
|
|
{
|
|
|
|
if (*tzn != NULL)
|
|
|
|
sprintf((str + strlen(str)), " %.*s", MAXTZLEN, *tzn);
|
|
|
|
else
|
2001-10-18 19:30:21 +02:00
|
|
|
{
|
2002-04-21 21:52:18 +02:00
|
|
|
hour = -(*tzp / 3600);
|
|
|
|
min = ((abs(*tzp) / 60) % 60);
|
|
|
|
sprintf((str + strlen(str)), ((min != 0) ? "%+03d:%02d" : "%+03d"), hour, min);
|
2001-10-18 19:30:21 +02:00
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
break;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case USE_GERMAN_DATES:
|
2002-04-21 21:52:18 +02:00
|
|
|
/* German variant on European style */
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
sprintf(str, "%02d.%02d", tm->tm_mday, tm->tm_mon);
|
2002-04-21 21:52:18 +02:00
|
|
|
|
|
|
|
sprintf((str + 5), ".%04d %02d:%02d",
|
2002-09-04 22:31:48 +02:00
|
|
|
((tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1)),
|
2002-04-21 21:52:18 +02:00
|
|
|
tm->tm_hour, tm->tm_min);
|
|
|
|
|
|
|
|
/*
|
2003-01-29 02:08:42 +01:00
|
|
|
* Print fractional seconds if any. The field widths here should
|
|
|
|
* be at least equal to MAX_TIMESTAMP_PRECISION.
|
|
|
|
*
|
|
|
|
* In float mode, don't print fractional seconds before 1 AD,
|
|
|
|
* since it's unlikely there's any precision left ...
|
2002-04-21 21:52:18 +02:00
|
|
|
*/
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
if (fsec != 0)
|
|
|
|
{
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%02d.%06d", tm->tm_sec, fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#else
|
|
|
|
if ((fsec != 0) && (tm->tm_year > 0))
|
|
|
|
{
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%09.6f", tm->tm_sec + fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
|
|
|
TrimTrailingZeros(str);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sprintf((str + strlen(str)), ":%02d", tm->tm_sec);
|
2001-10-03 07:29:27 +02:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
if (tm->tm_year <= 0)
|
|
|
|
sprintf((str + strlen(str)), " BC");
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
if ((tzp != NULL) && (tm->tm_isdst >= 0))
|
|
|
|
{
|
|
|
|
if (*tzn != NULL)
|
|
|
|
sprintf((str + strlen(str)), " %.*s", MAXTZLEN, *tzn);
|
|
|
|
else
|
2001-10-18 19:30:21 +02:00
|
|
|
{
|
2002-04-21 21:52:18 +02:00
|
|
|
hour = -(*tzp / 3600);
|
|
|
|
min = ((abs(*tzp) / 60) % 60);
|
|
|
|
sprintf((str + strlen(str)), ((min != 0) ? "%+03d:%02d" : "%+03d"), hour, min);
|
2001-10-18 19:30:21 +02:00
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
break;
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case USE_POSTGRES_DATES:
|
|
|
|
default:
|
2002-04-21 21:52:18 +02:00
|
|
|
/* Backward-compatible with traditional Postgres abstime dates */
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday);
|
|
|
|
tm->tm_wday = j2day(day);
|
|
|
|
|
|
|
|
strncpy(str, days[tm->tm_wday], 3);
|
|
|
|
strcpy((str + 3), " ");
|
|
|
|
|
|
|
|
if (EuroDates)
|
|
|
|
sprintf((str + 4), "%02d %3s", tm->tm_mday, months[tm->tm_mon - 1]);
|
|
|
|
else
|
|
|
|
sprintf((str + 4), "%3s %02d", months[tm->tm_mon - 1], tm->tm_mday);
|
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
sprintf((str + 10), " %02d:%02d", tm->tm_hour, tm->tm_min);
|
2001-10-03 07:29:27 +02:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
/*
|
2003-01-29 02:08:42 +01:00
|
|
|
* Print fractional seconds if any. The field widths here should
|
|
|
|
* be at least equal to MAX_TIMESTAMP_PRECISION.
|
|
|
|
*
|
|
|
|
* In float mode, don't print fractional seconds before 1 AD,
|
|
|
|
* since it's unlikely there's any precision left ...
|
2002-04-21 21:52:18 +02:00
|
|
|
*/
|
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
if (fsec != 0)
|
|
|
|
{
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%02d.%06d", tm->tm_sec, fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#else
|
|
|
|
if ((fsec != 0) && (tm->tm_year > 0))
|
|
|
|
{
|
2003-01-29 02:08:42 +01:00
|
|
|
sprintf((str + strlen(str)), ":%09.6f", tm->tm_sec + fsec);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
|
|
|
TrimTrailingZeros(str);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sprintf((str + strlen(str)), ":%02d", tm->tm_sec);
|
2001-10-03 07:29:27 +02:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
sprintf((str + strlen(str)), " %04d",
|
2002-09-04 22:31:48 +02:00
|
|
|
((tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1)));
|
2002-04-21 21:52:18 +02:00
|
|
|
if (tm->tm_year <= 0)
|
|
|
|
sprintf((str + strlen(str)), " BC");
|
2001-10-18 19:30:21 +02:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
if ((tzp != NULL) && (tm->tm_isdst >= 0))
|
|
|
|
{
|
|
|
|
if (*tzn != NULL)
|
|
|
|
sprintf((str + strlen(str)), " %.*s", MAXTZLEN, *tzn);
|
|
|
|
else
|
2001-10-18 19:30:21 +02:00
|
|
|
{
|
2002-04-21 21:52:18 +02:00
|
|
|
/*
|
2002-09-04 22:31:48 +02:00
|
|
|
* We have a time zone, but no string version. Use the
|
|
|
|
* numeric form, but be sure to include a leading
|
|
|
|
* space to avoid formatting something which would be
|
|
|
|
* rejected by the date/time parser later. - thomas
|
|
|
|
* 2001-10-19
|
2002-04-21 21:52:18 +02:00
|
|
|
*/
|
|
|
|
hour = -(*tzp / 3600);
|
|
|
|
min = ((abs(*tzp) / 60) % 60);
|
|
|
|
sprintf((str + strlen(str)), ((min != 0) ? " %+03d:%02d" : " %+03d"), hour, min);
|
2001-10-18 19:30:21 +02:00
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
1997-03-15 00:21:12 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return TRUE;
|
|
|
|
} /* EncodeDateTime() */
|
From: Thomas Lockhart <Thomas.G.Lockhart@jpl.nasa.gov>
Subject: [HACKERS] More date time functions
Here are some additional patches mostly related to the date and time
data types. It includes some type conversion routines to move between
the different date types and some other date manipulation routines such
as date_part(units,datetime).
I noticed Edmund Mergl et al's neat trick for getting function overloading
for builtin functions, so started to use that for the date and time stuff.
Later, if someone figures out how to get function overloading directly
for internal C code, then we can move to that technique.
These patches include documentation updates (don't faint!) for the built-in
man page. Doesn't yet include mention of timestamp, since I don't know
much about it and since it may change a bit to become a _real_ ANSI timestamp
which would include parser support for the declaration syntax (what do you
think, Dan?).
The patches were developed on the 970330 release, but have been rebuilt
off of the 970402 release. The first patch below is to get libpq to compile,
on my Linux box, but is not related to the rest of the patches and you can
choose not to apply that one at this time. Thanks in advance, scrappy!
1997-04-02 20:36:24 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2002-04-21 21:52:18 +02:00
|
|
|
/* EncodeInterval()
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
* Interpret time structure as a delta time and convert to string.
|
|
|
|
*
|
|
|
|
* Support "traditional Postgres" and ISO-8601 styles.
|
|
|
|
* Actually, afaik ISO does not address time interval formatting,
|
|
|
|
* but this looks similar to the spec for absolute date/time.
|
|
|
|
* - thomas 1998-04-30
|
1997-10-25 07:16:09 +02:00
|
|
|
*/
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int
|
2002-04-21 21:52:18 +02:00
|
|
|
EncodeInterval(struct tm * tm, fsec_t fsec, int style, char *str)
|
1997-10-25 07:16:09 +02:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
int is_before = FALSE;
|
|
|
|
int is_nonzero = FALSE;
|
|
|
|
char *cp = str;
|
1997-10-25 07:16:09 +02:00
|
|
|
|
2001-03-22 05:01:46 +01:00
|
|
|
/*
|
|
|
|
* The sign of year and month are guaranteed to match, since they are
|
|
|
|
* stored internally as "month". But we'll need to check for is_before
|
|
|
|
* and is_nonzero when determining the signs of hour/minute/seconds
|
|
|
|
* fields.
|
2000-11-06 16:57:00 +01:00
|
|
|
*/
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
switch (style)
|
|
|
|
{
|
|
|
|
/* compatible with ISO date formats */
|
|
|
|
case USE_ISO_DATES:
|
2000-11-06 16:57:00 +01:00
|
|
|
if (tm->tm_year != 0)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2000-11-06 16:57:00 +01:00
|
|
|
sprintf(cp, "%d year%s",
|
|
|
|
tm->tm_year, ((tm->tm_year != 1) ? "s" : ""));
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
cp += strlen(cp);
|
2001-01-17 17:46:56 +01:00
|
|
|
is_before = (tm->tm_year < 0);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
is_nonzero = TRUE;
|
|
|
|
}
|
|
|
|
|
2000-11-06 16:57:00 +01:00
|
|
|
if (tm->tm_mon != 0)
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2001-01-17 17:46:56 +01:00
|
|
|
sprintf(cp, "%s%s%d mon%s", (is_nonzero ? " " : ""),
|
|
|
|
((is_before && (tm->tm_mon > 0)) ? "+" : ""),
|
2000-11-06 16:57:00 +01:00
|
|
|
tm->tm_mon, ((tm->tm_mon != 1) ? "s" : ""));
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
cp += strlen(cp);
|
2001-01-17 17:46:56 +01:00
|
|
|
is_before = (tm->tm_mon < 0);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
is_nonzero = TRUE;
|
2000-11-06 16:57:00 +01:00
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
2000-11-06 16:57:00 +01:00
|
|
|
if (tm->tm_mday != 0)
|
|
|
|
{
|
2001-01-17 17:46:56 +01:00
|
|
|
sprintf(cp, "%s%s%d day%s", (is_nonzero ? " " : ""),
|
|
|
|
((is_before && (tm->tm_mday > 0)) ? "+" : ""),
|
|
|
|
tm->tm_mday, ((tm->tm_mday != 1) ? "s" : ""));
|
2000-11-06 16:57:00 +01:00
|
|
|
cp += strlen(cp);
|
2001-01-17 17:46:56 +01:00
|
|
|
is_before = (tm->tm_mday < 0);
|
2000-11-06 16:57:00 +01:00
|
|
|
is_nonzero = TRUE;
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
2001-01-18 08:22:43 +01:00
|
|
|
if ((!is_nonzero) || (tm->tm_hour != 0) || (tm->tm_min != 0)
|
|
|
|
|| (tm->tm_sec != 0) || (fsec != 0))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
2001-03-22 05:01:46 +01:00
|
|
|
int minus = ((tm->tm_hour < 0) || (tm->tm_min < 0)
|
|
|
|
|| (tm->tm_sec < 0) || (fsec < 0));
|
2000-11-06 16:57:00 +01:00
|
|
|
|
|
|
|
sprintf(cp, "%s%s%02d:%02d", (is_nonzero ? " " : ""),
|
2001-01-18 08:22:43 +01:00
|
|
|
(minus ? "-" : (is_before ? "+" : "")),
|
2000-11-06 16:57:00 +01:00
|
|
|
abs(tm->tm_hour), abs(tm->tm_min));
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
cp += strlen(cp);
|
2000-11-06 16:57:00 +01:00
|
|
|
/* Mark as "non-zero" since the fields are now filled in */
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
is_nonzero = TRUE;
|
2000-11-06 16:57:00 +01:00
|
|
|
|
|
|
|
/* fractional seconds? */
|
|
|
|
if (fsec != 0)
|
|
|
|
{
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
sprintf(cp, ":%02d", abs(tm->tm_sec));
|
|
|
|
cp += strlen(cp);
|
2002-09-04 22:31:48 +02:00
|
|
|
sprintf(cp, ".%06d", ((fsec >= 0) ? fsec : -(fsec)));
|
2002-04-21 21:52:18 +02:00
|
|
|
#else
|
2000-11-06 16:57:00 +01:00
|
|
|
fsec += tm->tm_sec;
|
2001-10-18 19:30:21 +02:00
|
|
|
sprintf(cp, ":%013.10f", fabs(fsec));
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
2001-10-18 19:30:21 +02:00
|
|
|
TrimTrailingZeros(cp);
|
2000-11-06 16:57:00 +01:00
|
|
|
cp += strlen(cp);
|
|
|
|
is_nonzero = TRUE;
|
|
|
|
}
|
2001-10-18 19:30:21 +02:00
|
|
|
/* otherwise, integer seconds only? */
|
2000-11-06 16:57:00 +01:00
|
|
|
else if (tm->tm_sec != 0)
|
|
|
|
{
|
|
|
|
sprintf(cp, ":%02d", abs(tm->tm_sec));
|
|
|
|
cp += strlen(cp);
|
|
|
|
is_nonzero = TRUE;
|
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
}
|
|
|
|
break;
|
1997-10-25 07:16:09 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
case USE_POSTGRES_DATES:
|
|
|
|
default:
|
2000-11-06 16:57:00 +01:00
|
|
|
strcpy(cp, "@ ");
|
|
|
|
cp += strlen(cp);
|
|
|
|
|
|
|
|
if (tm->tm_year != 0)
|
|
|
|
{
|
2001-03-22 05:01:46 +01:00
|
|
|
int year = tm->tm_year;
|
|
|
|
|
2001-01-18 08:22:43 +01:00
|
|
|
if (tm->tm_year < 0)
|
|
|
|
year = -year;
|
2001-01-17 17:46:56 +01:00
|
|
|
|
|
|
|
sprintf(cp, "%d year%s", year,
|
|
|
|
((year != 1) ? "s" : ""));
|
2000-11-06 16:57:00 +01:00
|
|
|
cp += strlen(cp);
|
2001-01-17 17:46:56 +01:00
|
|
|
is_before = (tm->tm_year < 0);
|
2000-11-06 16:57:00 +01:00
|
|
|
is_nonzero = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tm->tm_mon != 0)
|
|
|
|
{
|
2001-03-22 05:01:46 +01:00
|
|
|
int mon = tm->tm_mon;
|
|
|
|
|
2001-01-18 08:22:43 +01:00
|
|
|
if (is_before || ((!is_nonzero) && (tm->tm_mon < 0)))
|
|
|
|
mon = -mon;
|
2001-01-17 17:46:56 +01:00
|
|
|
|
|
|
|
sprintf(cp, "%s%d mon%s", (is_nonzero ? " " : ""), mon,
|
|
|
|
((mon != 1) ? "s" : ""));
|
|
|
|
cp += strlen(cp);
|
2001-03-22 05:01:46 +01:00
|
|
|
if (!is_nonzero)
|
2000-11-06 16:57:00 +01:00
|
|
|
is_before = (tm->tm_mon < 0);
|
|
|
|
is_nonzero = TRUE;
|
|
|
|
}
|
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
if (tm->tm_mday != 0)
|
|
|
|
{
|
2001-03-22 05:01:46 +01:00
|
|
|
int day = tm->tm_mday;
|
|
|
|
|
2001-01-18 08:22:43 +01:00
|
|
|
if (is_before || ((!is_nonzero) && (tm->tm_mday < 0)))
|
|
|
|
day = -day;
|
2001-01-17 17:46:56 +01:00
|
|
|
|
|
|
|
sprintf(cp, "%s%d day%s", (is_nonzero ? " " : ""), day,
|
|
|
|
((day != 1) ? "s" : ""));
|
|
|
|
cp += strlen(cp);
|
2001-03-22 05:01:46 +01:00
|
|
|
if (!is_nonzero)
|
2000-11-06 16:57:00 +01:00
|
|
|
is_before = (tm->tm_mday < 0);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
is_nonzero = TRUE;
|
|
|
|
}
|
|
|
|
if (tm->tm_hour != 0)
|
|
|
|
{
|
2001-03-22 05:01:46 +01:00
|
|
|
int hour = tm->tm_hour;
|
|
|
|
|
2001-01-18 08:22:43 +01:00
|
|
|
if (is_before || ((!is_nonzero) && (tm->tm_hour < 0)))
|
|
|
|
hour = -hour;
|
2001-01-17 17:46:56 +01:00
|
|
|
|
|
|
|
sprintf(cp, "%s%d hour%s", (is_nonzero ? " " : ""), hour,
|
|
|
|
((hour != 1) ? "s" : ""));
|
|
|
|
cp += strlen(cp);
|
2001-03-22 05:01:46 +01:00
|
|
|
if (!is_nonzero)
|
2000-11-06 16:57:00 +01:00
|
|
|
is_before = (tm->tm_hour < 0);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
is_nonzero = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tm->tm_min != 0)
|
|
|
|
{
|
2001-03-22 05:01:46 +01:00
|
|
|
int min = tm->tm_min;
|
|
|
|
|
2001-01-18 08:22:43 +01:00
|
|
|
if (is_before || ((!is_nonzero) && (tm->tm_min < 0)))
|
|
|
|
min = -min;
|
2001-01-17 17:46:56 +01:00
|
|
|
|
|
|
|
sprintf(cp, "%s%d min%s", (is_nonzero ? " " : ""), min,
|
|
|
|
((min != 1) ? "s" : ""));
|
|
|
|
cp += strlen(cp);
|
2001-03-22 05:01:46 +01:00
|
|
|
if (!is_nonzero)
|
2000-11-06 16:57:00 +01:00
|
|
|
is_before = (tm->tm_min < 0);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
is_nonzero = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* fractional seconds? */
|
|
|
|
if (fsec != 0)
|
|
|
|
{
|
2002-04-21 21:52:18 +02:00
|
|
|
#ifdef HAVE_INT64_TIMESTAMP
|
|
|
|
if (is_before || ((!is_nonzero) && (tm->tm_sec < 0)))
|
|
|
|
tm->tm_sec = -tm->tm_sec;
|
|
|
|
sprintf(cp, "%s%d.%02d secs", (is_nonzero ? " " : ""),
|
|
|
|
tm->tm_sec, (((int) fsec) / 10000));
|
|
|
|
cp += strlen(cp);
|
|
|
|
if (!is_nonzero)
|
|
|
|
is_before = (fsec < 0);
|
|
|
|
#else
|
|
|
|
fsec_t sec;
|
2001-03-22 05:01:46 +01:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
fsec += tm->tm_sec;
|
2001-01-18 08:22:43 +01:00
|
|
|
sec = fsec;
|
|
|
|
if (is_before || ((!is_nonzero) && (fsec < 0)))
|
|
|
|
sec = -sec;
|
|
|
|
|
|
|
|
sprintf(cp, "%s%.2f secs", (is_nonzero ? " " : ""), sec);
|
2001-01-17 17:46:56 +01:00
|
|
|
cp += strlen(cp);
|
2001-03-22 05:01:46 +01:00
|
|
|
if (!is_nonzero)
|
2000-11-06 16:57:00 +01:00
|
|
|
is_before = (fsec < 0);
|
2002-04-21 21:52:18 +02:00
|
|
|
#endif
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
is_nonzero = TRUE;
|
|
|
|
|
|
|
|
/* otherwise, integer seconds only? */
|
|
|
|
}
|
|
|
|
else if (tm->tm_sec != 0)
|
|
|
|
{
|
2001-03-22 05:01:46 +01:00
|
|
|
int sec = tm->tm_sec;
|
|
|
|
|
2001-01-18 08:22:43 +01:00
|
|
|
if (is_before || ((!is_nonzero) && (tm->tm_sec < 0)))
|
|
|
|
sec = -sec;
|
2001-01-17 17:46:56 +01:00
|
|
|
|
|
|
|
sprintf(cp, "%s%d sec%s", (is_nonzero ? " " : ""), sec,
|
|
|
|
((sec != 1) ? "s" : ""));
|
|
|
|
cp += strlen(cp);
|
2001-03-22 05:01:46 +01:00
|
|
|
if (!is_nonzero)
|
2000-11-06 16:57:00 +01:00
|
|
|
is_before = (tm->tm_sec < 0);
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
is_nonzero = TRUE;
|
|
|
|
}
|
|
|
|
break;
|
1997-10-25 07:16:09 +02:00
|
|
|
}
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
|
|
|
|
/* identically zero? then put in a unitless zero... */
|
2001-03-22 05:01:46 +01:00
|
|
|
if (!is_nonzero)
|
1997-10-25 07:16:09 +02:00
|
|
|
{
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
strcat(cp, "0");
|
|
|
|
cp += strlen(cp);
|
1997-10-25 07:16:09 +02:00
|
|
|
}
|
|
|
|
|
2001-01-17 17:46:56 +01:00
|
|
|
if (is_before && (style == USE_POSTGRES_DATES))
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
{
|
|
|
|
strcat(cp, " ago");
|
|
|
|
cp += strlen(cp);
|
|
|
|
}
|
1997-10-25 07:16:09 +02:00
|
|
|
|
All regression tests pass except for rules.sql (unrelated).
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.
2000-02-16 19:17:02 +01:00
|
|
|
return 0;
|
2002-04-21 21:52:18 +02:00
|
|
|
} /* EncodeInterval() */
|
2001-06-18 18:14:44 +02:00
|
|
|
|
|
|
|
|
2002-05-17 03:19:19 +02:00
|
|
|
/* GUC assign_hook for australian_timezones */
|
|
|
|
bool
|
|
|
|
ClearDateCache(bool newval, bool doit, bool interactive)
|
2001-06-18 18:14:44 +02:00
|
|
|
{
|
2001-10-25 07:50:21 +02:00
|
|
|
int i;
|
2001-06-18 18:14:44 +02:00
|
|
|
|
2002-05-17 03:19:19 +02:00
|
|
|
if (doit)
|
|
|
|
{
|
|
|
|
for (i = 0; i < MAXDATEFIELDS; i++)
|
|
|
|
datecache[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
2001-06-18 18:14:44 +02:00
|
|
|
}
|
2003-01-16 01:26:49 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* We've been burnt by stupid errors in the ordering of the datetkn tables
|
|
|
|
* once too often. Arrange to check them during postmaster start.
|
|
|
|
*/
|
|
|
|
static bool
|
|
|
|
CheckDateTokenTable(const char *tablename, datetkn *base, unsigned int nel)
|
|
|
|
{
|
|
|
|
bool ok = true;
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
for (i = 1; i < nel; i++)
|
|
|
|
{
|
|
|
|
if (strncmp(base[i-1].token, base[i].token, TOKMAXLEN) >= 0)
|
|
|
|
{
|
|
|
|
elog(LOG, "Ordering error in %s table: \"%.*s\" >= \"%.*s\"",
|
|
|
|
tablename,
|
|
|
|
TOKMAXLEN, base[i-1].token,
|
|
|
|
TOKMAXLEN, base[i].token);
|
|
|
|
ok = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CheckDateTokenTables(void)
|
|
|
|
{
|
|
|
|
bool ok = true;
|
|
|
|
|
|
|
|
ok &= CheckDateTokenTable("datetktbl", datetktbl, szdatetktbl);
|
|
|
|
ok &= CheckDateTokenTable("deltatktbl", deltatktbl, szdeltatktbl);
|
|
|
|
ok &= CheckDateTokenTable("australian_datetktbl",
|
|
|
|
australian_datetktbl,
|
|
|
|
australian_szdatetktbl);
|
|
|
|
return ok;
|
|
|
|
}
|