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