xref: /sqlite-3.40.0/src/date.c (revision 6a657b24)
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 ** SQLite processes all times and dates as julian day numbers.  The
20 ** dates and times are stored as the number of days since noon
21 ** in Greenwich on November 24, 4714 B.C. according to the Gregorian
22 ** calendar system.
23 **
24 ** 1970-01-01 00:00:00 is JD 2440587.5
25 ** 2000-01-01 00:00:00 is JD 2451544.5
26 **
27 ** This implementation requires years to be expressed as a 4-digit number
28 ** which means that only dates between 0000-01-01 and 9999-12-31 can
29 ** be represented, even though julian day numbers allow a much wider
30 ** range of dates.
31 **
32 ** The Gregorian calendar system is used for all dates and times,
33 ** even those that predate the Gregorian calendar.  Historians usually
34 ** use the julian calendar for dates prior to 1582-10-15 and for some
35 ** dates afterwards, depending on locale.  Beware of this difference.
36 **
37 ** The conversion algorithms are implemented based on descriptions
38 ** in the following text:
39 **
40 **      Jean Meeus
41 **      Astronomical Algorithms, 2nd Edition, 1998
42 **      ISBM 0-943396-61-1
43 **      Willmann-Bell, Inc
44 **      Richmond, Virginia (USA)
45 */
46 #include "sqliteInt.h"
47 #include <stdlib.h>
48 #include <assert.h>
49 #include <time.h>
50 
51 #ifndef SQLITE_OMIT_DATETIME_FUNCS
52 
53 
54 /*
55 ** A structure for holding a single date and time.
56 */
57 typedef struct DateTime DateTime;
58 struct DateTime {
59   sqlite3_int64 iJD; /* The julian day number times 86400000 */
60   int Y, M, D;       /* Year, month, and day */
61   int h, m;          /* Hour and minutes */
62   int tz;            /* Timezone offset in minutes */
63   double s;          /* Seconds */
64   char validYMD;     /* True (1) if Y,M,D are valid */
65   char validHMS;     /* True (1) if h,m,s are valid */
66   char validJD;      /* True (1) if iJD is valid */
67   char validTZ;      /* True (1) if tz is valid */
68   char tzSet;        /* Timezone was set explicitly */
69 };
70 
71 
72 /*
73 ** Convert zDate into one or more integers.  Additional arguments
74 ** come in groups of 5 as follows:
75 **
76 **       N       number of digits in the integer
77 **       min     minimum allowed value of the integer
78 **       max     maximum allowed value of the integer
79 **       nextC   first character after the integer
80 **       pVal    where to write the integers value.
81 **
82 ** Conversions continue until one with nextC==0 is encountered.
83 ** The function returns the number of successful conversions.
84 */
85 static int getDigits(const char *zDate, ...){
86   va_list ap;
87   int val;
88   int N;
89   int min;
90   int max;
91   int nextC;
92   int *pVal;
93   int cnt = 0;
94   va_start(ap, zDate);
95   do{
96     N = va_arg(ap, int);
97     min = va_arg(ap, int);
98     max = va_arg(ap, int);
99     nextC = va_arg(ap, int);
100     pVal = va_arg(ap, int*);
101     val = 0;
102     while( N-- ){
103       if( !sqlite3Isdigit(*zDate) ){
104         goto end_getDigits;
105       }
106       val = val*10 + *zDate - '0';
107       zDate++;
108     }
109     if( val<min || val>max || (nextC!=0 && nextC!=*zDate) ){
110       goto end_getDigits;
111     }
112     *pVal = val;
113     zDate++;
114     cnt++;
115   }while( nextC );
116 end_getDigits:
117   va_end(ap);
118   return cnt;
119 }
120 
121 /*
122 ** Parse a timezone extension on the end of a date-time.
123 ** The extension is of the form:
124 **
125 **        (+/-)HH:MM
126 **
127 ** Or the "zulu" notation:
128 **
129 **        Z
130 **
131 ** If the parse is successful, write the number of minutes
132 ** of change in p->tz and return 0.  If a parser error occurs,
133 ** return non-zero.
134 **
135 ** A missing specifier is not considered an error.
136 */
137 static int parseTimezone(const char *zDate, DateTime *p){
138   int sgn = 0;
139   int nHr, nMn;
140   int c;
141   while( sqlite3Isspace(*zDate) ){ zDate++; }
142   p->tz = 0;
143   c = *zDate;
144   if( c=='-' ){
145     sgn = -1;
146   }else if( c=='+' ){
147     sgn = +1;
148   }else if( c=='Z' || c=='z' ){
149     zDate++;
150     goto zulu_time;
151   }else{
152     return c!=0;
153   }
154   zDate++;
155   if( getDigits(zDate, 2, 0, 14, ':', &nHr, 2, 0, 59, 0, &nMn)!=2 ){
156     return 1;
157   }
158   zDate += 5;
159   p->tz = sgn*(nMn + nHr*60);
160 zulu_time:
161   while( sqlite3Isspace(*zDate) ){ zDate++; }
162   p->tzSet = 1;
163   return *zDate!=0;
164 }
165 
166 /*
167 ** Parse times of the form HH:MM or HH:MM:SS or HH:MM:SS.FFFF.
168 ** The HH, MM, and SS must each be exactly 2 digits.  The
169 ** fractional seconds FFFF can be one or more digits.
170 **
171 ** Return 1 if there is a parsing error and 0 on success.
172 */
173 static int parseHhMmSs(const char *zDate, DateTime *p){
174   int h, m, s;
175   double ms = 0.0;
176   if( getDigits(zDate, 2, 0, 24, ':', &h, 2, 0, 59, 0, &m)!=2 ){
177     return 1;
178   }
179   zDate += 5;
180   if( *zDate==':' ){
181     zDate++;
182     if( getDigits(zDate, 2, 0, 59, 0, &s)!=1 ){
183       return 1;
184     }
185     zDate += 2;
186     if( *zDate=='.' && sqlite3Isdigit(zDate[1]) ){
187       double rScale = 1.0;
188       zDate++;
189       while( sqlite3Isdigit(*zDate) ){
190         ms = ms*10.0 + *zDate - '0';
191         rScale *= 10.0;
192         zDate++;
193       }
194       ms /= rScale;
195     }
196   }else{
197     s = 0;
198   }
199   p->validJD = 0;
200   p->validHMS = 1;
201   p->h = h;
202   p->m = m;
203   p->s = s + ms;
204   if( parseTimezone(zDate, p) ) return 1;
205   p->validTZ = (p->tz!=0)?1:0;
206   return 0;
207 }
208 
209 /*
210 ** Convert from YYYY-MM-DD HH:MM:SS to julian day.  We always assume
211 ** that the YYYY-MM-DD is according to the Gregorian calendar.
212 **
213 ** Reference:  Meeus page 61
214 */
215 static void computeJD(DateTime *p){
216   int Y, M, D, A, B, X1, X2;
217 
218   if( p->validJD ) return;
219   if( p->validYMD ){
220     Y = p->Y;
221     M = p->M;
222     D = p->D;
223   }else{
224     Y = 2000;  /* If no YMD specified, assume 2000-Jan-01 */
225     M = 1;
226     D = 1;
227   }
228   if( M<=2 ){
229     Y--;
230     M += 12;
231   }
232   A = Y/100;
233   B = 2 - A + (A/4);
234   X1 = 36525*(Y+4716)/100;
235   X2 = 306001*(M+1)/10000;
236   p->iJD = (sqlite3_int64)((X1 + X2 + D + B - 1524.5 ) * 86400000);
237   p->validJD = 1;
238   if( p->validHMS ){
239     p->iJD += p->h*3600000 + p->m*60000 + (sqlite3_int64)(p->s*1000);
240     if( p->validTZ ){
241       p->iJD -= p->tz*60000;
242       p->validYMD = 0;
243       p->validHMS = 0;
244       p->validTZ = 0;
245     }
246   }
247 }
248 
249 /*
250 ** Parse dates of the form
251 **
252 **     YYYY-MM-DD HH:MM:SS.FFF
253 **     YYYY-MM-DD HH:MM:SS
254 **     YYYY-MM-DD HH:MM
255 **     YYYY-MM-DD
256 **
257 ** Write the result into the DateTime structure and return 0
258 ** on success and 1 if the input string is not a well-formed
259 ** date.
260 */
261 static int parseYyyyMmDd(const char *zDate, DateTime *p){
262   int Y, M, D, neg;
263 
264   if( zDate[0]=='-' ){
265     zDate++;
266     neg = 1;
267   }else{
268     neg = 0;
269   }
270   if( getDigits(zDate,4,0,9999,'-',&Y,2,1,12,'-',&M,2,1,31,0,&D)!=3 ){
271     return 1;
272   }
273   zDate += 10;
274   while( sqlite3Isspace(*zDate) || 'T'==*(u8*)zDate ){ zDate++; }
275   if( parseHhMmSs(zDate, p)==0 ){
276     /* We got the time */
277   }else if( *zDate==0 ){
278     p->validHMS = 0;
279   }else{
280     return 1;
281   }
282   p->validJD = 0;
283   p->validYMD = 1;
284   p->Y = neg ? -Y : Y;
285   p->M = M;
286   p->D = D;
287   if( p->validTZ ){
288     computeJD(p);
289   }
290   return 0;
291 }
292 
293 /*
294 ** Set the time to the current time reported by the VFS.
295 **
296 ** Return the number of errors.
297 */
298 static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
299   p->iJD = sqlite3StmtCurrentTime(context);
300   if( p->iJD>0 ){
301     p->validJD = 1;
302     return 0;
303   }else{
304     return 1;
305   }
306 }
307 
308 /*
309 ** Attempt to parse the given string into a julian day number.  Return
310 ** the number of errors.
311 **
312 ** The following are acceptable forms for the input string:
313 **
314 **      YYYY-MM-DD HH:MM:SS.FFF  +/-HH:MM
315 **      DDDD.DD
316 **      now
317 **
318 ** In the first form, the +/-HH:MM is always optional.  The fractional
319 ** seconds extension (the ".FFF") is optional.  The seconds portion
320 ** (":SS.FFF") is option.  The year and date can be omitted as long
321 ** as there is a time string.  The time string can be omitted as long
322 ** as there is a year and date.
323 */
324 static int parseDateOrTime(
325   sqlite3_context *context,
326   const char *zDate,
327   DateTime *p
328 ){
329   double r;
330   if( parseYyyyMmDd(zDate,p)==0 ){
331     return 0;
332   }else if( parseHhMmSs(zDate, p)==0 ){
333     return 0;
334   }else if( sqlite3StrICmp(zDate,"now")==0){
335     return setDateTimeToCurrent(context, p);
336   }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){
337     p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5);
338     p->validJD = 1;
339     return 0;
340   }
341   return 1;
342 }
343 
344 /*
345 ** Compute the Year, Month, and Day from the julian day number.
346 */
347 static void computeYMD(DateTime *p){
348   int Z, A, B, C, D, E, X1;
349   if( p->validYMD ) return;
350   if( !p->validJD ){
351     p->Y = 2000;
352     p->M = 1;
353     p->D = 1;
354   }else{
355     Z = (int)((p->iJD + 43200000)/86400000);
356     A = (int)((Z - 1867216.25)/36524.25);
357     A = Z + 1 + A - (A/4);
358     B = A + 1524;
359     C = (int)((B - 122.1)/365.25);
360     D = (36525*(C&32767))/100;
361     E = (int)((B-D)/30.6001);
362     X1 = (int)(30.6001*E);
363     p->D = B - D - X1;
364     p->M = E<14 ? E-1 : E-13;
365     p->Y = p->M>2 ? C - 4716 : C - 4715;
366   }
367   p->validYMD = 1;
368 }
369 
370 /*
371 ** Compute the Hour, Minute, and Seconds from the julian day number.
372 */
373 static void computeHMS(DateTime *p){
374   int s;
375   if( p->validHMS ) return;
376   computeJD(p);
377   s = (int)((p->iJD + 43200000) % 86400000);
378   p->s = s/1000.0;
379   s = (int)p->s;
380   p->s -= s;
381   p->h = s/3600;
382   s -= p->h*3600;
383   p->m = s/60;
384   p->s += s - p->m*60;
385   p->validHMS = 1;
386 }
387 
388 /*
389 ** Compute both YMD and HMS
390 */
391 static void computeYMD_HMS(DateTime *p){
392   computeYMD(p);
393   computeHMS(p);
394 }
395 
396 /*
397 ** Clear the YMD and HMS and the TZ
398 */
399 static void clearYMD_HMS_TZ(DateTime *p){
400   p->validYMD = 0;
401   p->validHMS = 0;
402   p->validTZ = 0;
403 }
404 
405 /*
406 ** On recent Windows platforms, the localtime_s() function is available
407 ** as part of the "Secure CRT". It is essentially equivalent to
408 ** localtime_r() available under most POSIX platforms, except that the
409 ** order of the parameters is reversed.
410 **
411 ** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx.
412 **
413 ** If the user has not indicated to use localtime_r() or localtime_s()
414 ** already, check for an MSVC build environment that provides
415 ** localtime_s().
416 */
417 #if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S \
418     && defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE)
419 #undef  HAVE_LOCALTIME_S
420 #define HAVE_LOCALTIME_S 1
421 #endif
422 
423 #ifndef SQLITE_OMIT_LOCALTIME
424 /*
425 ** The following routine implements the rough equivalent of localtime_r()
426 ** using whatever operating-system specific localtime facility that
427 ** is available.  This routine returns 0 on success and
428 ** non-zero on any kind of error.
429 **
430 ** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this
431 ** routine will always fail.
432 **
433 ** EVIDENCE-OF: R-62172-00036 In this implementation, the standard C
434 ** library function localtime_r() is used to assist in the calculation of
435 ** local time.
436 */
437 static int osLocaltime(time_t *t, struct tm *pTm){
438   int rc;
439 #if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S
440   struct tm *pX;
441 #if SQLITE_THREADSAFE>0
442   sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
443 #endif
444   sqlite3_mutex_enter(mutex);
445   pX = localtime(t);
446 #ifndef SQLITE_OMIT_BUILTIN_TEST
447   if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0;
448 #endif
449   if( pX ) *pTm = *pX;
450   sqlite3_mutex_leave(mutex);
451   rc = pX==0;
452 #else
453 #ifndef SQLITE_OMIT_BUILTIN_TEST
454   if( sqlite3GlobalConfig.bLocaltimeFault ) return 1;
455 #endif
456 #if HAVE_LOCALTIME_R
457   rc = localtime_r(t, pTm)==0;
458 #else
459   rc = localtime_s(pTm, t);
460 #endif /* HAVE_LOCALTIME_R */
461 #endif /* HAVE_LOCALTIME_R || HAVE_LOCALTIME_S */
462   return rc;
463 }
464 #endif /* SQLITE_OMIT_LOCALTIME */
465 
466 
467 #ifndef SQLITE_OMIT_LOCALTIME
468 /*
469 ** Compute the difference (in milliseconds) between localtime and UTC
470 ** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs,
471 ** return this value and set *pRc to SQLITE_OK.
472 **
473 ** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value
474 ** is undefined in this case.
475 */
476 static sqlite3_int64 localtimeOffset(
477   DateTime *p,                    /* Date at which to calculate offset */
478   sqlite3_context *pCtx,          /* Write error here if one occurs */
479   int *pRc                        /* OUT: Error code. SQLITE_OK or ERROR */
480 ){
481   DateTime x, y;
482   time_t t;
483   struct tm sLocal;
484 
485   /* Initialize the contents of sLocal to avoid a compiler warning. */
486   memset(&sLocal, 0, sizeof(sLocal));
487 
488   x = *p;
489   computeYMD_HMS(&x);
490   if( x.Y<1971 || x.Y>=2038 ){
491     /* EVIDENCE-OF: R-55269-29598 The localtime_r() C function normally only
492     ** works for years between 1970 and 2037. For dates outside this range,
493     ** SQLite attempts to map the year into an equivalent year within this
494     ** range, do the calculation, then map the year back.
495     */
496     x.Y = 2000;
497     x.M = 1;
498     x.D = 1;
499     x.h = 0;
500     x.m = 0;
501     x.s = 0.0;
502   } else {
503     int s = (int)(x.s + 0.5);
504     x.s = s;
505   }
506   x.tz = 0;
507   x.validJD = 0;
508   computeJD(&x);
509   t = (time_t)(x.iJD/1000 - 21086676*(i64)10000);
510   if( osLocaltime(&t, &sLocal) ){
511     sqlite3_result_error(pCtx, "local time unavailable", -1);
512     *pRc = SQLITE_ERROR;
513     return 0;
514   }
515   y.Y = sLocal.tm_year + 1900;
516   y.M = sLocal.tm_mon + 1;
517   y.D = sLocal.tm_mday;
518   y.h = sLocal.tm_hour;
519   y.m = sLocal.tm_min;
520   y.s = sLocal.tm_sec;
521   y.validYMD = 1;
522   y.validHMS = 1;
523   y.validJD = 0;
524   y.validTZ = 0;
525   computeJD(&y);
526   *pRc = SQLITE_OK;
527   return y.iJD - x.iJD;
528 }
529 #endif /* SQLITE_OMIT_LOCALTIME */
530 
531 /*
532 ** Process a modifier to a date-time stamp.  The modifiers are
533 ** as follows:
534 **
535 **     NNN days
536 **     NNN hours
537 **     NNN minutes
538 **     NNN.NNNN seconds
539 **     NNN months
540 **     NNN years
541 **     start of month
542 **     start of year
543 **     start of week
544 **     start of day
545 **     weekday N
546 **     unixepoch
547 **     localtime
548 **     utc
549 **
550 ** Return 0 on success and 1 if there is any kind of error. If the error
551 ** is in a system call (i.e. localtime()), then an error message is written
552 ** to context pCtx. If the error is an unrecognized modifier, no error is
553 ** written to pCtx.
554 */
555 static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){
556   int rc = 1;
557   int n;
558   double r;
559   char *z, zBuf[30];
560   z = zBuf;
561   for(n=0; n<ArraySize(zBuf)-1 && zMod[n]; n++){
562     z[n] = (char)sqlite3UpperToLower[(u8)zMod[n]];
563   }
564   z[n] = 0;
565   switch( z[0] ){
566 #ifndef SQLITE_OMIT_LOCALTIME
567     case 'l': {
568       /*    localtime
569       **
570       ** Assuming the current time value is UTC (a.k.a. GMT), shift it to
571       ** show local time.
572       */
573       if( strcmp(z, "localtime")==0 ){
574         computeJD(p);
575         p->iJD += localtimeOffset(p, pCtx, &rc);
576         clearYMD_HMS_TZ(p);
577       }
578       break;
579     }
580 #endif
581     case 'u': {
582       /*
583       **    unixepoch
584       **
585       ** Treat the current value of p->iJD as the number of
586       ** seconds since 1970.  Convert to a real julian day number.
587       */
588       if( strcmp(z, "unixepoch")==0 && p->validJD ){
589         p->iJD = (p->iJD + 43200)/86400 + 21086676*(i64)10000000;
590         clearYMD_HMS_TZ(p);
591         rc = 0;
592       }
593 #ifndef SQLITE_OMIT_LOCALTIME
594       else if( strcmp(z, "utc")==0 ){
595         if( p->tzSet==0 ){
596           sqlite3_int64 c1;
597           computeJD(p);
598           c1 = localtimeOffset(p, pCtx, &rc);
599           if( rc==SQLITE_OK ){
600             p->iJD -= c1;
601             clearYMD_HMS_TZ(p);
602             p->iJD += c1 - localtimeOffset(p, pCtx, &rc);
603           }
604           p->tzSet = 1;
605         }else{
606           rc = SQLITE_OK;
607         }
608       }
609 #endif
610       break;
611     }
612     case 'w': {
613       /*
614       **    weekday N
615       **
616       ** Move the date to the same time on the next occurrence of
617       ** weekday N where 0==Sunday, 1==Monday, and so forth.  If the
618       ** date is already on the appropriate weekday, this is a no-op.
619       */
620       if( strncmp(z, "weekday ", 8)==0
621                && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8)
622                && (n=(int)r)==r && n>=0 && r<7 ){
623         sqlite3_int64 Z;
624         computeYMD_HMS(p);
625         p->validTZ = 0;
626         p->validJD = 0;
627         computeJD(p);
628         Z = ((p->iJD + 129600000)/86400000) % 7;
629         if( Z>n ) Z -= 7;
630         p->iJD += (n - Z)*86400000;
631         clearYMD_HMS_TZ(p);
632         rc = 0;
633       }
634       break;
635     }
636     case 's': {
637       /*
638       **    start of TTTTT
639       **
640       ** Move the date backwards to the beginning of the current day,
641       ** or month or year.
642       */
643       if( strncmp(z, "start of ", 9)!=0 ) break;
644       z += 9;
645       computeYMD(p);
646       p->validHMS = 1;
647       p->h = p->m = 0;
648       p->s = 0.0;
649       p->validTZ = 0;
650       p->validJD = 0;
651       if( strcmp(z,"month")==0 ){
652         p->D = 1;
653         rc = 0;
654       }else if( strcmp(z,"year")==0 ){
655         computeYMD(p);
656         p->M = 1;
657         p->D = 1;
658         rc = 0;
659       }else if( strcmp(z,"day")==0 ){
660         rc = 0;
661       }
662       break;
663     }
664     case '+':
665     case '-':
666     case '0':
667     case '1':
668     case '2':
669     case '3':
670     case '4':
671     case '5':
672     case '6':
673     case '7':
674     case '8':
675     case '9': {
676       double rRounder;
677       for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){}
678       if( !sqlite3AtoF(z, &r, n, SQLITE_UTF8) ){
679         rc = 1;
680         break;
681       }
682       if( z[n]==':' ){
683         /* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the
684         ** specified number of hours, minutes, seconds, and fractional seconds
685         ** to the time.  The ".FFF" may be omitted.  The ":SS.FFF" may be
686         ** omitted.
687         */
688         const char *z2 = z;
689         DateTime tx;
690         sqlite3_int64 day;
691         if( !sqlite3Isdigit(*z2) ) z2++;
692         memset(&tx, 0, sizeof(tx));
693         if( parseHhMmSs(z2, &tx) ) break;
694         computeJD(&tx);
695         tx.iJD -= 43200000;
696         day = tx.iJD/86400000;
697         tx.iJD -= day*86400000;
698         if( z[0]=='-' ) tx.iJD = -tx.iJD;
699         computeJD(p);
700         clearYMD_HMS_TZ(p);
701         p->iJD += tx.iJD;
702         rc = 0;
703         break;
704       }
705       z += n;
706       while( sqlite3Isspace(*z) ) z++;
707       n = sqlite3Strlen30(z);
708       if( n>10 || n<3 ) break;
709       if( z[n-1]=='s' ){ z[n-1] = 0; n--; }
710       computeJD(p);
711       rc = 0;
712       rRounder = r<0 ? -0.5 : +0.5;
713       if( n==3 && strcmp(z,"day")==0 ){
714         p->iJD += (sqlite3_int64)(r*86400000.0 + rRounder);
715       }else if( n==4 && strcmp(z,"hour")==0 ){
716         p->iJD += (sqlite3_int64)(r*(86400000.0/24.0) + rRounder);
717       }else if( n==6 && strcmp(z,"minute")==0 ){
718         p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0)) + rRounder);
719       }else if( n==6 && strcmp(z,"second")==0 ){
720         p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0*60.0)) + rRounder);
721       }else if( n==5 && strcmp(z,"month")==0 ){
722         int x, y;
723         computeYMD_HMS(p);
724         p->M += (int)r;
725         x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12;
726         p->Y += x;
727         p->M -= x*12;
728         p->validJD = 0;
729         computeJD(p);
730         y = (int)r;
731         if( y!=r ){
732           p->iJD += (sqlite3_int64)((r - y)*30.0*86400000.0 + rRounder);
733         }
734       }else if( n==4 && strcmp(z,"year")==0 ){
735         int y = (int)r;
736         computeYMD_HMS(p);
737         p->Y += y;
738         p->validJD = 0;
739         computeJD(p);
740         if( y!=r ){
741           p->iJD += (sqlite3_int64)((r - y)*365.0*86400000.0 + rRounder);
742         }
743       }else{
744         rc = 1;
745       }
746       clearYMD_HMS_TZ(p);
747       break;
748     }
749     default: {
750       break;
751     }
752   }
753   return rc;
754 }
755 
756 /*
757 ** Process time function arguments.  argv[0] is a date-time stamp.
758 ** argv[1] and following are modifiers.  Parse them all and write
759 ** the resulting time into the DateTime structure p.  Return 0
760 ** on success and 1 if there are any errors.
761 **
762 ** If there are zero parameters (if even argv[0] is undefined)
763 ** then assume a default value of "now" for argv[0].
764 */
765 static int isDate(
766   sqlite3_context *context,
767   int argc,
768   sqlite3_value **argv,
769   DateTime *p
770 ){
771   int i;
772   const unsigned char *z;
773   int eType;
774   memset(p, 0, sizeof(*p));
775   if( argc==0 ){
776     return setDateTimeToCurrent(context, p);
777   }
778   if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
779                    || eType==SQLITE_INTEGER ){
780     p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5);
781     p->validJD = 1;
782   }else{
783     z = sqlite3_value_text(argv[0]);
784     if( !z || parseDateOrTime(context, (char*)z, p) ){
785       return 1;
786     }
787   }
788   for(i=1; i<argc; i++){
789     z = sqlite3_value_text(argv[i]);
790     if( z==0 || parseModifier(context, (char*)z, p) ) return 1;
791   }
792   return 0;
793 }
794 
795 
796 /*
797 ** The following routines implement the various date and time functions
798 ** of SQLite.
799 */
800 
801 /*
802 **    julianday( TIMESTRING, MOD, MOD, ...)
803 **
804 ** Return the julian day number of the date specified in the arguments
805 */
806 static void juliandayFunc(
807   sqlite3_context *context,
808   int argc,
809   sqlite3_value **argv
810 ){
811   DateTime x;
812   if( isDate(context, argc, argv, &x)==0 ){
813     computeJD(&x);
814     sqlite3_result_double(context, x.iJD/86400000.0);
815   }
816 }
817 
818 /*
819 **    datetime( TIMESTRING, MOD, MOD, ...)
820 **
821 ** Return YYYY-MM-DD HH:MM:SS
822 */
823 static void datetimeFunc(
824   sqlite3_context *context,
825   int argc,
826   sqlite3_value **argv
827 ){
828   DateTime x;
829   if( isDate(context, argc, argv, &x)==0 ){
830     char zBuf[100];
831     computeYMD_HMS(&x);
832     sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d %02d:%02d:%02d",
833                      x.Y, x.M, x.D, x.h, x.m, (int)(x.s));
834     sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
835   }
836 }
837 
838 /*
839 **    time( TIMESTRING, MOD, MOD, ...)
840 **
841 ** Return HH:MM:SS
842 */
843 static void timeFunc(
844   sqlite3_context *context,
845   int argc,
846   sqlite3_value **argv
847 ){
848   DateTime x;
849   if( isDate(context, argc, argv, &x)==0 ){
850     char zBuf[100];
851     computeHMS(&x);
852     sqlite3_snprintf(sizeof(zBuf), zBuf, "%02d:%02d:%02d", x.h, x.m, (int)x.s);
853     sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
854   }
855 }
856 
857 /*
858 **    date( TIMESTRING, MOD, MOD, ...)
859 **
860 ** Return YYYY-MM-DD
861 */
862 static void dateFunc(
863   sqlite3_context *context,
864   int argc,
865   sqlite3_value **argv
866 ){
867   DateTime x;
868   if( isDate(context, argc, argv, &x)==0 ){
869     char zBuf[100];
870     computeYMD(&x);
871     sqlite3_snprintf(sizeof(zBuf), zBuf, "%04d-%02d-%02d", x.Y, x.M, x.D);
872     sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
873   }
874 }
875 
876 /*
877 **    strftime( FORMAT, TIMESTRING, MOD, MOD, ...)
878 **
879 ** Return a string described by FORMAT.  Conversions as follows:
880 **
881 **   %d  day of month
882 **   %f  ** fractional seconds  SS.SSS
883 **   %H  hour 00-24
884 **   %j  day of year 000-366
885 **   %J  ** julian day number
886 **   %m  month 01-12
887 **   %M  minute 00-59
888 **   %s  seconds since 1970-01-01
889 **   %S  seconds 00-59
890 **   %w  day of week 0-6  sunday==0
891 **   %W  week of year 00-53
892 **   %Y  year 0000-9999
893 **   %%  %
894 */
895 static void strftimeFunc(
896   sqlite3_context *context,
897   int argc,
898   sqlite3_value **argv
899 ){
900   DateTime x;
901   u64 n;
902   size_t i,j;
903   char *z;
904   sqlite3 *db;
905   const char *zFmt;
906   char zBuf[100];
907   if( argc==0 ) return;
908   zFmt = (const char*)sqlite3_value_text(argv[0]);
909   if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return;
910   db = sqlite3_context_db_handle(context);
911   for(i=0, n=1; zFmt[i]; i++, n++){
912     if( zFmt[i]=='%' ){
913       switch( zFmt[i+1] ){
914         case 'd':
915         case 'H':
916         case 'm':
917         case 'M':
918         case 'S':
919         case 'W':
920           n++;
921           /* fall thru */
922         case 'w':
923         case '%':
924           break;
925         case 'f':
926           n += 8;
927           break;
928         case 'j':
929           n += 3;
930           break;
931         case 'Y':
932           n += 8;
933           break;
934         case 's':
935         case 'J':
936           n += 50;
937           break;
938         default:
939           return;  /* ERROR.  return a NULL */
940       }
941       i++;
942     }
943   }
944   testcase( n==sizeof(zBuf)-1 );
945   testcase( n==sizeof(zBuf) );
946   testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH]+1 );
947   testcase( n==(u64)db->aLimit[SQLITE_LIMIT_LENGTH] );
948   if( n<sizeof(zBuf) ){
949     z = zBuf;
950   }else if( n>(u64)db->aLimit[SQLITE_LIMIT_LENGTH] ){
951     sqlite3_result_error_toobig(context);
952     return;
953   }else{
954     z = sqlite3DbMallocRaw(db, (int)n);
955     if( z==0 ){
956       sqlite3_result_error_nomem(context);
957       return;
958     }
959   }
960   computeJD(&x);
961   computeYMD_HMS(&x);
962   for(i=j=0; zFmt[i]; i++){
963     if( zFmt[i]!='%' ){
964       z[j++] = zFmt[i];
965     }else{
966       i++;
967       switch( zFmt[i] ){
968         case 'd':  sqlite3_snprintf(3, &z[j],"%02d",x.D); j+=2; break;
969         case 'f': {
970           double s = x.s;
971           if( s>59.999 ) s = 59.999;
972           sqlite3_snprintf(7, &z[j],"%06.3f", s);
973           j += sqlite3Strlen30(&z[j]);
974           break;
975         }
976         case 'H':  sqlite3_snprintf(3, &z[j],"%02d",x.h); j+=2; break;
977         case 'W': /* Fall thru */
978         case 'j': {
979           int nDay;             /* Number of days since 1st day of year */
980           DateTime y = x;
981           y.validJD = 0;
982           y.M = 1;
983           y.D = 1;
984           computeJD(&y);
985           nDay = (int)((x.iJD-y.iJD+43200000)/86400000);
986           if( zFmt[i]=='W' ){
987             int wd;   /* 0=Monday, 1=Tuesday, ... 6=Sunday */
988             wd = (int)(((x.iJD+43200000)/86400000)%7);
989             sqlite3_snprintf(3, &z[j],"%02d",(nDay+7-wd)/7);
990             j += 2;
991           }else{
992             sqlite3_snprintf(4, &z[j],"%03d",nDay+1);
993             j += 3;
994           }
995           break;
996         }
997         case 'J': {
998           sqlite3_snprintf(20, &z[j],"%.16g",x.iJD/86400000.0);
999           j+=sqlite3Strlen30(&z[j]);
1000           break;
1001         }
1002         case 'm':  sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break;
1003         case 'M':  sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break;
1004         case 's': {
1005           sqlite3_snprintf(30,&z[j],"%lld",
1006                            (i64)(x.iJD/1000 - 21086676*(i64)10000));
1007           j += sqlite3Strlen30(&z[j]);
1008           break;
1009         }
1010         case 'S':  sqlite3_snprintf(3,&z[j],"%02d",(int)x.s); j+=2; break;
1011         case 'w': {
1012           z[j++] = (char)(((x.iJD+129600000)/86400000) % 7) + '0';
1013           break;
1014         }
1015         case 'Y': {
1016           sqlite3_snprintf(5,&z[j],"%04d",x.Y); j+=sqlite3Strlen30(&z[j]);
1017           break;
1018         }
1019         default:   z[j++] = '%'; break;
1020       }
1021     }
1022   }
1023   z[j] = 0;
1024   sqlite3_result_text(context, z, -1,
1025                       z==zBuf ? SQLITE_TRANSIENT : SQLITE_DYNAMIC);
1026 }
1027 
1028 /*
1029 ** current_time()
1030 **
1031 ** This function returns the same value as time('now').
1032 */
1033 static void ctimeFunc(
1034   sqlite3_context *context,
1035   int NotUsed,
1036   sqlite3_value **NotUsed2
1037 ){
1038   UNUSED_PARAMETER2(NotUsed, NotUsed2);
1039   timeFunc(context, 0, 0);
1040 }
1041 
1042 /*
1043 ** current_date()
1044 **
1045 ** This function returns the same value as date('now').
1046 */
1047 static void cdateFunc(
1048   sqlite3_context *context,
1049   int NotUsed,
1050   sqlite3_value **NotUsed2
1051 ){
1052   UNUSED_PARAMETER2(NotUsed, NotUsed2);
1053   dateFunc(context, 0, 0);
1054 }
1055 
1056 /*
1057 ** current_timestamp()
1058 **
1059 ** This function returns the same value as datetime('now').
1060 */
1061 static void ctimestampFunc(
1062   sqlite3_context *context,
1063   int NotUsed,
1064   sqlite3_value **NotUsed2
1065 ){
1066   UNUSED_PARAMETER2(NotUsed, NotUsed2);
1067   datetimeFunc(context, 0, 0);
1068 }
1069 #endif /* !defined(SQLITE_OMIT_DATETIME_FUNCS) */
1070 
1071 #ifdef SQLITE_OMIT_DATETIME_FUNCS
1072 /*
1073 ** If the library is compiled to omit the full-scale date and time
1074 ** handling (to get a smaller binary), the following minimal version
1075 ** of the functions current_time(), current_date() and current_timestamp()
1076 ** are included instead. This is to support column declarations that
1077 ** include "DEFAULT CURRENT_TIME" etc.
1078 **
1079 ** This function uses the C-library functions time(), gmtime()
1080 ** and strftime(). The format string to pass to strftime() is supplied
1081 ** as the user-data for the function.
1082 */
1083 static void currentTimeFunc(
1084   sqlite3_context *context,
1085   int argc,
1086   sqlite3_value **argv
1087 ){
1088   time_t t;
1089   char *zFormat = (char *)sqlite3_user_data(context);
1090   sqlite3 *db;
1091   sqlite3_int64 iT;
1092   struct tm *pTm;
1093   struct tm sNow;
1094   char zBuf[20];
1095 
1096   UNUSED_PARAMETER(argc);
1097   UNUSED_PARAMETER(argv);
1098 
1099   iT = sqlite3StmtCurrentTime(context);
1100   if( iT<=0 ) return;
1101   t = iT/1000 - 10000*(sqlite3_int64)21086676;
1102 #if HAVE_GMTIME_R
1103   pTm = gmtime_r(&t, &sNow);
1104 #else
1105   sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1106   pTm = gmtime(&t);
1107   if( pTm ) memcpy(&sNow, pTm, sizeof(sNow));
1108   sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1109 #endif
1110   if( pTm ){
1111     strftime(zBuf, 20, zFormat, &sNow);
1112     sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
1113   }
1114 }
1115 #endif
1116 
1117 /*
1118 ** This function registered all of the above C functions as SQL
1119 ** functions.  This should be the only routine in this file with
1120 ** external linkage.
1121 */
1122 void sqlite3RegisterDateTimeFunctions(void){
1123   static SQLITE_WSD FuncDef aDateTimeFuncs[] = {
1124 #ifndef SQLITE_OMIT_DATETIME_FUNCS
1125     DFUNCTION(julianday,        -1, 0, 0, juliandayFunc ),
1126     DFUNCTION(date,             -1, 0, 0, dateFunc      ),
1127     DFUNCTION(time,             -1, 0, 0, timeFunc      ),
1128     DFUNCTION(datetime,         -1, 0, 0, datetimeFunc  ),
1129     DFUNCTION(strftime,         -1, 0, 0, strftimeFunc  ),
1130     DFUNCTION(current_time,      0, 0, 0, ctimeFunc     ),
1131     DFUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc),
1132     DFUNCTION(current_date,      0, 0, 0, cdateFunc     ),
1133 #else
1134     STR_FUNCTION(current_time,      0, "%H:%M:%S",          0, currentTimeFunc),
1135     STR_FUNCTION(current_date,      0, "%Y-%m-%d",          0, currentTimeFunc),
1136     STR_FUNCTION(current_timestamp, 0, "%Y-%m-%d %H:%M:%S", 0, currentTimeFunc),
1137 #endif
1138   };
1139   int i;
1140   FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
1141   FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aDateTimeFuncs);
1142 
1143   for(i=0; i<ArraySize(aDateTimeFuncs); i++){
1144     sqlite3FuncDefInsert(pHash, &aFunc[i]);
1145   }
1146 }
1147