You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by ji...@apache.org on 2014/05/22 03:33:41 UTC

[5/6] TAJO-825: Datetime type refactoring. (Hyoungjun Kim via jihoon)

http://git-wip-us.apache.org/repos/asf/tajo/blob/526dca28/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeConstants.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeConstants.java b/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeConstants.java
new file mode 100644
index 0000000..353a500
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/util/datetime/DateTimeConstants.java
@@ -0,0 +1,631 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.tajo.util.datetime;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class DateTimeConstants {
+  public enum DateStyle {
+    XSO_DATES,
+    ISO_DATES,
+    SQL_DATES
+  };
+
+  public static final int[][]	DAY_OF_MONTH = {
+    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
+    {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}
+  };
+
+  /** assumes leap year every four years */
+  public static final double DAYS_PER_YEAR = 365.25;
+  public static final int MONTHS_PER_YEAR = 12;
+
+
+  // DAYS_PER_MONTH is very imprecise.  The more accurate value is
+  // 365.2425/12 = 30.436875, or '30 days_full 10:29:06'.  Right now we only
+  // return an integral number of days_full, but someday perhaps we should
+  // also return a 'time' value to be used as well.	ISO 8601 suggests
+  // 0 days_full.
+
+  /** assumes exactly 30 days_full per month */
+  public static final int DAYS_PER_MONTH	= 30;
+  /** assume no daylight savings time changes */
+  public static final int HOURS_PER_DAY = 24;
+
+  // This doesn't adjust for uneven daylight savings time intervals or leap
+  // seconds, and it crudely estimates leap years.  A more accurate value
+  // for days_full per years is 365.2422.
+
+  /** avoid floating-point computation */
+  public static final int SECS_PER_YEAR	= 36525 * 864;
+  public static final int SECS_PER_DAY = 86400;
+  public static final int SECS_PER_HOUR	= 3600;
+  public static final int SECS_PER_MINUTE = 60;
+  public static final int MINS_PER_HOUR	= 60;
+
+  public static final long MSECS_PER_DAY = 86400000L;
+  public static final long MSECS_PER_SEC = 1000L;
+
+  public static final long USECS_PER_DAY = 86400000000L;
+  public static final long USECS_PER_HOUR	= 3600000000L;
+  public static final long USECS_PER_MINUTE = 60000000L;
+  public static final long USECS_PER_SEC = 1000000L;
+
+  public static final int JULIAN_MINYEAR = -4713;
+  public static final int JULIAN_MINMONTH = 11;
+  public static final int JULIAN_MINDAY = 24;
+  public static final int JULIAN_MAXYEAR = 5874898;
+
+  /** == DateTimeUtil.toJulianDate(JULIAN_MAXYEAR, 1, 1) */
+  public static final int JULIAN_MAX = 2147483494;
+
+  // Julian-date equivalents of Day 0 in Unix and Postgres reckoning
+  /** == DateTimeUtil.toJulianDate(1970, 1, 1) */
+  public static final int UNIX_EPOCH_JDATE =     2440588;
+  /** == DateTimeUtil.toJulianDate(2000, 1, 1) */
+  public static final int POSTGRES_EPOCH_JDATE = 2451545;
+  /** == (POSTGRES_EPOCH_JDATE * SECS_PER_DAY) - (UNIX_EPOCH_JDATE * SECS_PER_DAY); */
+  public static final long SECS_DIFFERENCE_BETWEEN_JULIAN_AND_UNIXTIME = 946684800;
+
+  public static final int MAX_TZDISP_HOUR	=	15;	/* maximum allowed hour part */
+  public static final int TZDISP_LIMIT =	((MAX_TZDISP_HOUR + 1) * SECS_PER_HOUR);
+
+  public static final int INTERVAL_FULL_RANGE = 0x7FFF;
+
+  public static final String DAGO =			"ago";
+  public static final String DCURRENT =		"current";
+  public static final String EPOCH =			"epoch";
+  public static final String INVALID =			"invalid";
+  public static final String EARLY =			"-infinity";
+  public static final String LATE	=		"infinity";
+  public static final String NOW =				"now";
+  public static final String TODAY	=		"today";
+  public static final String TOMORROW	=	"tomorrow";
+  public static final String YESTERDAY =		"yesterday";
+  public static final String ZULU	 =		"zulu";
+
+  public static final String DMICROSEC	=	"usecond";
+  public static final String DMILLISEC =		"msecond";
+  public static final String DSECOND	=		"second";
+  public static final String DMINUTE =			"minute";
+  public static final String DHOUR	=		"hour";
+  public static final String DDAY	 =		"day";
+  public static final String DWEEK	=		"week";
+  public static final String DMONTH	=		"month";
+  public static final String DQUARTER	=	"quarter";
+  public static final String DYEAR		=	"year";
+  public static final String DDECADE	=		"decade";
+  public static final String DCENTURY	=	"century";
+  public static final String DMILLENNIUM	=	"millennium";
+  public static final String DA_D		=	"ad";
+  public static final String DB_C		=	"bc";
+  public static final String DTIMEZONE	=	"timezone";
+
+  public static final int DATEORDER_YMD = 0;
+  public static final int DATEORDER_DMY = 1;
+  public static final int DATEORDER_MDY = 2;
+
+  public static enum TokenField {
+    DECIMAL(0),
+
+    AM(0), PM(1), HR24(2),
+
+    AD(0), BC(1),
+
+    DTK_NUMBER(0),
+    DTK_STRING(1),
+
+    DTK_DATE(2),
+    DTK_TIME(3),
+    DTK_TZ(4),
+    DTK_AGO(5),
+
+    DTK_SPECIAL(6),
+    DTK_INVALID(7),
+    DTK_CURRENT(8),
+    DTK_EARLY(9),
+    DTK_LATE(10),
+    DTK_EPOCH(11),
+    DTK_NOW(12),
+    DTK_YESTERDAY(13),
+    DTK_TODAY(14),
+    DTK_TOMORROW(15),
+    DTK_ZULU(16),
+
+    DTK_DELTA(17),
+    DTK_SECOND(18),
+    DTK_MINUTE(19),
+    DTK_HOUR(20),
+    DTK_DAY(21),
+    DTK_WEEK(22),
+    DTK_MONTH(23),
+    DTK_QUARTER(24),
+    DTK_YEAR(25),
+    DTK_DECADE(26),
+    DTK_CENTURY(27),
+    DTK_MILLENNIUM(28),
+    DTK_MILLISEC(29),
+    DTK_MICROSEC(30),
+    DTK_JULIAN(31),
+
+    DTK_DOW(32),
+    DTK_DOY(33),
+    DTK_TZ_HOUR(34),
+    DTK_TZ_MINUTE(35),
+    DTK_ISOYEAR(36),
+    DTK_ISODOW(37),
+
+    RESERV(0),
+    MONTH(1),
+    YEAR(2),
+    DAY(3),
+    JULIAN(4),
+    TZ(5),
+    DTZ(6),
+    DTZMOD(7),
+    IGNORE_DTF(8),
+    AMPM(9),
+    HOUR(10),
+    MINUTE(11),
+    SECOND(12),
+    MILLISECOND(13),
+    MICROSECOND(14),
+    DOY(15),
+    DOW(16),
+    UNITS(17),
+    ADBC(18),
+    /* these are only for relative dates */
+    AGO(19),
+    ABS_BEFORE(20),
+    ABS_AFTER(21),
+    /* generic fields to help with parsing */
+    ISODATE(22),
+    ISOTIME(23),
+    /* these are only for parsing intervals */
+    WEEK(24),
+    DECADE(25),
+    CENTURY(26),
+    MILLENNIUM(27),
+    /* reserved for unrecognized string values */
+    UNKNOWN_FIELD(28);
+
+    int value;
+    TokenField(int value) {
+      this.value = value;
+    }
+
+    public int getValue() {
+      return value;
+    }
+  }
+
+  static Object datetktbl[][] = {
+    /*	text, token, lexval */
+    {"-infinity", TokenField.RESERV, TokenField.DTK_EARLY}, /* "-infinity" reserved for "early time" */
+    {"acsst", TokenField.DTZ, 42},	/* Cent. Australia */
+    {"acst", TokenField.DTZ, -16},		/* Atlantic/Porto Acre */
+    {"act", TokenField.TZ, -20},		/* Atlantic/Porto Acre */
+    {DA_D, TokenField.ADBC, TokenField.AD},			/* "ad" for years >= 0 */
+    {"adt", TokenField.DTZ, -12},		/* Atlantic Daylight Time */
+    {"aesst", TokenField.DTZ, 44},	/* E. Australia */
+    {"aest", TokenField.TZ, 40},		/* Australia Eastern Std Time */
+    {"aft", TokenField.TZ, 18},		/* Kabul */
+    {"ahst", TokenField.TZ, -40},		/* Alaska-Hawaii Std Time */
+    {"akdt", TokenField.DTZ, -32},		/* Alaska Daylight Time */
+    {"akst", TokenField.DTZ, -36},		/* Alaska Standard Time */
+    {"allballs", TokenField.RESERV, TokenField.DTK_ZULU},		/* 00:00:00 */
+    {"almst", TokenField.TZ, 28},		/* Almaty Savings Time */
+    {"almt", TokenField.TZ, 24},		/* Almaty Time */
+    {"am", TokenField.AMPM, TokenField.AM},
+    {"amst", TokenField.DTZ, 20},		/* Armenia Summer Time (Yerevan) */
+    {"amt", TokenField.TZ, 16},		/* Armenia Time (Yerevan) */
+    {"anast", TokenField.DTZ, 52},	/* Anadyr Summer Time (Russia) */
+    {"anat", TokenField.TZ, 48},		/* Anadyr Time (Russia) */
+    {"apr", TokenField.MONTH, 4},
+    {"april", TokenField.MONTH, 4},
+    {"art", TokenField.TZ, -12},		/* Argentina Time */
+    {"ast", TokenField.TZ, -16},		/* Atlantic Std Time (Canada) */
+    {"at", TokenField.IGNORE_DTF, 0},		/* "at" (throwaway) */
+    {"aug", TokenField.MONTH, 8},
+    {"august", TokenField.MONTH, 8},
+    {"awsst", TokenField.DTZ, 36},	/* W. Australia */
+    {"awst", TokenField.TZ, 32},		/* W. Australia */
+    {"awt", TokenField.DTZ, -12},
+    {"azost", TokenField.DTZ, 0},		/* Azores Summer Time */
+    {"azot", TokenField.TZ, -4},		/* Azores Time */
+    {"azst", TokenField.DTZ, 20},		/* Azerbaijan Summer Time */
+    {"azt", TokenField.TZ, 16},		/* Azerbaijan Time */
+    {DB_C, TokenField.ADBC, TokenField.BC},			/* "bc" for years < 0 */
+    {"bdst", TokenField.TZ, 8},		/* British Double Summer Time */
+    {"bdt", TokenField.TZ, 24},		/* Dacca */
+    {"bnt", TokenField.TZ, 32},		/* Brunei Darussalam Time */
+    {"bort", TokenField.TZ, 32},		/* Borneo Time (Indonesia) */
+    {"bot", TokenField.TZ, -16},		/* Bolivia Time */
+    {"bra", TokenField.TZ, -12},		/* Brazil Time */
+    {"bst", TokenField.DTZ, 4},		/* British Summer Time */
+    {"bt", TokenField.TZ, 12},		/* Baghdad Time */
+    {"btt", TokenField.TZ, 24},		/* Bhutan Time */
+    {"cadt", TokenField.DTZ, 42},		/* Central Australian DST */
+    {"cast", TokenField.TZ, 38},		/* Central Australian ST */
+    {"cat", TokenField.TZ, -40},		/* Central Alaska Time */
+    {"cct", TokenField.TZ, 32},		/* China Coast Time */
+    {"cdt", TokenField.DTZ, -20},		/* Central Daylight Time */
+    {"cest", TokenField.DTZ, 8},		/* Central European Dayl.Time */
+    {"cet", TokenField.TZ, 4},		/* Central European Time */
+    {"cetdst", TokenField.DTZ, 8},	/* Central European Dayl.Time */
+    {"chadt", TokenField.DTZ, 55},	/* Chatham Island Daylight Time (13:45) */
+    {"chast", TokenField.TZ, 51},		/* Chatham Island Time (12:45) */
+    {"ckt", TokenField.TZ, 48},		/* Cook Islands Time */
+    {"clst", TokenField.DTZ, -12},		/* Chile Summer Time */
+    {"clt", TokenField.TZ, -16},		/* Chile Time */
+    {"cot", TokenField.TZ, -20},		/* Columbia Time */
+    {"cst", TokenField.TZ, -24},		/* Central Standard Time */
+    {DCURRENT, TokenField.RESERV, TokenField.DTK_CURRENT},	/* "current" is always now */
+    {"cvt", TokenField.TZ, 28},		/* Christmas Island Time (Indian Ocean) */
+    {"cxt", TokenField.TZ, 28},		/* Christmas Island Time (Indian Ocean) */
+    {"d", TokenField.UNITS, TokenField.DTK_DAY},		/* "day of month" for ISO input */
+    {"davt", TokenField.TZ, 28},		/* Davis Time (Antarctica) */
+    {"ddut", TokenField.TZ, 40},		/* Dumont-d'Urville Time (Antarctica) */
+    {"dec", TokenField.MONTH, 12},
+    {"december", TokenField.MONTH, 12},
+    {"dnt", TokenField.TZ, 4},		/* Dansk Normal Tid */
+    {"dow", TokenField.RESERV, TokenField.DTK_DOW},	/* day of week */
+    {"doy", TokenField.RESERV, TokenField.DTK_DOY},	/* day of year */
+    {"dst", TokenField.DTZMOD, 6},
+    {"easst", TokenField.DTZ, -20},	/* Easter Island Summer Time */
+    {"east", TokenField.TZ, -24},		/* Easter Island Time */
+    {"eat", TokenField.TZ, 12},		/* East Africa Time */
+    {"edt", TokenField.DTZ, -16},		/* Eastern Daylight Time */
+    {"eest", TokenField.DTZ, 12},		/* Eastern Europe Summer Time */
+    {"eet", TokenField.TZ, 8},		/* East. Europe, USSR Zone 1 */
+    {"eetdst", TokenField.DTZ, 12},	/* Eastern Europe Daylight Time */
+    {"egst", TokenField.DTZ, 0},		/* East Greenland Summer Time */
+    {"egt", TokenField.TZ, -4},		/* East Greenland Time */
+    {EPOCH, TokenField.RESERV, TokenField.DTK_EPOCH}, /* "epoch" reserved for system epoch time */
+    {"est", TokenField.TZ, -20},		/* Eastern Standard Time */
+    {"feb", TokenField.MONTH, 2},
+    {"february", TokenField.MONTH, 2},
+    {"fjst", TokenField.DTZ, -52},		/* Fiji Summer Time (13 hour offset!) */
+    {"fjt", TokenField.TZ, -48},		/* Fiji Time */
+    {"fkst", TokenField.DTZ, -12},		/* Falkland Islands Summer Time */
+    {"fkt", TokenField.TZ, -8},		/* Falkland Islands Time */
+    {"fri", TokenField.DOW, 5},
+    {"friday", TokenField.DOW, 5},
+    {"fst", TokenField.TZ, 4},		/* French Summer Time */
+    {"fwt", TokenField.DTZ, 8},		/* French Winter Time  */
+    {"galt", TokenField.TZ, -24},		/* Galapagos Time */
+    {"gamt", TokenField.TZ, -36},		/* Gambier Time */
+    {"gest", TokenField.DTZ, 20},		/* Georgia Summer Time */
+    {"get", TokenField.TZ, 16},		/* Georgia Time */
+    {"gft", TokenField.TZ, -12},		/* French Guiana Time */
+    {"gilt", TokenField.TZ, 48},		/* Gilbert Islands Time */
+    {"gmt", TokenField.TZ, 0},		/* Greenwish Mean Time */
+    {"gst", TokenField.TZ, 40},		/* Guam Std Time, USSR Zone 9 */
+    {"gyt", TokenField.TZ, -16},		/* Guyana Time */
+    {"h", TokenField.UNITS, TokenField.DTK_HOUR},		/* "hour" */
+    {"hdt", TokenField.DTZ, -36},		/* Hawaii/Alaska Daylight Time */
+    {"hkt", TokenField.TZ, 32},		/* Hong Kong Time */
+    {"hst", TokenField.TZ, -40},		/* Hawaii Std Time */
+    {"ict", TokenField.TZ, 28},		/* Indochina Time */
+    {"idle", TokenField.TZ, 48},		/* Intl. Date Line, East */
+    {"idlw", TokenField.TZ, -48},		/* Intl. Date Line, West */
+    {LATE, TokenField.RESERV, TokenField.DTK_LATE},	/* "infinity" reserved for "late time" */
+    {INVALID, TokenField.RESERV, TokenField.DTK_INVALID},		/* "invalid" reserved for bad time */
+    {"iot", TokenField.TZ, 20},		/* Indian Chagos Time */
+    {"irkst", TokenField.DTZ, 36},	/* Irkutsk Summer Time */
+    {"irkt", TokenField.TZ, 32},		/* Irkutsk Time */
+    {"irt", TokenField.TZ, 14},		/* Iran Time */
+    {"isodow", TokenField.RESERV, TokenField.DTK_ISODOW},		/* ISO day of week, Sunday == 7 */
+    {"ist", TokenField.TZ, 8},		/* Israel */
+    {"it", TokenField.TZ, 14},		/* Iran Time */
+    {"j", TokenField.UNITS, TokenField.DTK_JULIAN},
+    {"jan", TokenField.MONTH, 1},
+    {"january", TokenField.MONTH, 1},
+    {"javt", TokenField.TZ, 28},		/* Java Time (07:00? see JT) */
+    {"jayt", TokenField.TZ, 36},		/* Jayapura Time (Indonesia) */
+    {"jd", TokenField.UNITS, TokenField.DTK_JULIAN},
+    {"jst", TokenField.TZ, 36},		/* Japan Std Time,USSR Zone 8 */
+    {"jt", TokenField.TZ, 30},		/* Java Time (07:30? see JAVT) */
+    {"jul", TokenField.MONTH, 7},
+    {"julian", TokenField.UNITS, TokenField.DTK_JULIAN},
+    {"july", TokenField.MONTH, 7},
+    {"jun", TokenField.MONTH, 6},
+    {"june", TokenField.MONTH, 6},
+    {"kdt", TokenField.DTZ, 40},		/* Korea Daylight Time */
+    {"kgst", TokenField.DTZ, 24},		/* Kyrgyzstan Summer Time */
+    {"kgt", TokenField.TZ, 20},		/* Kyrgyzstan Time */
+    {"kost", TokenField.TZ, 48},		/* Kosrae Time */
+    {"krast", TokenField.DTZ, 28},	/* Krasnoyarsk Summer Time */
+    {"krat", TokenField.TZ, 32},		/* Krasnoyarsk Standard Time */
+    {"kst", TokenField.TZ, 36},		/* Korea Standard Time */
+    {"lhdt", TokenField.DTZ, 44},		/* Lord Howe Daylight Time, Australia */
+    {"lhst", TokenField.TZ, 42},		/* Lord Howe Standard Time, Australia */
+    {"ligt", TokenField.TZ, 40},		/* From Melbourne, Australia */
+    {"lint", TokenField.TZ, 56},		/* Line Islands Time (Kiribati; +14 hours!) */
+    {"lkt", TokenField.TZ, 24},		/* Lanka Time */
+    {"m", TokenField.UNITS, TokenField.DTK_MONTH},	/* "month" for ISO input */
+    {"magst", TokenField.DTZ, 48},	/* Magadan Summer Time */
+    {"magt", TokenField.TZ, 44},		/* Magadan Time */
+    {"mar", TokenField.MONTH, 3},
+    {"march", TokenField.MONTH, 3},
+    {"mart", TokenField.TZ, -38},		/* Marquesas Time */
+    {"mawt", TokenField.TZ, 24},		/* Mawson, Antarctica */
+    {"may", TokenField.MONTH, 5},
+    {"mdt", TokenField.DTZ, -24},		/* Mountain Daylight Time */
+    {"mest", TokenField.DTZ, 8},		/* Middle Europe Summer Time */
+    {"met", TokenField.TZ, 4},		/* Middle Europe Time */
+    {"metdst", TokenField.DTZ, 8},	/* Middle Europe Daylight Time */
+    {"mewt", TokenField.TZ, 4},		/* Middle Europe Winter Time */
+    {"mez", TokenField.TZ, 4},		/* Middle Europe Zone */
+    {"mht", TokenField.TZ, 48},		/* Kwajalein */
+    {"mm", TokenField.UNITS, TokenField.DTK_MINUTE},	/* "minute" for ISO input */
+    {"mmt", TokenField.TZ, 26},		/* Myannar Time */
+    {"mon", TokenField.DOW, 1},
+    {"monday", TokenField.DOW, 1},
+    {"mpt", TokenField.TZ, 40},		/* North Mariana Islands Time */
+    {"msd", TokenField.DTZ, 16},		/* Moscow Summer Time */
+    {"msk", TokenField.TZ, 12},		/* Moscow Time */
+    {"mst", TokenField.TZ, -28},		/* Mountain Standard Time */
+    {"mt", TokenField.TZ, 34},		/* Moluccas Time */
+    {"mut", TokenField.TZ, 16},		/* Mauritius Island Time */
+    {"mvt", TokenField.TZ, 20},		/* Maldives Island Time */
+    {"myt", TokenField.TZ, 32},		/* Malaysia Time */
+    {"nct", TokenField.TZ, 44},		/* New Caledonia Time */
+    {"ndt", TokenField.DTZ, -10},		/* Nfld. Daylight Time */
+    {"nft", TokenField.TZ, -14},		/* Newfoundland Standard Time */
+    {"nor", TokenField.TZ, 4},		/* Norway Standard Time */
+    {"nov", TokenField.MONTH, 11},
+    {"november", TokenField.MONTH, 11},
+    {"novst", TokenField.DTZ, 28},	/* Novosibirsk Summer Time */
+    {"novt", TokenField.TZ, 24},		/* Novosibirsk Standard Time */
+    {NOW, TokenField.RESERV, TokenField.DTK_NOW},		/* current transaction time */
+    {"npt", TokenField.TZ, 23},		/* Nepal Standard Time (GMT-5:45) */
+    {"nst", TokenField.TZ, -14},		/* Nfld. Standard Time */
+    {"nt", TokenField.TZ, -44},		/* Nome Time */
+    {"nut", TokenField.TZ, -44},		/* Niue Time */
+    {"nzdt", TokenField.DTZ, 52},		/* New Zealand Daylight Time */
+    {"nzst", TokenField.TZ, 48},		/* New Zealand Standard Time */
+    {"nzt", TokenField.TZ, 48},		/* New Zealand Time */
+    {"oct", TokenField.MONTH, 10},
+    {"october", TokenField.MONTH, 10},
+    {"omsst", TokenField.DTZ, 28},	/* Omsk Summer Time */
+    {"omst", TokenField.TZ, 24},		/* Omsk Time */
+    {"on", TokenField.IGNORE_DTF, 0},		/* "on" (throwaway) */
+    {"pdt", TokenField.DTZ, -28},		/* Pacific Daylight Time */
+    {"pet", TokenField.TZ, -20},		/* Peru Time */
+    {"petst", TokenField.DTZ, 52},	/* Petropavlovsk-Kamchatski Summer Time */
+    {"pett", TokenField.TZ, 48},		/* Petropavlovsk-Kamchatski Time */
+    {"pgt", TokenField.TZ, 40},		/* Papua New Guinea Time */
+    {"phot", TokenField.TZ, 52},		/* Phoenix Islands (Kiribati) Time */
+    {"pht", TokenField.TZ, 32},		/* Philippine Time */
+    {"pkt", TokenField.TZ, 20},		/* Pakistan Time */
+    {"pm", TokenField.AMPM, TokenField.PM},
+    {"pmdt", TokenField.DTZ, -8},		/* Pierre & Miquelon Daylight Time */
+    {"pont", TokenField.TZ, 44},		/* Ponape Time (Micronesia) */
+    {"pst", TokenField.TZ, -32},		/* Pacific Standard Time */
+    {"pwt", TokenField.TZ, 36},		/* Palau Time */
+    {"pyst", TokenField.DTZ, -12},		/* Paraguay Summer Time */
+    {"pyt", TokenField.TZ, -16},		/* Paraguay Time */
+    {"ret", TokenField.DTZ, 16},		/* Reunion Island Time */
+    {"s", TokenField.UNITS, TokenField.DTK_SECOND},	/* "seconds" for ISO input */
+    {"sadt", TokenField.DTZ, 42},		/* S. Australian Dayl. Time */
+    {"sast", TokenField.TZ, 38},		/* South Australian Std Time */
+    {"sat", TokenField.DOW, 6},
+    {"saturday", TokenField.DOW, 6},
+    {"sct", TokenField.DTZ, 16},		/* Mahe Island Time */
+    {"sep", TokenField.MONTH, 9},
+    {"sept", TokenField.MONTH, 9},
+    {"september", TokenField.MONTH, 9},
+    {"set", TokenField.TZ, -4},		/* Seychelles Time ?? */
+    {"sst", TokenField.DTZ, 8},		/* Swedish Summer Time */
+    {"sun", TokenField.DOW, 0},
+    {"sunday", TokenField.DOW, 0},
+    {"swt", TokenField.TZ, 4},		/* Swedish Winter Time */
+    {"t", TokenField.ISOTIME, TokenField.DTK_TIME},	/* Filler for ISO time fields */
+    {"tft", TokenField.TZ, 20},		/* Kerguelen Time */
+    {"that", TokenField.TZ, -40},		/* Tahiti Time */
+    {"thu", TokenField.DOW, 4},
+    {"thur", TokenField.DOW, 4},
+    {"thurs", TokenField.DOW, 4},
+    {"thursday", TokenField.DOW, 4},
+    {"tjt", TokenField.TZ, 20},		/* Tajikistan Time */
+    {"tkt", TokenField.TZ, -40},		/* Tokelau Time */
+    {"tmt", TokenField.TZ, 20},		/* Turkmenistan Time */
+    {TODAY, TokenField.RESERV, TokenField.DTK_TODAY}, /* midnight */
+    {TOMORROW, TokenField.RESERV, TokenField.DTK_TOMORROW},	/* tomorrow midnight */
+    {"truk", TokenField.TZ, 40},		/* Truk Time */
+    {"tue", TokenField.DOW, 2},
+    {"tues", TokenField.DOW, 2},
+    {"tuesday", TokenField.DOW, 2},
+    {"tvt", TokenField.TZ, 48},		/* Tuvalu Time */
+    {"ulast", TokenField.DTZ, 36},	/* Ulan Bator Summer Time */
+    {"ulat", TokenField.TZ, 32},		/* Ulan Bator Time */
+    {"undefined", TokenField.RESERV, TokenField.DTK_INVALID}, /* pre-v6.1 invalid time */
+    {"ut", TokenField.TZ, 0},
+    {"utc", TokenField.TZ, 0},
+    {"uyst", TokenField.DTZ, -8},		/* Uruguay Summer Time */
+    {"uyt", TokenField.TZ, -12},		/* Uruguay Time */
+    {"uzst", TokenField.DTZ, 24},		/* Uzbekistan Summer Time */
+    {"uzt", TokenField.TZ, 20},		/* Uzbekistan Time */
+    {"vet", TokenField.TZ, -16},		/* Venezuela Time */
+    {"vlast", TokenField.DTZ, 44},	/* Vladivostok Summer Time */
+    {"vlat", TokenField.TZ, 40},		/* Vladivostok Time */
+    {"vut", TokenField.TZ, 44},		/* Vanuata Time */
+    {"wadt", TokenField.DTZ, 32},		/* West Australian DST */
+    {"wakt", TokenField.TZ, 48},		/* Wake Time */
+    {"wast", TokenField.TZ, 28},		/* West Australian Std Time */
+    {"wat", TokenField.TZ, -4},		/* West Africa Time */
+    {"wdt", TokenField.DTZ, 36},		/* West Australian DST */
+    {"wed", TokenField.DOW, 3},
+    {"wednesday", TokenField.DOW, 3},
+    {"weds", TokenField.DOW, 3},
+    {"west", TokenField.DTZ, 4},		/* Western Europe Summer Time */
+    {"wet", TokenField.TZ, 0},		/* Western Europe */
+    {"wetdst", TokenField.DTZ, 4},	/* Western Europe Daylight Savings Time */
+    {"wft", TokenField.TZ, 48},		/* Wallis and Futuna Time */
+    {"wgst", TokenField.DTZ, -8},		/* West Greenland Summer Time */
+    {"wgt", TokenField.TZ, -12},		/* West Greenland Time */
+    {"wst", TokenField.TZ, 32},		/* West Australian Standard Time */
+    {"y", TokenField.UNITS, TokenField.DTK_YEAR},		/* "year" for ISO input */
+    {"yakst", TokenField.DTZ, 40},	/* Yakutsk Summer Time */
+    {"yakt", TokenField.TZ, 36},		/* Yakutsk Time */
+    {"yapt", TokenField.TZ, 40},		/* Yap Time (Micronesia) */
+    {"ydt", TokenField.DTZ, -32},		/* Yukon Daylight Time */
+    {"yekst", TokenField.DTZ, 24},	/* Yekaterinburg Summer Time */
+    {"yekt", TokenField.TZ, 20},		/* Yekaterinburg Time */
+    {YESTERDAY, TokenField.RESERV, TokenField.DTK_YESTERDAY}, /* yesterday midnight */
+    {"yst", TokenField.TZ, -36},		/* Yukon Standard Time */
+    {"z", TokenField.TZ, 0},			/* time zone tag per ISO-8601 */
+    {"zp4", TokenField.TZ, -16},		/* UTC +4  hours. */
+    {"zp5", TokenField.TZ, -20},		/* UTC +5  hours. */
+    {"zp6", TokenField.TZ, -24},		/* UTC +6  hours. */
+    {ZULU, TokenField.TZ, 0},			/* UTC */
+  };
+
+  static Object[][] deltatktbl = {
+	  /* text, token, lexval */
+    {"@", TokenField.IGNORE_DTF, 0},		/* postgres relative prefix */
+    {DAGO, TokenField.AGO, 0},				/* "ago" indicates negative time offset */
+    {"c", TokenField.UNITS, TokenField.DTK_CENTURY},	/* "century" relative */
+    {"cent", TokenField.UNITS, TokenField.DTK_CENTURY},		/* "century" relative */
+    {"centuries", TokenField.UNITS, TokenField.DTK_CENTURY},	/* "centuries" relative */
+    {DCENTURY, TokenField.UNITS, TokenField.DTK_CENTURY},		/* "century" relative */
+    {"d", TokenField.UNITS, TokenField.DTK_DAY},		/* "day" relative */
+    {DDAY, TokenField.UNITS, TokenField.DTK_DAY},		/* "day" relative */
+    {"days_full", TokenField.UNITS, TokenField.DTK_DAY},	/* "days_full" relative */
+    {"dec", TokenField.UNITS, TokenField.DTK_DECADE}, /* "decade" relative */
+    {DDECADE, TokenField.UNITS, TokenField.DTK_DECADE},		/* "decade" relative */
+    {"decades", TokenField.UNITS, TokenField.DTK_DECADE},		/* "decades" relative */
+    {"decs", TokenField.UNITS, TokenField.DTK_DECADE},	/* "decades" relative */
+    {"h", TokenField.UNITS, TokenField.DTK_HOUR},		/* "hour" relative */
+    {DHOUR, TokenField.UNITS, TokenField.DTK_HOUR},	/* "hour" relative */
+    {"hours", TokenField.UNITS, TokenField.DTK_HOUR}, /* "hours" relative */
+    {"hr", TokenField.UNITS, TokenField.DTK_HOUR},	/* "hour" relative */
+    {"hrs", TokenField.UNITS, TokenField.DTK_HOUR},	/* "hours" relative */
+    {INVALID, TokenField.RESERV, TokenField.DTK_INVALID},		/* reserved for invalid time */
+    {"m", TokenField.UNITS, TokenField.DTK_MINUTE},	/* "minute" relative */
+    {"microsecon", TokenField.UNITS, TokenField.DTK_MICROSEC},		/* "microsecond" relative */
+    {"mil", TokenField.UNITS, TokenField.DTK_MILLENNIUM},		/* "millennium" relative */
+    {"millennia", TokenField.UNITS, TokenField.DTK_MILLENNIUM},		/* "millennia" relative */
+    {DMILLENNIUM, TokenField.UNITS, TokenField.DTK_MILLENNIUM},		/* "millennium" relative */
+    {"millisecon", TokenField.UNITS, TokenField.DTK_MILLISEC},		/* relative */
+    {"mils", TokenField.UNITS, TokenField.DTK_MILLENNIUM},	/* "millennia" relative */
+    {"min", TokenField.UNITS, TokenField.DTK_MINUTE}, /* "minute" relative */
+    {"mins", TokenField.UNITS, TokenField.DTK_MINUTE},	/* "minutes" relative */
+    {DMINUTE, TokenField.UNITS, TokenField.DTK_MINUTE},		/* "minute" relative */
+    {"minutes", TokenField.UNITS, TokenField.DTK_MINUTE},		/* "minutes" relative */
+    {"mon", TokenField.UNITS, TokenField.DTK_MONTH},	/* "months_short" relative */
+    {"mons", TokenField.UNITS, TokenField.DTK_MONTH}, /* "months_short" relative */
+    {DMONTH, TokenField.UNITS, TokenField.DTK_MONTH}, /* "month" relative */
+    {"months_short", TokenField.UNITS, TokenField.DTK_MONTH},
+    {"ms", TokenField.UNITS, TokenField.DTK_MILLISEC},
+    {"msec", TokenField.UNITS, TokenField.DTK_MILLISEC},
+    {DMILLISEC, TokenField.UNITS, TokenField.DTK_MILLISEC},
+    {"mseconds", TokenField.UNITS, TokenField.DTK_MILLISEC},
+    {"msecs", TokenField.UNITS, TokenField.DTK_MILLISEC},
+    {"qtr", TokenField.UNITS, TokenField.DTK_QUARTER},	/* "quarter" relative */
+    {DQUARTER, TokenField.UNITS, TokenField.DTK_QUARTER},		/* "quarter" relative */
+    {"s", TokenField.UNITS, TokenField.DTK_SECOND},
+    {"sec", TokenField.UNITS, TokenField.DTK_SECOND},
+    {DSECOND, TokenField.UNITS, TokenField.DTK_SECOND},
+    {"seconds", TokenField.UNITS, TokenField.DTK_SECOND},
+    {"secs", TokenField.UNITS, TokenField.DTK_SECOND},
+    {DTIMEZONE, TokenField.UNITS, TokenField.DTK_TZ}, /* "timezone" time offset */
+    {"timezone_h", TokenField.UNITS, TokenField.DTK_TZ_HOUR}, /* timezone hour units */
+    {"timezone_m", TokenField.UNITS, TokenField.DTK_TZ_MINUTE},		/* timezone minutes units */
+    {"undefined", TokenField.RESERV, TokenField.DTK_INVALID}, /* pre-v6.1 invalid time */
+    {"us", TokenField.UNITS, TokenField.DTK_MICROSEC},	/* "microsecond" relative */
+    {"usec", TokenField.UNITS, TokenField.DTK_MICROSEC},		/* "microsecond" relative */
+    {DMICROSEC, TokenField.UNITS, TokenField.DTK_MICROSEC},	/* "microsecond" relative */
+    {"useconds", TokenField.UNITS, TokenField.DTK_MICROSEC},	/* "microseconds" relative */
+    {"usecs", TokenField.UNITS, TokenField.DTK_MICROSEC},		/* "microseconds" relative */
+    {"w", TokenField.UNITS, TokenField.DTK_WEEK},		/* "week" relative */
+    {DWEEK, TokenField.UNITS, TokenField.DTK_WEEK},	/* "week" relative */
+    {"weeks", TokenField.UNITS, TokenField.DTK_WEEK}, /* "weeks" relative */
+    {"y", TokenField.UNITS, TokenField.DTK_YEAR},		/* "year" relative */
+    {DYEAR, TokenField.UNITS, TokenField.DTK_YEAR},	/* "year" relative */
+    {"years", TokenField.UNITS, TokenField.DTK_YEAR}, /* "years" relative */
+    {"yr", TokenField.UNITS, TokenField.DTK_YEAR},	/* "year" relative */
+    {"yrs", TokenField.UNITS, TokenField.DTK_YEAR},	/* "years" relative */
+  };
+
+  public static class DateToken {
+    String key;
+    TokenField type;
+    int value;
+    TokenField valueType;
+
+    public String getKey() {
+      return key;
+    }
+
+    public TokenField getType() {
+      return type;
+    }
+
+    public int getValue() {
+      return value;
+    }
+
+    public TokenField getValueType() {
+      return valueType;
+    }
+  }
+  public static Map<String, DateToken> dateTokenMap = new HashMap<String, DateToken>();
+
+  static {
+    for (Object[] eachToken: datetktbl) {
+      DateToken dateToken = new DateToken();
+      dateToken.key = eachToken[0].toString();
+      dateToken.type = (TokenField)eachToken[1];
+      if (eachToken[2] instanceof TokenField) {
+        dateToken.valueType = (TokenField)eachToken[2];
+        dateToken.value = dateToken.valueType.getValue();
+      } else {
+        dateToken.valueType = TokenField.DECIMAL;
+        dateToken.value = ((Integer)eachToken[2]).intValue();
+      }
+      dateTokenMap.put(dateToken.key, dateToken);
+    }
+
+    for (Object[] eachToken: deltatktbl) {
+      DateToken dateToken = new DateToken();
+      dateToken.key = eachToken[0].toString();
+      dateToken.type = (TokenField)eachToken[1];
+      if (eachToken[2] instanceof TokenField) {
+        dateToken.valueType = (TokenField)eachToken[2];
+        dateToken.value = dateToken.valueType.getValue();
+      } else {
+        dateToken.valueType = TokenField.DECIMAL;
+        dateToken.value = ((Integer)eachToken[2]).intValue();
+      }
+      dateTokenMap.put(dateToken.key, dateToken);
+    }
+  }
+
+  public static int INTERVAL_MASK(TokenField t) { return (1 << (t.getValue())); }
+  public static int DTK_M(TokenField t) { return (0x01 << (t.getValue())); }
+
+  public static final int DTK_ALL_SECS_M = (DTK_M(TokenField.SECOND) |
+        DTK_M(TokenField.MILLISECOND) |
+        DTK_M(TokenField.MICROSECOND));
+  public static final int DTK_DATE_M = (DTK_M(TokenField.YEAR) | DTK_M(TokenField.MONTH) | DTK_M(TokenField.DAY));
+  public static final int DTK_TIME_M = (DTK_M(TokenField.HOUR) | DTK_M(TokenField.MINUTE) | DTK_M(TokenField.SECOND));
+}