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));
+}

Reply via email to