extensions/sqlite/sqlite-source/date.c
author David Anderson <dvander@alliedmods.net>
Sun Jul 29 01:15:31 2007 +0000 (2007-07-29)
changeset 1203 633c25ce6405
child 1645 27307df4d711
permissions -rw-r--r--
initial import of sqlite extension
     1 /*
     2 ** 2003 October 31
     3 **
     4 ** The author disclaims copyright to this source code.  In place of
     5 ** a legal notice, here is a blessing:
     6 **
     7 **    May you do good and not evil.
     8 **    May you find forgiveness for yourself and forgive others.
     9 **    May you share freely, never taking more than you give.
    10 **
    11 *************************************************************************
    12 ** This file contains the C functions that implement date and time
    13 ** functions for SQLite.  
    14 **
    15 ** There is only one exported symbol in this file - the function
    16 ** sqlite3RegisterDateTimeFunctions() found at the bottom of the file.
    17 ** All other code has file scope.
    18 **
    19 ** $Id$
    20 **
    21 ** SQLite processes all times and dates as Julian Day numbers.  The
    22 ** dates and times are stored as the number of days since noon
    23 ** in Greenwich on November 24, 4714 B.C. according to the Gregorian
    24 ** calendar system. 
    25 **
    26 ** 1970-01-01 00:00:00 is JD 2440587.5
    27 ** 2000-01-01 00:00:00 is JD 2451544.5
    28 **
    29 ** This implemention requires years to be expressed as a 4-digit number
    30 ** which means that only dates between 0000-01-01 and 9999-12-31 can
    31 ** be represented, even though julian day numbers allow a much wider
    32 ** range of dates.
    33 **
    34 ** The Gregorian calendar system is used for all dates and times,
    35 ** even those that predate the Gregorian calendar.  Historians usually
    36 ** use the Julian calendar for dates prior to 1582-10-15 and for some
    37 ** dates afterwards, depending on locale.  Beware of this difference.
    38 **
    39 ** The conversion algorithms are implemented based on descriptions
    40 ** in the following text:
    41 **
    42 **      Jean Meeus
    43 **      Astronomical Algorithms, 2nd Edition, 1998
    44 **      ISBM 0-943396-61-1
    45 **      Willmann-Bell, Inc
    46 **      Richmond, Virginia (USA)
    47 */
    48 #include "sqliteInt.h"
    49 #include "os.h"
    50 #include <ctype.h>
    51 #include <stdlib.h>
    52 #include <assert.h>
    53 #include <time.h>
    54 
    55 #ifndef SQLITE_OMIT_DATETIME_FUNCS
    56 
    57 /*
    58 ** A structure for holding a single date and time.
    59 */
    60 typedef struct DateTime DateTime;
    61 struct DateTime {
    62   double rJD;      /* The julian day number */
    63   int Y, M, D;     /* Year, month, and day */
    64   int h, m;        /* Hour and minutes */
    65   int tz;          /* Timezone offset in minutes */
    66   double s;        /* Seconds */
    67   char validYMD;   /* True if Y,M,D are valid */
    68   char validHMS;   /* True if h,m,s are valid */
    69   char validJD;    /* True if rJD is valid */
    70   char validTZ;    /* True if tz is valid */
    71 };
    72 
    73 
    74 /*
    75 ** Convert zDate into one or more integers.  Additional arguments
    76 ** come in groups of 5 as follows:
    77 **
    78 **       N       number of digits in the integer
    79 **       min     minimum allowed value of the integer
    80 **       max     maximum allowed value of the integer
    81 **       nextC   first character after the integer
    82 **       pVal    where to write the integers value.
    83 **
    84 ** Conversions continue until one with nextC==0 is encountered.
    85 ** The function returns the number of successful conversions.
    86 */
    87 static int getDigits(const char *zDate, ...){
    88   va_list ap;
    89   int val;
    90   int N;
    91   int min;
    92   int max;
    93   int nextC;
    94   int *pVal;
    95   int cnt = 0;
    96   va_start(ap, zDate);
    97   do{
    98     N = va_arg(ap, int);
    99     min = va_arg(ap, int);
   100     max = va_arg(ap, int);
   101     nextC = va_arg(ap, int);
   102     pVal = va_arg(ap, int*);
   103     val = 0;
   104     while( N-- ){
   105       if( !isdigit(*(u8*)zDate) ){
   106         goto end_getDigits;
   107       }
   108       val = val*10 + *zDate - '0';
   109       zDate++;
   110     }
   111     if( val<min || val>max || (nextC!=0 && nextC!=*zDate) ){
   112       goto end_getDigits;
   113     }
   114     *pVal = val;
   115     zDate++;
   116     cnt++;
   117   }while( nextC );
   118 end_getDigits:
   119   va_end(ap);
   120   return cnt;
   121 }
   122 
   123 /*
   124 ** Read text from z[] and convert into a floating point number.  Return
   125 ** the number of digits converted.
   126 */
   127 #define getValue sqlite3AtoF
   128 
   129 /*
   130 ** Parse a timezone extension on the end of a date-time.
   131 ** The extension is of the form:
   132 **
   133 **        (+/-)HH:MM
   134 **
   135 ** If the parse is successful, write the number of minutes
   136 ** of change in *pnMin and return 0.  If a parser error occurs,
   137 ** return 0.
   138 **
   139 ** A missing specifier is not considered an error.
   140 */
   141 static int parseTimezone(const char *zDate, DateTime *p){
   142   int sgn = 0;
   143   int nHr, nMn;
   144   while( isspace(*(u8*)zDate) ){ zDate++; }
   145   p->tz = 0;
   146   if( *zDate=='-' ){
   147     sgn = -1;
   148   }else if( *zDate=='+' ){
   149     sgn = +1;
   150   }else{
   151     return *zDate!=0;
   152   }
   153   zDate++;
   154   if( getDigits(zDate, 2, 0, 14, ':', &nHr, 2, 0, 59, 0, &nMn)!=2 ){
   155     return 1;
   156   }
   157   zDate += 5;
   158   p->tz = sgn*(nMn + nHr*60);
   159   while( isspace(*(u8*)zDate) ){ zDate++; }
   160   return *zDate!=0;
   161 }
   162 
   163 /*
   164 ** Parse times of the form HH:MM or HH:MM:SS or HH:MM:SS.FFFF.
   165 ** The HH, MM, and SS must each be exactly 2 digits.  The
   166 ** fractional seconds FFFF can be one or more digits.
   167 **
   168 ** Return 1 if there is a parsing error and 0 on success.
   169 */
   170 static int parseHhMmSs(const char *zDate, DateTime *p){
   171   int h, m, s;
   172   double ms = 0.0;
   173   if( getDigits(zDate, 2, 0, 24, ':', &h, 2, 0, 59, 0, &m)!=2 ){
   174     return 1;
   175   }
   176   zDate += 5;
   177   if( *zDate==':' ){
   178     zDate++;
   179     if( getDigits(zDate, 2, 0, 59, 0, &s)!=1 ){
   180       return 1;
   181     }
   182     zDate += 2;
   183     if( *zDate=='.' && isdigit((u8)zDate[1]) ){
   184       double rScale = 1.0;
   185       zDate++;
   186       while( isdigit(*(u8*)zDate) ){
   187         ms = ms*10.0 + *zDate - '0';
   188         rScale *= 10.0;
   189         zDate++;
   190       }
   191       ms /= rScale;
   192     }
   193   }else{
   194     s = 0;
   195   }
   196   p->validJD = 0;
   197   p->validHMS = 1;
   198   p->h = h;
   199   p->m = m;
   200   p->s = s + ms;
   201   if( parseTimezone(zDate, p) ) return 1;
   202   p->validTZ = p->tz!=0;
   203   return 0;
   204 }
   205 
   206 /*
   207 ** Convert from YYYY-MM-DD HH:MM:SS to julian day.  We always assume
   208 ** that the YYYY-MM-DD is according to the Gregorian calendar.
   209 **
   210 ** Reference:  Meeus page 61
   211 */
   212 static void computeJD(DateTime *p){
   213   int Y, M, D, A, B, X1, X2;
   214 
   215   if( p->validJD ) return;
   216   if( p->validYMD ){
   217     Y = p->Y;
   218     M = p->M;
   219     D = p->D;
   220   }else{
   221     Y = 2000;  /* If no YMD specified, assume 2000-Jan-01 */
   222     M = 1;
   223     D = 1;
   224   }
   225   if( M<=2 ){
   226     Y--;
   227     M += 12;
   228   }
   229   A = Y/100;
   230   B = 2 - A + (A/4);
   231   X1 = 365.25*(Y+4716);
   232   X2 = 30.6001*(M+1);
   233   p->rJD = X1 + X2 + D + B - 1524.5;
   234   p->validJD = 1;
   235   if( p->validHMS ){
   236     p->rJD += (p->h*3600.0 + p->m*60.0 + p->s)/86400.0;
   237     if( p->validTZ ){
   238       p->rJD -= p->tz*60/86400.0;
   239       p->validYMD = 0;
   240       p->validHMS = 0;
   241       p->validTZ = 0;
   242     }
   243   }
   244 }
   245 
   246 /*
   247 ** Parse dates of the form
   248 **
   249 **     YYYY-MM-DD HH:MM:SS.FFF
   250 **     YYYY-MM-DD HH:MM:SS
   251 **     YYYY-MM-DD HH:MM
   252 **     YYYY-MM-DD
   253 **
   254 ** Write the result into the DateTime structure and return 0
   255 ** on success and 1 if the input string is not a well-formed
   256 ** date.
   257 */
   258 static int parseYyyyMmDd(const char *zDate, DateTime *p){
   259   int Y, M, D, neg;
   260 
   261   if( zDate[0]=='-' ){
   262     zDate++;
   263     neg = 1;
   264   }else{
   265     neg = 0;
   266   }
   267   if( getDigits(zDate,4,0,9999,'-',&Y,2,1,12,'-',&M,2,1,31,0,&D)!=3 ){
   268     return 1;
   269   }
   270   zDate += 10;
   271   while( isspace(*(u8*)zDate) || 'T'==*(u8*)zDate ){ zDate++; }
   272   if( parseHhMmSs(zDate, p)==0 ){
   273     /* We got the time */
   274   }else if( *zDate==0 ){
   275     p->validHMS = 0;
   276   }else{
   277     return 1;
   278   }
   279   p->validJD = 0;
   280   p->validYMD = 1;
   281   p->Y = neg ? -Y : Y;
   282   p->M = M;
   283   p->D = D;
   284   if( p->validTZ ){
   285     computeJD(p);
   286   }
   287   return 0;
   288 }
   289 
   290 /*
   291 ** Attempt to parse the given string into a Julian Day Number.  Return
   292 ** the number of errors.
   293 **
   294 ** The following are acceptable forms for the input string:
   295 **
   296 **      YYYY-MM-DD HH:MM:SS.FFF  +/-HH:MM
   297 **      DDDD.DD 
   298 **      now
   299 **
   300 ** In the first form, the +/-HH:MM is always optional.  The fractional
   301 ** seconds extension (the ".FFF") is optional.  The seconds portion
   302 ** (":SS.FFF") is option.  The year and date can be omitted as long
   303 ** as there is a time string.  The time string can be omitted as long
   304 ** as there is a year and date.
   305 */
   306 static int parseDateOrTime(const char *zDate, DateTime *p){
   307   memset(p, 0, sizeof(*p));
   308   if( parseYyyyMmDd(zDate,p)==0 ){
   309     return 0;
   310   }else if( parseHhMmSs(zDate, p)==0 ){
   311     return 0;
   312   }else if( sqlite3StrICmp(zDate,"now")==0){
   313     double r;
   314     sqlite3OsCurrentTime(&r);
   315     p->rJD = r;
   316     p->validJD = 1;
   317     return 0;
   318   }else if( sqlite3IsNumber(zDate, 0, SQLITE_UTF8) ){
   319     getValue(zDate, &p->rJD);
   320     p->validJD = 1;
   321     return 0;
   322   }
   323   return 1;
   324 }
   325 
   326 /*
   327 ** Compute the Year, Month, and Day from the julian day number.
   328 */
   329 static void computeYMD(DateTime *p){
   330   int Z, A, B, C, D, E, X1;
   331   if( p->validYMD ) return;
   332   if( !p->validJD ){
   333     p->Y = 2000;
   334     p->M = 1;
   335     p->D = 1;
   336   }else{
   337     Z = p->rJD + 0.5;
   338     A = (Z - 1867216.25)/36524.25;
   339     A = Z + 1 + A - (A/4);
   340     B = A + 1524;
   341     C = (B - 122.1)/365.25;
   342     D = 365.25*C;
   343     E = (B-D)/30.6001;
   344     X1 = 30.6001*E;
   345     p->D = B - D - X1;
   346     p->M = E<14 ? E-1 : E-13;
   347     p->Y = p->M>2 ? C - 4716 : C - 4715;
   348   }
   349   p->validYMD = 1;
   350 }
   351 
   352 /*
   353 ** Compute the Hour, Minute, and Seconds from the julian day number.
   354 */
   355 static void computeHMS(DateTime *p){
   356   int Z, s;
   357   if( p->validHMS ) return;
   358   computeJD(p);
   359   Z = p->rJD + 0.5;
   360   s = (p->rJD + 0.5 - Z)*86400000.0 + 0.5;
   361   p->s = 0.001*s;
   362   s = p->s;
   363   p->s -= s;
   364   p->h = s/3600;
   365   s -= p->h*3600;
   366   p->m = s/60;
   367   p->s += s - p->m*60;
   368   p->validHMS = 1;
   369 }
   370 
   371 /*
   372 ** Compute both YMD and HMS
   373 */
   374 static void computeYMD_HMS(DateTime *p){
   375   computeYMD(p);
   376   computeHMS(p);
   377 }
   378 
   379 /*
   380 ** Clear the YMD and HMS and the TZ
   381 */
   382 static void clearYMD_HMS_TZ(DateTime *p){
   383   p->validYMD = 0;
   384   p->validHMS = 0;
   385   p->validTZ = 0;
   386 }
   387 
   388 /*
   389 ** Compute the difference (in days) between localtime and UTC (a.k.a. GMT)
   390 ** for the time value p where p is in UTC.
   391 */
   392 static double localtimeOffset(DateTime *p){
   393   DateTime x, y;
   394   time_t t;
   395   x = *p;
   396   computeYMD_HMS(&x);
   397   if( x.Y<1971 || x.Y>=2038 ){
   398     x.Y = 2000;
   399     x.M = 1;
   400     x.D = 1;
   401     x.h = 0;
   402     x.m = 0;
   403     x.s = 0.0;
   404   } else {
   405     int s = x.s + 0.5;
   406     x.s = s;
   407   }
   408   x.tz = 0;
   409   x.validJD = 0;
   410   computeJD(&x);
   411   t = (x.rJD-2440587.5)*86400.0 + 0.5;
   412 #ifdef HAVE_LOCALTIME_R
   413   {
   414     struct tm sLocal;
   415     localtime_r(&t, &sLocal);
   416     y.Y = sLocal.tm_year + 1900;
   417     y.M = sLocal.tm_mon + 1;
   418     y.D = sLocal.tm_mday;
   419     y.h = sLocal.tm_hour;
   420     y.m = sLocal.tm_min;
   421     y.s = sLocal.tm_sec;
   422   }
   423 #else
   424   {
   425     struct tm *pTm;
   426     sqlite3OsEnterMutex();
   427     pTm = localtime(&t);
   428     y.Y = pTm->tm_year + 1900;
   429     y.M = pTm->tm_mon + 1;
   430     y.D = pTm->tm_mday;
   431     y.h = pTm->tm_hour;
   432     y.m = pTm->tm_min;
   433     y.s = pTm->tm_sec;
   434     sqlite3OsLeaveMutex();
   435   }
   436 #endif
   437   y.validYMD = 1;
   438   y.validHMS = 1;
   439   y.validJD = 0;
   440   y.validTZ = 0;
   441   computeJD(&y);
   442   return y.rJD - x.rJD;
   443 }
   444 
   445 /*
   446 ** Process a modifier to a date-time stamp.  The modifiers are
   447 ** as follows:
   448 **
   449 **     NNN days
   450 **     NNN hours
   451 **     NNN minutes
   452 **     NNN.NNNN seconds
   453 **     NNN months
   454 **     NNN years
   455 **     start of month
   456 **     start of year
   457 **     start of week
   458 **     start of day
   459 **     weekday N
   460 **     unixepoch
   461 **     localtime
   462 **     utc
   463 **
   464 ** Return 0 on success and 1 if there is any kind of error.
   465 */
   466 static int parseModifier(const char *zMod, DateTime *p){
   467   int rc = 1;
   468   int n;
   469   double r;
   470   char *z, zBuf[30];
   471   z = zBuf;
   472   for(n=0; n<sizeof(zBuf)-1 && zMod[n]; n++){
   473     z[n] = tolower(zMod[n]);
   474   }
   475   z[n] = 0;
   476   switch( z[0] ){
   477     case 'l': {
   478       /*    localtime
   479       **
   480       ** Assuming the current time value is UTC (a.k.a. GMT), shift it to
   481       ** show local time.
   482       */
   483       if( strcmp(z, "localtime")==0 ){
   484         computeJD(p);
   485         p->rJD += localtimeOffset(p);
   486         clearYMD_HMS_TZ(p);
   487         rc = 0;
   488       }
   489       break;
   490     }
   491     case 'u': {
   492       /*
   493       **    unixepoch
   494       **
   495       ** Treat the current value of p->rJD as the number of
   496       ** seconds since 1970.  Convert to a real julian day number.
   497       */
   498       if( strcmp(z, "unixepoch")==0 && p->validJD ){
   499         p->rJD = p->rJD/86400.0 + 2440587.5;
   500         clearYMD_HMS_TZ(p);
   501         rc = 0;
   502       }else if( strcmp(z, "utc")==0 ){
   503         double c1;
   504         computeJD(p);
   505         c1 = localtimeOffset(p);
   506         p->rJD -= c1;
   507         clearYMD_HMS_TZ(p);
   508         p->rJD += c1 - localtimeOffset(p);
   509         rc = 0;
   510       }
   511       break;
   512     }
   513     case 'w': {
   514       /*
   515       **    weekday N
   516       **
   517       ** Move the date to the same time on the next occurrence of
   518       ** weekday N where 0==Sunday, 1==Monday, and so forth.  If the
   519       ** date is already on the appropriate weekday, this is a no-op.
   520       */
   521       if( strncmp(z, "weekday ", 8)==0 && getValue(&z[8],&r)>0
   522                  && (n=r)==r && n>=0 && r<7 ){
   523         int Z;
   524         computeYMD_HMS(p);
   525         p->validTZ = 0;
   526         p->validJD = 0;
   527         computeJD(p);
   528         Z = p->rJD + 1.5;
   529         Z %= 7;
   530         if( Z>n ) Z -= 7;
   531         p->rJD += n - Z;
   532         clearYMD_HMS_TZ(p);
   533         rc = 0;
   534       }
   535       break;
   536     }
   537     case 's': {
   538       /*
   539       **    start of TTTTT
   540       **
   541       ** Move the date backwards to the beginning of the current day,
   542       ** or month or year.
   543       */
   544       if( strncmp(z, "start of ", 9)!=0 ) break;
   545       z += 9;
   546       computeYMD(p);
   547       p->validHMS = 1;
   548       p->h = p->m = 0;
   549       p->s = 0.0;
   550       p->validTZ = 0;
   551       p->validJD = 0;
   552       if( strcmp(z,"month")==0 ){
   553         p->D = 1;
   554         rc = 0;
   555       }else if( strcmp(z,"year")==0 ){
   556         computeYMD(p);
   557         p->M = 1;
   558         p->D = 1;
   559         rc = 0;
   560       }else if( strcmp(z,"day")==0 ){
   561         rc = 0;
   562       }
   563       break;
   564     }
   565     case '+':
   566     case '-':
   567     case '0':
   568     case '1':
   569     case '2':
   570     case '3':
   571     case '4':
   572     case '5':
   573     case '6':
   574     case '7':
   575     case '8':
   576     case '9': {
   577       n = getValue(z, &r);
   578       assert( n>=1 );
   579       if( z[n]==':' ){
   580         /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the
   581         ** specified number of hours, minutes, seconds, and fractional seconds
   582         ** to the time.  The ".FFF" may be omitted.  The ":SS.FFF" may be
   583         ** omitted.
   584         */
   585         const char *z2 = z;
   586         DateTime tx;
   587         int day;
   588         if( !isdigit(*(u8*)z2) ) z2++;
   589         memset(&tx, 0, sizeof(tx));
   590         if( parseHhMmSs(z2, &tx) ) break;
   591         computeJD(&tx);
   592         tx.rJD -= 0.5;
   593         day = (int)tx.rJD;
   594         tx.rJD -= day;
   595         if( z[0]=='-' ) tx.rJD = -tx.rJD;
   596         computeJD(p);
   597         clearYMD_HMS_TZ(p);
   598         p->rJD += tx.rJD;
   599         rc = 0;
   600         break;
   601       }
   602       z += n;
   603       while( isspace(*(u8*)z) ) z++;
   604       n = strlen(z);
   605       if( n>10 || n<3 ) break;
   606       if( z[n-1]=='s' ){ z[n-1] = 0; n--; }
   607       computeJD(p);
   608       rc = 0;
   609       if( n==3 && strcmp(z,"day")==0 ){
   610         p->rJD += r;
   611       }else if( n==4 && strcmp(z,"hour")==0 ){
   612         p->rJD += r/24.0;
   613       }else if( n==6 && strcmp(z,"minute")==0 ){
   614         p->rJD += r/(24.0*60.0);
   615       }else if( n==6 && strcmp(z,"second")==0 ){
   616         p->rJD += r/(24.0*60.0*60.0);
   617       }else if( n==5 && strcmp(z,"month")==0 ){
   618         int x, y;
   619         computeYMD_HMS(p);
   620         p->M += r;
   621         x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12;
   622         p->Y += x;
   623         p->M -= x*12;
   624         p->validJD = 0;
   625         computeJD(p);
   626         y = r;
   627         if( y!=r ){
   628           p->rJD += (r - y)*30.0;
   629         }
   630       }else if( n==4 && strcmp(z,"year")==0 ){
   631         computeYMD_HMS(p);
   632         p->Y += r;
   633         p->validJD = 0;
   634         computeJD(p);
   635       }else{
   636         rc = 1;
   637       }
   638       clearYMD_HMS_TZ(p);
   639       break;
   640     }
   641     default: {
   642       break;
   643     }
   644   }
   645   return rc;
   646 }
   647 
   648 /*
   649 ** Process time function arguments.  argv[0] is a date-time stamp.
   650 ** argv[1] and following are modifiers.  Parse them all and write
   651 ** the resulting time into the DateTime structure p.  Return 0
   652 ** on success and 1 if there are any errors.
   653 */
   654 static int isDate(int argc, sqlite3_value **argv, DateTime *p){
   655   int i;
   656   const unsigned char *z;
   657   if( argc==0 ) return 1;
   658   if( (z = sqlite3_value_text(argv[0]))==0 || parseDateOrTime((char*)z, p) ){
   659     return 1;
   660   }
   661   for(i=1; i<argc; i++){
   662     if( (z = sqlite3_value_text(argv[i]))==0 || parseModifier((char*)z, p) ){
   663       return 1;
   664     }
   665   }
   666   return 0;
   667 }
   668 
   669 
   670 /*
   671 ** The following routines implement the various date and time functions
   672 ** of SQLite.
   673 */
   674 
   675 /*
   676 **    julianday( TIMESTRING, MOD, MOD, ...)
   677 **
   678 ** Return the julian day number of the date specified in the arguments
   679 */
   680 static void juliandayFunc(
   681   sqlite3_context *context,
   682   int argc,
   683   sqlite3_value **argv
   684 ){
   685   DateTime x;
   686   if( isDate(argc, argv, &x)==0 ){
   687     computeJD(&x);
   688     sqlite3_result_double(context, x.rJD);
   689   }
   690 }
   691 
   692 /*
   693 **    datetime( TIMESTRING, MOD, MOD, ...)
   694 **
   695 ** Return YYYY-MM-DD HH:MM:SS
   696 */
   697 static void datetimeFunc(
   698   sqlite3_context *context,
   699   int argc,
   700   sqlite3_value **argv
   701 ){
   702   DateTime x;
   703   if( isDate(argc, argv, &x)==0 ){
   704     char zBuf[100];
   705     computeYMD_HMS(&x);
   706     sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d %02d:%02d:%02d",
   707                      x.Y, x.M, x.D, x.h, x.m, (int)(x.s));
   708     sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
   709   }
   710 }
   711 
   712 /*
   713 **    time( TIMESTRING, MOD, MOD, ...)
   714 **
   715 ** Return HH:MM:SS
   716 */
   717 static void timeFunc(
   718   sqlite3_context *context,
   719   int argc,
   720   sqlite3_value **argv
   721 ){
   722   DateTime x;
   723   if( isDate(argc, argv, &x)==0 ){
   724     char zBuf[100];
   725     computeHMS(&x);
   726     sqlite3_snprintf(sizeof(zBuf), zBuf, "%02d:%02d:%02d", x.h, x.m, (int)x.s);
   727     sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
   728   }
   729 }
   730 
   731 /*
   732 **    date( TIMESTRING, MOD, MOD, ...)
   733 **
   734 ** Return YYYY-MM-DD
   735 */
   736 static void dateFunc(
   737   sqlite3_context *context,
   738   int argc,
   739   sqlite3_value **argv
   740 ){
   741   DateTime x;
   742   if( isDate(argc, argv, &x)==0 ){
   743     char zBuf[100];
   744     computeYMD(&x);
   745     sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d", x.Y, x.M, x.D);
   746     sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
   747   }
   748 }
   749 
   750 /*
   751 **    strftime( FORMAT, TIMESTRING, MOD, MOD, ...)
   752 **
   753 ** Return a string described by FORMAT.  Conversions as follows:
   754 **
   755 **   %d  day of month
   756 **   %f  ** fractional seconds  SS.SSS
   757 **   %H  hour 00-24
   758 **   %j  day of year 000-366
   759 **   %J  ** Julian day number
   760 **   %m  month 01-12
   761 **   %M  minute 00-59
   762 **   %s  seconds since 1970-01-01
   763 **   %S  seconds 00-59
   764 **   %w  day of week 0-6  sunday==0
   765 **   %W  week of year 00-53
   766 **   %Y  year 0000-9999
   767 **   %%  %
   768 */
   769 static void strftimeFunc(
   770   sqlite3_context *context,
   771   int argc,
   772   sqlite3_value **argv
   773 ){
   774   DateTime x;
   775   u64 n;
   776   int i, j;
   777   char *z;
   778   const char *zFmt = (const char*)sqlite3_value_text(argv[0]);
   779   char zBuf[100];
   780   if( zFmt==0 || isDate(argc-1, argv+1, &x) ) return;
   781   for(i=0, n=1; zFmt[i]; i++, n++){
   782     if( zFmt[i]=='%' ){
   783       switch( zFmt[i+1] ){
   784         case 'd':
   785         case 'H':
   786         case 'm':
   787         case 'M':
   788         case 'S':
   789         case 'W':
   790           n++;
   791           /* fall thru */
   792         case 'w':
   793         case '%':
   794           break;
   795         case 'f':
   796           n += 8;
   797           break;
   798         case 'j':
   799           n += 3;
   800           break;
   801         case 'Y':
   802           n += 8;
   803           break;
   804         case 's':
   805         case 'J':
   806           n += 50;
   807           break;
   808         default:
   809           return;  /* ERROR.  return a NULL */
   810       }
   811       i++;
   812     }
   813   }
   814   if( n<sizeof(zBuf) ){
   815     z = zBuf;
   816   }else if( n>SQLITE_MAX_LENGTH ){
   817     sqlite3_result_error_toobig(context);
   818     return;
   819   }else{
   820     z = sqliteMalloc( n );
   821     if( z==0 ) return;
   822   }
   823   computeJD(&x);
   824   computeYMD_HMS(&x);
   825   for(i=j=0; zFmt[i]; i++){
   826     if( zFmt[i]!='%' ){
   827       z[j++] = zFmt[i];
   828     }else{
   829       i++;
   830       switch( zFmt[i] ){
   831         case 'd':  sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break;
   832         case 'f': {
   833           double s = x.s;
   834           if( s>59.999 ) s = 59.999;
   835           sqlite3_snprintf(7, &z[j],"%06.3f", s);
   836           j += strlen(&z[j]);
   837           break;
   838         }
   839         case 'H':  sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break;
   840         case 'W': /* Fall thru */
   841         case 'j': {
   842           int nDay;             /* Number of days since 1st day of year */
   843           DateTime y = x;
   844           y.validJD = 0;
   845           y.M = 1;
   846           y.D = 1;
   847           computeJD(&y);
   848           nDay = x.rJD - y.rJD + 0.5;
   849           if( zFmt[i]=='W' ){
   850             int wd;   /* 0=Monday, 1=Tuesday, ... 6=Sunday */
   851             wd = ((int)(x.rJD+0.5)) % 7;
   852             sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7);
   853             j += 2;
   854           }else{
   855             sqlite3_snprintf(4, &z[j],"%03d",nDay+1);
   856             j += 3;
   857           }
   858           break;
   859         }
   860         case 'J': {
   861           sqlite3_snprintf(20, &z[j],"%.16g",x.rJD);
   862           j+=strlen(&z[j]);
   863           break;
   864         }
   865         case 'm':  sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break;
   866         case 'M':  sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break;
   867         case 's': {
   868           sqlite3_snprintf(30,&z[j],"%d",
   869                            (int)((x.rJD-2440587.5)*86400.0 + 0.5));
   870           j += strlen(&z[j]);
   871           break;
   872         }
   873         case 'S':  sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break;
   874         case 'w':  z[j++] = (((int)(x.rJD+1.5)) % 7) + '0'; break;
   875         case 'Y':  sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=strlen(&z[j]);break;
   876         case '%':  z[j++] = '%'; break;
   877       }
   878     }
   879   }
   880   z[j] = 0;
   881   sqlite3_result_text(context, z, -1, SQLITE_TRANSIENT);
   882   if( z!=zBuf ){
   883     sqliteFree(z);
   884   }
   885 }
   886 
   887 /*
   888 ** current_time()
   889 **
   890 ** This function returns the same value as time('now').
   891 */
   892 static void ctimeFunc(
   893   sqlite3_context *context,
   894   int argc,
   895   sqlite3_value **argv
   896 ){
   897   sqlite3_value *pVal = sqlite3ValueNew();
   898   if( pVal ){
   899     sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC);
   900     timeFunc(context, 1, &pVal);
   901     sqlite3ValueFree(pVal);
   902   }
   903 }
   904 
   905 /*
   906 ** current_date()
   907 **
   908 ** This function returns the same value as date('now').
   909 */
   910 static void cdateFunc(
   911   sqlite3_context *context,
   912   int argc,
   913   sqlite3_value **argv
   914 ){
   915   sqlite3_value *pVal = sqlite3ValueNew();
   916   if( pVal ){
   917     sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC);
   918     dateFunc(context, 1, &pVal);
   919     sqlite3ValueFree(pVal);
   920   }
   921 }
   922 
   923 /*
   924 ** current_timestamp()
   925 **
   926 ** This function returns the same value as datetime('now').
   927 */
   928 static void ctimestampFunc(
   929   sqlite3_context *context,
   930   int argc,
   931   sqlite3_value **argv
   932 ){
   933   sqlite3_value *pVal = sqlite3ValueNew();
   934   if( pVal ){
   935     sqlite3ValueSetStr(pVal, -1, "now", SQLITE_UTF8, SQLITE_STATIC);
   936     datetimeFunc(context, 1, &pVal);
   937     sqlite3ValueFree(pVal);
   938   }
   939 }
   940 #endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */
   941 
   942 #ifdef SQLITE_OMIT_DATETIME_FUNCS
   943 /*
   944 ** If the library is compiled to omit the full-scale date and time
   945 ** handling (to get a smaller binary), the following minimal version
   946 ** of the functions current_time(), current_date() and current_timestamp()
   947 ** are included instead. This is to support column declarations that
   948 ** include "DEFAULT CURRENT_TIME" etc.
   949 **
   950 ** This function uses the C-library functions time(), gmtime()
   951 ** and strftime(). The format string to pass to strftime() is supplied
   952 ** as the user-data for the function.
   953 */
   954 static void currentTimeFunc(
   955   sqlite3_context *context,
   956   int argc,
   957   sqlite3_value **argv
   958 ){
   959   time_t t;
   960   char *zFormat = (char *)sqlite3_user_data(context);
   961   char zBuf[20];
   962 
   963   time(&t);
   964 #ifdef SQLITE_TEST
   965   {
   966     extern int sqlite3_current_time;  /* See os_XXX.c */
   967     if( sqlite3_current_time ){
   968       t = sqlite3_current_time;
   969     }
   970   }
   971 #endif
   972 
   973 #ifdef HAVE_GMTIME_R
   974   {
   975     struct tm sNow;
   976     gmtime_r(&t, &sNow);
   977     strftime(zBuf, 20, zFormat, &sNow);
   978   }
   979 #else
   980   {
   981     struct tm *pTm;
   982     sqlite3OsEnterMutex();
   983     pTm = gmtime(&t);
   984     strftime(zBuf, 20, zFormat, pTm);
   985     sqlite3OsLeaveMutex();
   986   }
   987 #endif
   988 
   989   sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
   990 }
   991 #endif
   992 
   993 /*
   994 ** This function registered all of the above C functions as SQL
   995 ** functions.  This should be the only routine in this file with
   996 ** external linkage.
   997 */
   998 void sqlite3RegisterDateTimeFunctions(sqlite3 *db){
   999 #ifndef SQLITE_OMIT_DATETIME_FUNCS
  1000   static const struct {
  1001      char *zName;
  1002      int nArg;
  1003      void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
  1004   } aFuncs[] = {
  1005     { "julianday", -1, juliandayFunc   },
  1006     { "date",      -1, dateFunc        },
  1007     { "time",      -1, timeFunc        },
  1008     { "datetime",  -1, datetimeFunc    },
  1009     { "strftime",  -1, strftimeFunc    },
  1010     { "current_time",       0, ctimeFunc      },
  1011     { "current_timestamp",  0, ctimestampFunc },
  1012     { "current_date",       0, cdateFunc      },
  1013   };
  1014   int i;
  1015 
  1016   for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
  1017     sqlite3CreateFunc(db, aFuncs[i].zName, aFuncs[i].nArg,
  1018         SQLITE_UTF8, 0, aFuncs[i].xFunc, 0, 0);
  1019   }
  1020 #else
  1021   static const struct {
  1022      char *zName;
  1023      char *zFormat;
  1024   } aFuncs[] = {
  1025     { "current_time", "%H:%M:%S" },
  1026     { "current_date", "%Y-%m-%d" },
  1027     { "current_timestamp", "%Y-%m-%d %H:%M:%S" }
  1028   };
  1029   int i;
  1030 
  1031   for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){
  1032     sqlite3CreateFunc(db, aFuncs[i].zName, 0, SQLITE_UTF8, 
  1033         aFuncs[i].zFormat, currentTimeFunc, 0, 0);
  1034   }
  1035 #endif
  1036 }