Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: third_party/sqlite/sqlite-src-3080704/src/date.c

Issue 883353008: [sql] Import reference version of SQLite 3.8.7.4. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Hold back encoding change which is messing up patch. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 ** 2003 October 31 2 ** 2003 October 31
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
11 ************************************************************************* 11 *************************************************************************
12 ** This file contains the C functions that implement date and time 12 ** This file contains the C functions that implement date and time
13 ** functions for SQLite. 13 ** functions for SQLite.
14 ** 14 **
15 ** There is only one exported symbol in this file - the function 15 ** There is only one exported symbol in this file - the function
16 ** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. 16 ** sqlite3RegisterDateTimeFunctions() found at the bottom of the file.
17 ** All other code has file scope. 17 ** All other code has file scope.
18 ** 18 **
19 ** SQLite processes all times and dates as Julian Day numbers. The 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 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 21 ** in Greenwich on November 24, 4714 B.C. according to the Gregorian
22 ** calendar system. 22 ** calendar system.
23 ** 23 **
24 ** 1970-01-01 00:00:00 is JD 2440587.5 24 ** 1970-01-01 00:00:00 is JD 2440587.5
25 ** 2000-01-01 00:00:00 is JD 2451544.5 25 ** 2000-01-01 00:00:00 is JD 2451544.5
26 ** 26 **
27 ** This implemention requires years to be expressed as a 4-digit number 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 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 29 ** be represented, even though julian day numbers allow a much wider
30 ** range of dates. 30 ** range of dates.
31 ** 31 **
32 ** The Gregorian calendar system is used for all dates and times, 32 ** The Gregorian calendar system is used for all dates and times,
33 ** even those that predate the Gregorian calendar. Historians usually 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 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. 35 ** dates afterwards, depending on locale. Beware of this difference.
36 ** 36 **
37 ** The conversion algorithms are implemented based on descriptions 37 ** The conversion algorithms are implemented based on descriptions
38 ** in the following text: 38 ** in the following text:
39 ** 39 **
40 ** Jean Meeus 40 ** Jean Meeus
41 ** Astronomical Algorithms, 2nd Edition, 1998 41 ** Astronomical Algorithms, 2nd Edition, 1998
42 ** ISBM 0-943396-61-1 42 ** ISBM 0-943396-61-1
43 ** Willmann-Bell, Inc 43 ** Willmann-Bell, Inc
44 ** Richmond, Virginia (USA) 44 ** Richmond, Virginia (USA)
45 */ 45 */
46 #include "sqliteInt.h" 46 #include "sqliteInt.h"
47 #include <stdlib.h> 47 #include <stdlib.h>
48 #include <assert.h> 48 #include <assert.h>
49 #include <time.h> 49 #include <time.h>
50 50
51 #ifndef SQLITE_OMIT_DATETIME_FUNCS 51 #ifndef SQLITE_OMIT_DATETIME_FUNCS
52 52
53 /*
54 ** On recent Windows platforms, the localtime_s() function is available
55 ** as part of the "Secure CRT". It is essentially equivalent to
56 ** localtime_r() available under most POSIX platforms, except that the
57 ** order of the parameters is reversed.
58 **
59 ** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx.
60 **
61 ** If the user has not indicated to use localtime_r() or localtime_s()
62 ** already, check for an MSVC build environment that provides
63 ** localtime_s().
64 */
65 #if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) && \
66 defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE)
67 #define HAVE_LOCALTIME_S 1
68 #endif
69 53
70 /* 54 /*
71 ** A structure for holding a single date and time. 55 ** A structure for holding a single date and time.
72 */ 56 */
73 typedef struct DateTime DateTime; 57 typedef struct DateTime DateTime;
74 struct DateTime { 58 struct DateTime {
75 sqlite3_int64 iJD; /* The julian day number times 86400000 */ 59 sqlite3_int64 iJD; /* The julian day number times 86400000 */
76 int Y, M, D; /* Year, month, and day */ 60 int Y, M, D; /* Year, month, and day */
77 int h, m; /* Hour and minutes */ 61 int h, m; /* Hour and minutes */
78 int tz; /* Timezone offset in minutes */ 62 int tz; /* Timezone offset in minutes */
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 p->Y = neg ? -Y : Y; 282 p->Y = neg ? -Y : Y;
299 p->M = M; 283 p->M = M;
300 p->D = D; 284 p->D = D;
301 if( p->validTZ ){ 285 if( p->validTZ ){
302 computeJD(p); 286 computeJD(p);
303 } 287 }
304 return 0; 288 return 0;
305 } 289 }
306 290
307 /* 291 /*
308 ** Set the time to the current time reported by the VFS 292 ** Set the time to the current time reported by the VFS.
293 **
294 ** Return the number of errors.
309 */ 295 */
310 static void setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ 296 static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
311 sqlite3 *db = sqlite3_context_db_handle(context); 297 p->iJD = sqlite3StmtCurrentTime(context);
312 sqlite3OsCurrentTimeInt64(db->pVfs, &p->iJD); 298 if( p->iJD>0 ){
313 p->validJD = 1; 299 p->validJD = 1;
300 return 0;
301 }else{
302 return 1;
303 }
314 } 304 }
315 305
316 /* 306 /*
317 ** Attempt to parse the given string into a Julian Day Number. Return 307 ** Attempt to parse the given string into a Julian Day Number. Return
318 ** the number of errors. 308 ** the number of errors.
319 ** 309 **
320 ** The following are acceptable forms for the input string: 310 ** The following are acceptable forms for the input string:
321 ** 311 **
322 ** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM 312 ** YYYY-MM-DD HH:MM:SS.FFF +/-HH:MM
323 ** DDDD.DD 313 ** DDDD.DD
324 ** now 314 ** now
325 ** 315 **
326 ** In the first form, the +/-HH:MM is always optional. The fractional 316 ** In the first form, the +/-HH:MM is always optional. The fractional
327 ** seconds extension (the ".FFF") is optional. The seconds portion 317 ** seconds extension (the ".FFF") is optional. The seconds portion
328 ** (":SS.FFF") is option. The year and date can be omitted as long 318 ** (":SS.FFF") is option. The year and date can be omitted as long
329 ** as there is a time string. The time string can be omitted as long 319 ** as there is a time string. The time string can be omitted as long
330 ** as there is a year and date. 320 ** as there is a year and date.
331 */ 321 */
332 static int parseDateOrTime( 322 static int parseDateOrTime(
333 sqlite3_context *context, 323 sqlite3_context *context,
334 const char *zDate, 324 const char *zDate,
335 DateTime *p 325 DateTime *p
336 ){ 326 ){
337 double r; 327 double r;
338 if( parseYyyyMmDd(zDate,p)==0 ){ 328 if( parseYyyyMmDd(zDate,p)==0 ){
339 return 0; 329 return 0;
340 }else if( parseHhMmSs(zDate, p)==0 ){ 330 }else if( parseHhMmSs(zDate, p)==0 ){
341 return 0; 331 return 0;
342 }else if( sqlite3StrICmp(zDate,"now")==0){ 332 }else if( sqlite3StrICmp(zDate,"now")==0){
343 setDateTimeToCurrent(context, p); 333 return setDateTimeToCurrent(context, p);
344 return 0;
345 }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){ 334 }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){
346 p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); 335 p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5);
347 p->validJD = 1; 336 p->validJD = 1;
348 return 0; 337 return 0;
349 } 338 }
350 return 1; 339 return 1;
351 } 340 }
352 341
353 /* 342 /*
354 ** Compute the Year, Month, and Day from the julian day number. 343 ** Compute the Year, Month, and Day from the julian day number.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 393
405 /* 394 /*
406 ** Clear the YMD and HMS and the TZ 395 ** Clear the YMD and HMS and the TZ
407 */ 396 */
408 static void clearYMD_HMS_TZ(DateTime *p){ 397 static void clearYMD_HMS_TZ(DateTime *p){
409 p->validYMD = 0; 398 p->validYMD = 0;
410 p->validHMS = 0; 399 p->validHMS = 0;
411 p->validTZ = 0; 400 p->validTZ = 0;
412 } 401 }
413 402
403 /*
404 ** On recent Windows platforms, the localtime_s() function is available
405 ** as part of the "Secure CRT". It is essentially equivalent to
406 ** localtime_r() available under most POSIX platforms, except that the
407 ** order of the parameters is reversed.
408 **
409 ** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx.
410 **
411 ** If the user has not indicated to use localtime_r() or localtime_s()
412 ** already, check for an MSVC build environment that provides
413 ** localtime_s().
414 */
415 #if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) && \
416 defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE)
417 #define HAVE_LOCALTIME_S 1
418 #endif
419
414 #ifndef SQLITE_OMIT_LOCALTIME 420 #ifndef SQLITE_OMIT_LOCALTIME
415 /* 421 /*
416 ** Compute the difference (in milliseconds) 422 ** The following routine implements the rough equivalent of localtime_r()
417 ** between localtime and UTC (a.k.a. GMT) 423 ** using whatever operating-system specific localtime facility that
418 ** for the time value p where p is in UTC. 424 ** is available. This routine returns 0 on success and
425 ** non-zero on any kind of error.
426 **
427 ** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this
428 ** routine will always fail.
429 **
430 ** EVIDENCE-OF: R-62172-00036 In this implementation, the standard C
431 ** library function localtime_r() is used to assist in the calculation of
432 ** local time.
419 */ 433 */
420 static sqlite3_int64 localtimeOffset(DateTime *p){ 434 static int osLocaltime(time_t *t, struct tm *pTm){
435 int rc;
436 #if (!defined(HAVE_LOCALTIME_R) || !HAVE_LOCALTIME_R) \
437 && (!defined(HAVE_LOCALTIME_S) || !HAVE_LOCALTIME_S)
438 struct tm *pX;
439 #if SQLITE_THREADSAFE>0
440 sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
441 #endif
442 sqlite3_mutex_enter(mutex);
443 pX = localtime(t);
444 #ifndef SQLITE_OMIT_BUILTIN_TEST
445 if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0;
446 #endif
447 if( pX ) *pTm = *pX;
448 sqlite3_mutex_leave(mutex);
449 rc = pX==0;
450 #else
451 #ifndef SQLITE_OMIT_BUILTIN_TEST
452 if( sqlite3GlobalConfig.bLocaltimeFault ) return 1;
453 #endif
454 #if defined(HAVE_LOCALTIME_R) && HAVE_LOCALTIME_R
455 rc = localtime_r(t, pTm)==0;
456 #else
457 rc = localtime_s(pTm, t);
458 #endif /* HAVE_LOCALTIME_R */
459 #endif /* HAVE_LOCALTIME_R || HAVE_LOCALTIME_S */
460 return rc;
461 }
462 #endif /* SQLITE_OMIT_LOCALTIME */
463
464
465 #ifndef SQLITE_OMIT_LOCALTIME
466 /*
467 ** Compute the difference (in milliseconds) between localtime and UTC
468 ** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs,
469 ** return this value and set *pRc to SQLITE_OK.
470 **
471 ** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value
472 ** is undefined in this case.
473 */
474 static sqlite3_int64 localtimeOffset(
475 DateTime *p, /* Date at which to calculate offset */
476 sqlite3_context *pCtx, /* Write error here if one occurs */
477 int *pRc /* OUT: Error code. SQLITE_OK or ERROR */
478 ){
421 DateTime x, y; 479 DateTime x, y;
422 time_t t; 480 time_t t;
481 struct tm sLocal;
482
483 /* Initialize the contents of sLocal to avoid a compiler warning. */
484 memset(&sLocal, 0, sizeof(sLocal));
485
423 x = *p; 486 x = *p;
424 computeYMD_HMS(&x); 487 computeYMD_HMS(&x);
425 if( x.Y<1971 || x.Y>=2038 ){ 488 if( x.Y<1971 || x.Y>=2038 ){
489 /* EVIDENCE-OF: R-55269-29598 The localtime_r() C function normally only
490 ** works for years between 1970 and 2037. For dates outside this range,
491 ** SQLite attempts to map the year into an equivalent year within this
492 ** range, do the calculation, then map the year back.
493 */
426 x.Y = 2000; 494 x.Y = 2000;
427 x.M = 1; 495 x.M = 1;
428 x.D = 1; 496 x.D = 1;
429 x.h = 0; 497 x.h = 0;
430 x.m = 0; 498 x.m = 0;
431 x.s = 0.0; 499 x.s = 0.0;
432 } else { 500 } else {
433 int s = (int)(x.s + 0.5); 501 int s = (int)(x.s + 0.5);
434 x.s = s; 502 x.s = s;
435 } 503 }
436 x.tz = 0; 504 x.tz = 0;
437 x.validJD = 0; 505 x.validJD = 0;
438 computeJD(&x); 506 computeJD(&x);
439 t = (time_t)(x.iJD/1000 - 21086676*(i64)10000); 507 t = (time_t)(x.iJD/1000 - 21086676*(i64)10000);
440 #ifdef HAVE_LOCALTIME_R 508 if( osLocaltime(&t, &sLocal) ){
441 { 509 sqlite3_result_error(pCtx, "local time unavailable", -1);
442 struct tm sLocal; 510 *pRc = SQLITE_ERROR;
443 localtime_r(&t, &sLocal); 511 return 0;
444 y.Y = sLocal.tm_year + 1900;
445 y.M = sLocal.tm_mon + 1;
446 y.D = sLocal.tm_mday;
447 y.h = sLocal.tm_hour;
448 y.m = sLocal.tm_min;
449 y.s = sLocal.tm_sec;
450 } 512 }
451 #elif defined(HAVE_LOCALTIME_S) && HAVE_LOCALTIME_S 513 y.Y = sLocal.tm_year + 1900;
452 { 514 y.M = sLocal.tm_mon + 1;
453 struct tm sLocal; 515 y.D = sLocal.tm_mday;
454 localtime_s(&sLocal, &t); 516 y.h = sLocal.tm_hour;
455 y.Y = sLocal.tm_year + 1900; 517 y.m = sLocal.tm_min;
456 y.M = sLocal.tm_mon + 1; 518 y.s = sLocal.tm_sec;
457 y.D = sLocal.tm_mday;
458 y.h = sLocal.tm_hour;
459 y.m = sLocal.tm_min;
460 y.s = sLocal.tm_sec;
461 }
462 #else
463 {
464 struct tm *pTm;
465 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
466 pTm = localtime(&t);
467 y.Y = pTm->tm_year + 1900;
468 y.M = pTm->tm_mon + 1;
469 y.D = pTm->tm_mday;
470 y.h = pTm->tm_hour;
471 y.m = pTm->tm_min;
472 y.s = pTm->tm_sec;
473 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
474 }
475 #endif
476 y.validYMD = 1; 519 y.validYMD = 1;
477 y.validHMS = 1; 520 y.validHMS = 1;
478 y.validJD = 0; 521 y.validJD = 0;
479 y.validTZ = 0; 522 y.validTZ = 0;
480 computeJD(&y); 523 computeJD(&y);
524 *pRc = SQLITE_OK;
481 return y.iJD - x.iJD; 525 return y.iJD - x.iJD;
482 } 526 }
483 #endif /* SQLITE_OMIT_LOCALTIME */ 527 #endif /* SQLITE_OMIT_LOCALTIME */
484 528
485 /* 529 /*
486 ** Process a modifier to a date-time stamp. The modifiers are 530 ** Process a modifier to a date-time stamp. The modifiers are
487 ** as follows: 531 ** as follows:
488 ** 532 **
489 ** NNN days 533 ** NNN days
490 ** NNN hours 534 ** NNN hours
491 ** NNN minutes 535 ** NNN minutes
492 ** NNN.NNNN seconds 536 ** NNN.NNNN seconds
493 ** NNN months 537 ** NNN months
494 ** NNN years 538 ** NNN years
495 ** start of month 539 ** start of month
496 ** start of year 540 ** start of year
497 ** start of week 541 ** start of week
498 ** start of day 542 ** start of day
499 ** weekday N 543 ** weekday N
500 ** unixepoch 544 ** unixepoch
501 ** localtime 545 ** localtime
502 ** utc 546 ** utc
503 ** 547 **
504 ** Return 0 on success and 1 if there is any kind of error. 548 ** Return 0 on success and 1 if there is any kind of error. If the error
549 ** is in a system call (i.e. localtime()), then an error message is written
550 ** to context pCtx. If the error is an unrecognized modifier, no error is
551 ** written to pCtx.
505 */ 552 */
506 static int parseModifier(const char *zMod, DateTime *p){ 553 static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){
507 int rc = 1; 554 int rc = 1;
508 int n; 555 int n;
509 double r; 556 double r;
510 char *z, zBuf[30]; 557 char *z, zBuf[30];
511 z = zBuf; 558 z = zBuf;
512 for(n=0; n<ArraySize(zBuf)-1 && zMod[n]; n++){ 559 for(n=0; n<ArraySize(zBuf)-1 && zMod[n]; n++){
513 z[n] = (char)sqlite3UpperToLower[(u8)zMod[n]]; 560 z[n] = (char)sqlite3UpperToLower[(u8)zMod[n]];
514 } 561 }
515 z[n] = 0; 562 z[n] = 0;
516 switch( z[0] ){ 563 switch( z[0] ){
517 #ifndef SQLITE_OMIT_LOCALTIME 564 #ifndef SQLITE_OMIT_LOCALTIME
518 case 'l': { 565 case 'l': {
519 /* localtime 566 /* localtime
520 ** 567 **
521 ** Assuming the current time value is UTC (a.k.a. GMT), shift it to 568 ** Assuming the current time value is UTC (a.k.a. GMT), shift it to
522 ** show local time. 569 ** show local time.
523 */ 570 */
524 if( strcmp(z, "localtime")==0 ){ 571 if( strcmp(z, "localtime")==0 ){
525 computeJD(p); 572 computeJD(p);
526 p->iJD += localtimeOffset(p); 573 p->iJD += localtimeOffset(p, pCtx, &rc);
527 clearYMD_HMS_TZ(p); 574 clearYMD_HMS_TZ(p);
528 rc = 0;
529 } 575 }
530 break; 576 break;
531 } 577 }
532 #endif 578 #endif
533 case 'u': { 579 case 'u': {
534 /* 580 /*
535 ** unixepoch 581 ** unixepoch
536 ** 582 **
537 ** Treat the current value of p->iJD as the number of 583 ** Treat the current value of p->iJD as the number of
538 ** seconds since 1970. Convert to a real julian day number. 584 ** seconds since 1970. Convert to a real julian day number.
539 */ 585 */
540 if( strcmp(z, "unixepoch")==0 && p->validJD ){ 586 if( strcmp(z, "unixepoch")==0 && p->validJD ){
541 p->iJD = (p->iJD + 43200)/86400 + 21086676*(i64)10000000; 587 p->iJD = (p->iJD + 43200)/86400 + 21086676*(i64)10000000;
542 clearYMD_HMS_TZ(p); 588 clearYMD_HMS_TZ(p);
543 rc = 0; 589 rc = 0;
544 } 590 }
545 #ifndef SQLITE_OMIT_LOCALTIME 591 #ifndef SQLITE_OMIT_LOCALTIME
546 else if( strcmp(z, "utc")==0 ){ 592 else if( strcmp(z, "utc")==0 ){
547 sqlite3_int64 c1; 593 sqlite3_int64 c1;
548 computeJD(p); 594 computeJD(p);
549 c1 = localtimeOffset(p); 595 c1 = localtimeOffset(p, pCtx, &rc);
550 p->iJD -= c1; 596 if( rc==SQLITE_OK ){
551 clearYMD_HMS_TZ(p); 597 p->iJD -= c1;
552 p->iJD += c1 - localtimeOffset(p); 598 clearYMD_HMS_TZ(p);
553 rc = 0; 599 p->iJD += c1 - localtimeOffset(p, pCtx, &rc);
600 }
554 } 601 }
555 #endif 602 #endif
556 break; 603 break;
557 } 604 }
558 case 'w': { 605 case 'w': {
559 /* 606 /*
560 ** weekday N 607 ** weekday N
561 ** 608 **
562 ** Move the date to the same time on the next occurrence of 609 ** Move the date to the same time on the next occurrence of
563 ** weekday N where 0==Sunday, 1==Monday, and so forth. If the 610 ** weekday N where 0==Sunday, 1==Monday, and so forth. If the
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
712 sqlite3_context *context, 759 sqlite3_context *context,
713 int argc, 760 int argc,
714 sqlite3_value **argv, 761 sqlite3_value **argv,
715 DateTime *p 762 DateTime *p
716 ){ 763 ){
717 int i; 764 int i;
718 const unsigned char *z; 765 const unsigned char *z;
719 int eType; 766 int eType;
720 memset(p, 0, sizeof(*p)); 767 memset(p, 0, sizeof(*p));
721 if( argc==0 ){ 768 if( argc==0 ){
722 setDateTimeToCurrent(context, p); 769 return setDateTimeToCurrent(context, p);
723 }else if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT 770 }
771 if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
724 || eType==SQLITE_INTEGER ){ 772 || eType==SQLITE_INTEGER ){
725 p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5); 773 p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5);
726 p->validJD = 1; 774 p->validJD = 1;
727 }else{ 775 }else{
728 z = sqlite3_value_text(argv[0]); 776 z = sqlite3_value_text(argv[0]);
729 if( !z || parseDateOrTime(context, (char*)z, p) ){ 777 if( !z || parseDateOrTime(context, (char*)z, p) ){
730 return 1; 778 return 1;
731 } 779 }
732 } 780 }
733 for(i=1; i<argc; i++){ 781 for(i=1; i<argc; i++){
734 if( (z = sqlite3_value_text(argv[i]))==0 || parseModifier((char*)z, p) ){ 782 z = sqlite3_value_text(argv[i]);
735 return 1; 783 if( z==0 || parseModifier(context, (char*)z, p) ) return 1;
736 }
737 } 784 }
738 return 0; 785 return 0;
739 } 786 }
740 787
741 788
742 /* 789 /*
743 ** The following routines implement the various date and time functions 790 ** The following routines implement the various date and time functions
744 ** of SQLite. 791 ** of SQLite.
745 */ 792 */
746 793
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 */ 1073 */
1027 static void currentTimeFunc( 1074 static void currentTimeFunc(
1028 sqlite3_context *context, 1075 sqlite3_context *context,
1029 int argc, 1076 int argc,
1030 sqlite3_value **argv 1077 sqlite3_value **argv
1031 ){ 1078 ){
1032 time_t t; 1079 time_t t;
1033 char *zFormat = (char *)sqlite3_user_data(context); 1080 char *zFormat = (char *)sqlite3_user_data(context);
1034 sqlite3 *db; 1081 sqlite3 *db;
1035 sqlite3_int64 iT; 1082 sqlite3_int64 iT;
1083 struct tm *pTm;
1084 struct tm sNow;
1036 char zBuf[20]; 1085 char zBuf[20];
1037 1086
1038 UNUSED_PARAMETER(argc); 1087 UNUSED_PARAMETER(argc);
1039 UNUSED_PARAMETER(argv); 1088 UNUSED_PARAMETER(argv);
1040 1089
1041 db = sqlite3_context_db_handle(context); 1090 iT = sqlite3StmtCurrentTime(context);
1042 sqlite3OsCurrentTimeInt64(db->pVfs, &iT); 1091 if( iT<=0 ) return;
1043 t = iT/1000 - 10000*(sqlite3_int64)21086676; 1092 t = iT/1000 - 10000*(sqlite3_int64)21086676;
1044 #ifdef HAVE_GMTIME_R 1093 #ifdef HAVE_GMTIME_R
1045 { 1094 pTm = gmtime_r(&t, &sNow);
1046 struct tm sNow; 1095 #else
1047 gmtime_r(&t, &sNow); 1096 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1097 pTm = gmtime(&t);
1098 if( pTm ) memcpy(&sNow, pTm, sizeof(sNow));
1099 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1100 #endif
1101 if( pTm ){
1048 strftime(zBuf, 20, zFormat, &sNow); 1102 strftime(zBuf, 20, zFormat, &sNow);
1103 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
1049 } 1104 }
1050 #else
1051 {
1052 struct tm *pTm;
1053 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1054 pTm = gmtime(&t);
1055 strftime(zBuf, 20, zFormat, pTm);
1056 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
1057 }
1058 #endif
1059
1060 sqlite3_result_text(context, zBuf, -1, SQLITE_TRANSIENT);
1061 } 1105 }
1062 #endif 1106 #endif
1063 1107
1064 /* 1108 /*
1065 ** This function registered all of the above C functions as SQL 1109 ** This function registered all of the above C functions as SQL
1066 ** functions. This should be the only routine in this file with 1110 ** functions. This should be the only routine in this file with
1067 ** external linkage. 1111 ** external linkage.
1068 */ 1112 */
1069 void sqlite3RegisterDateTimeFunctions(void){ 1113 void sqlite3RegisterDateTimeFunctions(void){
1070 static SQLITE_WSD FuncDef aDateTimeFuncs[] = { 1114 static SQLITE_WSD FuncDef aDateTimeFuncs[] = {
(...skipping 13 matching lines...) Expand all
1084 #endif 1128 #endif
1085 }; 1129 };
1086 int i; 1130 int i;
1087 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions); 1131 FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions);
1088 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aDateTimeFuncs); 1132 FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aDateTimeFuncs);
1089 1133
1090 for(i=0; i<ArraySize(aDateTimeFuncs); i++){ 1134 for(i=0; i<ArraySize(aDateTimeFuncs); i++){
1091 sqlite3FuncDefInsert(pHash, &aFunc[i]); 1135 sqlite3FuncDefInsert(pHash, &aFunc[i]);
1092 } 1136 }
1093 } 1137 }
OLDNEW
« no previous file with comments | « third_party/sqlite/sqlite-src-3080704/src/ctime.c ('k') | third_party/sqlite/sqlite-src-3080704/src/delete.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698