/ Hex Artifact Content
Login

Artifact 21413a0fc3962e2f18ba471883bcc35ddd7ff314:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 4f 63 74 6f 62  /*.** 2003 Octob
0010: 65 72 20 33 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 31.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  e contains the C
0190: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
01a0: 69 6d 70 6c 65 6d 65 6e 74 20 64 61 74 65 20 61  implement date a
01b0: 6e 64 20 74 69 6d 65 0a 2a 2a 20 66 75 6e 63 74  nd time.** funct
01c0: 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 2e  ions for SQLite.
01d0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69    .**.** There i
01e0: 73 20 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72  s only one expor
01f0: 74 65 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  ted symbol in th
0200: 69 73 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75  is file - the fu
0210: 6e 63 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65  nction.** sqlite
0220: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
0230: 65 46 75 6e 63 74 69 6f 6e 73 28 29 20 66 6f 75  eFunctions() fou
0240: 6e 64 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  nd at the bottom
0250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   of the file..**
0260: 20 41 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   All other code 
0270: 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 2e 0a  has file scope..
0280: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64 61 74 65 2e  **.** $Id: date.
0290: 63 2c 76 20 31 2e 34 30 20 32 30 30 34 2f 31 31  c,v 1.40 2004/11
02a0: 2f 31 30 20 31 31 3a 35 35 3a 31 32 20 64 61 6e  /10 11:55:12 dan
02b0: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a  ielk1977 Exp $.*
02c0: 2a 0a 2a 2a 20 4e 4f 54 45 53 3a 0a 2a 2a 0a 2a  *.** NOTES:.**.*
02d0: 2a 20 53 51 4c 69 74 65 20 70 72 6f 63 65 73 73  * SQLite process
02e0: 65 73 20 61 6c 6c 20 74 69 6d 65 73 20 61 6e 64  es all times and
02f0: 20 64 61 74 65 73 20 61 73 20 4a 75 6c 69 61 6e   dates as Julian
0300: 20 44 61 79 20 6e 75 6d 62 65 72 73 2e 20 20 54   Day numbers.  T
0310: 68 65 0a 2a 2a 20 64 61 74 65 73 20 61 6e 64 20  he.** dates and 
0320: 74 69 6d 65 73 20 61 72 65 20 73 74 6f 72 65 64  times are stored
0330: 20 61 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   as the number o
0340: 66 20 64 61 79 73 20 73 69 6e 63 65 20 6e 6f 6f  f days since noo
0350: 6e 0a 2a 2a 20 69 6e 20 47 72 65 65 6e 77 69 63  n.** in Greenwic
0360: 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
0370: 2c 20 34 37 31 34 20 42 2e 43 2e 20 61 63 63 6f  , 4714 B.C. acco
0380: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 47 72 65  rding to the Gre
0390: 67 6f 72 69 61 6e 0a 2a 2a 20 63 61 6c 65 6e 64  gorian.** calend
03a0: 61 72 20 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a  ar system..**.**
03b0: 20 31 39 37 30 2d 30 31 2d 30 31 20 30 30 3a 30   1970-01-01 00:0
03c0: 30 3a 30 30 20 69 73 20 4a 44 20 32 34 34 30 35  0:00 is JD 24405
03d0: 38 37 2e 35 0a 2a 2a 20 32 30 30 30 2d 30 31 2d  87.5.** 2000-01-
03e0: 30 31 20 30 30 3a 30 30 3a 30 30 20 69 73 20 4a  01 00:00:00 is J
03f0: 44 20 32 34 35 31 35 34 34 2e 35 0a 2a 2a 0a 2a  D 2451544.5.**.*
0400: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
0410: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 79 65 61  ion requires yea
0420: 72 73 20 74 6f 20 62 65 20 65 78 70 72 65 73 73  rs to be express
0430: 65 64 20 61 73 20 61 20 34 2d 64 69 67 69 74 20  ed as a 4-digit 
0440: 6e 75 6d 62 65 72 0a 2a 2a 20 77 68 69 63 68 20  number.** which 
0450: 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 6c 79 20  means that only 
0460: 64 61 74 65 73 20 62 65 74 77 65 65 6e 20 30 30  dates between 00
0470: 30 30 2d 30 31 2d 30 31 20 61 6e 64 20 39 39 39  00-01-01 and 999
0480: 39 2d 31 32 2d 33 31 20 63 61 6e 0a 2a 2a 20 62  9-12-31 can.** b
0490: 65 20 72 65 70 72 65 73 65 6e 74 65 64 2c 20 65  e represented, e
04a0: 76 65 6e 20 74 68 6f 75 67 68 20 6a 75 6c 69 61  ven though julia
04b0: 6e 20 64 61 79 20 6e 75 6d 62 65 72 73 20 61 6c  n day numbers al
04c0: 6c 6f 77 20 61 20 6d 75 63 68 20 77 69 64 65 72  low a much wider
04d0: 0a 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74  .** range of dat
04e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 47 72  es..**.** The Gr
04f0: 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
0500: 20 73 79 73 74 65 6d 20 69 73 20 75 73 65 64 20   system is used 
0510: 66 6f 72 20 61 6c 6c 20 64 61 74 65 73 20 61 6e  for all dates an
0520: 64 20 74 69 6d 65 73 2c 0a 2a 2a 20 65 76 65 6e  d times,.** even
0530: 20 74 68 6f 73 65 20 74 68 61 74 20 70 72 65 64   those that pred
0540: 61 74 65 20 74 68 65 20 47 72 65 67 6f 72 69 61  ate the Gregoria
0550: 6e 20 63 61 6c 65 6e 64 61 72 2e 20 20 48 69 73  n calendar.  His
0560: 74 6f 72 69 61 6e 73 20 75 73 75 61 6c 6c 79 0a  torians usually.
0570: 2a 2a 20 75 73 65 20 74 68 65 20 4a 75 6c 69 61  ** use the Julia
0580: 6e 20 63 61 6c 65 6e 64 61 72 20 66 6f 72 20 64  n calendar for d
0590: 61 74 65 73 20 70 72 69 6f 72 20 74 6f 20 31 35  ates prior to 15
05a0: 38 32 2d 31 30 2d 31 35 20 61 6e 64 20 66 6f 72  82-10-15 and for
05b0: 20 73 6f 6d 65 0a 2a 2a 20 64 61 74 65 73 20 61   some.** dates a
05c0: 66 74 65 72 77 61 72 64 73 2c 20 64 65 70 65 6e  fterwards, depen
05d0: 64 69 6e 67 20 6f 6e 20 6c 6f 63 61 6c 65 2e 20  ding on locale. 
05e0: 20 42 65 77 61 72 65 20 6f 66 20 74 68 69 73 20   Beware of this 
05f0: 64 69 66 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a  difference..**.*
0600: 2a 20 54 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  * The conversion
0610: 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20   algorithms are 
0620: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 61 73 65  implemented base
0630: 64 20 6f 6e 20 64 65 73 63 72 69 70 74 69 6f 6e  d on description
0640: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c  s.** in the foll
0650: 6f 77 69 6e 67 20 74 65 78 74 3a 0a 2a 2a 0a 2a  owing text:.**.*
0660: 2a 20 20 20 20 20 20 4a 65 61 6e 20 4d 65 65 75  *      Jean Meeu
0670: 73 0a 2a 2a 20 20 20 20 20 20 41 73 74 72 6f 6e  s.**      Astron
0680: 6f 6d 69 63 61 6c 20 41 6c 67 6f 72 69 74 68 6d  omical Algorithm
0690: 73 2c 20 32 6e 64 20 45 64 69 74 69 6f 6e 2c 20  s, 2nd Edition, 
06a0: 31 39 39 38 0a 2a 2a 20 20 20 20 20 20 49 53 42  1998.**      ISB
06b0: 4d 20 30 2d 39 34 33 33 39 36 2d 36 31 2d 31 0a  M 0-943396-61-1.
06c0: 2a 2a 20 20 20 20 20 20 57 69 6c 6c 6d 61 6e 6e  **      Willmann
06d0: 2d 42 65 6c 6c 2c 20 49 6e 63 0a 2a 2a 20 20 20  -Bell, Inc.**   
06e0: 20 20 20 52 69 63 68 6d 6f 6e 64 2c 20 56 69 72     Richmond, Vir
06f0: 67 69 6e 69 61 20 28 55 53 41 29 0a 2a 2f 0a 23  ginia (USA).*/.#
0700: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0710: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0720: 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  os.h".#include <
0730: 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  ctype.h>.#includ
0740: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0750: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
0760: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
0770: 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  h>..#ifndef SQLI
0780: 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45  TE_OMIT_DATETIME
0790: 5f 46 55 4e 43 53 0a 0a 2f 2a 0a 2a 2a 20 41 20  _FUNCS../*.** A 
07a0: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 68 6f  structure for ho
07b0: 6c 64 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 64  lding a single d
07c0: 61 74 65 20 61 6e 64 20 74 69 6d 65 2e 0a 2a 2f  ate and time..*/
07d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
07e0: 44 61 74 65 54 69 6d 65 20 44 61 74 65 54 69 6d  DateTime DateTim
07f0: 65 3b 0a 73 74 72 75 63 74 20 44 61 74 65 54 69  e;.struct DateTi
0800: 6d 65 20 7b 0a 20 20 64 6f 75 62 6c 65 20 72 4a  me {.  double rJ
0810: 44 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a  D;      /* The j
0820: 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72  ulian day number
0830: 20 2a 2f 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20   */.  int Y, M, 
0840: 44 3b 20 20 20 20 20 2f 2a 20 59 65 61 72 2c 20  D;     /* Year, 
0850: 6d 6f 6e 74 68 2c 20 61 6e 64 20 64 61 79 20 2a  month, and day *
0860: 2f 0a 20 20 69 6e 74 20 68 2c 20 6d 3b 20 20 20  /.  int h, m;   
0870: 20 20 20 20 20 2f 2a 20 48 6f 75 72 20 61 6e 64       /* Hour and
0880: 20 6d 69 6e 75 74 65 73 20 2a 2f 0a 20 20 69 6e   minutes */.  in
0890: 74 20 74 7a 3b 20 20 20 20 20 20 20 20 20 20 2f  t tz;          /
08a0: 2a 20 54 69 6d 65 7a 6f 6e 65 20 6f 66 66 73 65  * Timezone offse
08b0: 74 20 69 6e 20 6d 69 6e 75 74 65 73 20 2a 2f 0a  t in minutes */.
08c0: 20 20 64 6f 75 62 6c 65 20 73 3b 20 20 20 20 20    double s;     
08d0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 73 20 2a 2f     /* Seconds */
08e0: 0a 20 20 63 68 61 72 20 76 61 6c 69 64 59 4d 44  .  char validYMD
08f0: 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 59  ;   /* True if Y
0900: 2c 4d 2c 44 20 61 72 65 20 76 61 6c 69 64 20 2a  ,M,D are valid *
0910: 2f 0a 20 20 63 68 61 72 20 76 61 6c 69 64 48 4d  /.  char validHM
0920: 53 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  S;   /* True if 
0930: 68 2c 6d 2c 73 20 61 72 65 20 76 61 6c 69 64 20  h,m,s are valid 
0940: 2a 2f 0a 20 20 63 68 61 72 20 76 61 6c 69 64 4a  */.  char validJ
0950: 44 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  D;    /* True if
0960: 20 72 4a 44 20 69 73 20 76 61 6c 69 64 20 2a 2f   rJD is valid */
0970: 0a 20 20 63 68 61 72 20 76 61 6c 69 64 54 5a 3b  .  char validTZ;
0980: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
0990: 7a 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b  z is valid */.};
09a0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
09b0: 20 7a 44 61 74 65 20 69 6e 74 6f 20 6f 6e 65 20   zDate into one 
09c0: 6f 72 20 6d 6f 72 65 20 69 6e 74 65 67 65 72 73  or more integers
09d0: 2e 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 61 72  .  Additional ar
09e0: 67 75 6d 65 6e 74 73 0a 2a 2a 20 63 6f 6d 65 20  guments.** come 
09f0: 69 6e 20 67 72 6f 75 70 73 20 6f 66 20 35 20 61  in groups of 5 a
0a00: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
0a10: 20 20 20 20 20 20 20 4e 20 20 20 20 20 20 20 6e         N       n
0a20: 75 6d 62 65 72 20 6f 66 20 64 69 67 69 74 73 20  umber of digits 
0a30: 69 6e 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  in the integer.*
0a40: 2a 20 20 20 20 20 20 20 6d 69 6e 20 20 20 20 20  *       min     
0a50: 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  minimum allowed 
0a60: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
0a70: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 6d 61  eger.**       ma
0a80: 78 20 20 20 20 20 6d 61 78 69 6d 75 6d 20 61 6c  x     maximum al
0a90: 6c 6f 77 65 64 20 76 61 6c 75 65 20 6f 66 20 74  lowed value of t
0aa0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  he integer.**   
0ab0: 20 20 20 20 6e 65 78 74 43 20 20 20 66 69 72 73      nextC   firs
0ac0: 74 20 63 68 61 72 61 63 74 65 72 20 61 66 74 65  t character afte
0ad0: 72 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  r the integer.**
0ae0: 20 20 20 20 20 20 20 70 56 61 6c 20 20 20 20 77         pVal    w
0af0: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
0b00: 65 20 69 6e 74 65 67 65 72 73 20 76 61 6c 75 65  e integers value
0b10: 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 73 69  ..**.** Conversi
0b20: 6f 6e 73 20 63 6f 6e 74 69 6e 75 65 20 75 6e 74  ons continue unt
0b30: 69 6c 20 6f 6e 65 20 77 69 74 68 20 6e 65 78 74  il one with next
0b40: 43 3d 3d 30 20 69 73 20 65 6e 63 6f 75 6e 74 65  C==0 is encounte
0b50: 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 75 6e 63  red..** The func
0b60: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
0b70: 20 6e 75 6d 62 65 72 20 6f 66 20 73 75 63 63 65   number of succe
0b80: 73 73 66 75 6c 20 63 6f 6e 76 65 72 73 69 6f 6e  ssful conversion
0b90: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
0ba0: 20 67 65 74 44 69 67 69 74 73 28 63 6f 6e 73 74   getDigits(const
0bb0: 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 2e 2e   char *zDate, ..
0bc0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
0bd0: 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 69  ;.  int val;.  i
0be0: 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 6d 69 6e 3b  nt N;.  int min;
0bf0: 0a 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20 69 6e  .  int max;.  in
0c00: 74 20 6e 65 78 74 43 3b 0a 20 20 69 6e 74 20 2a  t nextC;.  int *
0c10: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 63 6e 74 20  pVal;.  int cnt 
0c20: 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  = 0;.  va_start(
0c30: 61 70 2c 20 7a 44 61 74 65 29 3b 0a 20 20 64 6f  ap, zDate);.  do
0c40: 7b 0a 20 20 20 20 4e 20 3d 20 76 61 5f 61 72 67  {.    N = va_arg
0c50: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 6d  (ap, int);.    m
0c60: 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  in = va_arg(ap, 
0c70: 69 6e 74 29 3b 0a 20 20 20 20 6d 61 78 20 3d 20  int);.    max = 
0c80: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
0c90: 0a 20 20 20 20 6e 65 78 74 43 20 3d 20 76 61 5f  .    nextC = va_
0ca0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
0cb0: 20 20 70 56 61 6c 20 3d 20 76 61 5f 61 72 67 28    pVal = va_arg(
0cc0: 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 76  ap, int*);.    v
0cd0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  al = 0;.    whil
0ce0: 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20  e( N-- ){.      
0cf0: 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 28 75  if( !isdigit(*(u
0d00: 38 2a 29 7a 44 61 74 65 29 20 29 7b 0a 20 20 20  8*)zDate) ){.   
0d10: 20 20 20 20 20 72 65 74 75 72 6e 20 63 6e 74 3b       return cnt;
0d20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76  .      }.      v
0d30: 61 6c 20 3d 20 76 61 6c 2a 31 30 20 2b 20 2a 7a  al = val*10 + *z
0d40: 44 61 74 65 20 2d 20 27 30 27 3b 0a 20 20 20 20  Date - '0';.    
0d50: 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 7d    zDate++;.    }
0d60: 0a 20 20 20 20 69 66 28 20 76 61 6c 3c 6d 69 6e  .    if( val<min
0d70: 20 7c 7c 20 76 61 6c 3e 6d 61 78 20 7c 7c 20 28   || val>max || (
0d80: 6e 65 78 74 43 21 3d 30 20 26 26 20 6e 65 78 74  nextC!=0 && next
0d90: 43 21 3d 2a 7a 44 61 74 65 29 20 29 7b 0a 20 20  C!=*zDate) ){.  
0da0: 20 20 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a      return cnt;.
0db0: 20 20 20 20 7d 0a 20 20 20 20 2a 70 56 61 6c 20      }.    *pVal 
0dc0: 3d 20 76 61 6c 3b 0a 20 20 20 20 7a 44 61 74 65  = val;.    zDate
0dd0: 2b 2b 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  ++;.    cnt++;. 
0de0: 20 7d 77 68 69 6c 65 28 20 6e 65 78 74 43 20 29   }while( nextC )
0df0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a  ;.  return cnt;.
0e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 65  }../*.** Read te
0e10: 78 74 20 66 72 6f 6d 20 7a 5b 5d 20 61 6e 64 20  xt from z[] and 
0e20: 63 6f 6e 76 65 72 74 20 69 6e 74 6f 20 61 20 66  convert into a f
0e30: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75  loating point nu
0e40: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
0e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64   the number of d
0e60: 69 67 69 74 73 20 63 6f 6e 76 65 72 74 65 64 2e  igits converted.
0e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0e80: 65 74 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68  etValue(const ch
0e90: 61 72 20 2a 7a 2c 20 64 6f 75 62 6c 65 20 2a 70  ar *z, double *p
0ea0: 52 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  R){.  const char
0eb0: 20 2a 7a 45 6e 64 3b 0a 20 20 2a 70 52 20 3d 20   *zEnd;.  *pR = 
0ec0: 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26  sqlite3AtoF(z, &
0ed0: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
0ee0: 7a 45 6e 64 20 2d 20 7a 3b 0a 7d 0a 0a 2f 2a 0a  zEnd - z;.}../*.
0ef0: 2a 2a 20 50 61 72 73 65 20 61 20 74 69 6d 65 7a  ** Parse a timez
0f00: 6f 6e 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e  one extension on
0f10: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 64 61   the end of a da
0f20: 74 65 2d 74 69 6d 65 2e 0a 2a 2a 20 54 68 65 20  te-time..** The 
0f30: 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6f 66 20  extension is of 
0f40: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
0f50: 20 20 20 20 20 20 20 28 2b 2f 2d 29 48 48 3a 4d         (+/-)HH:M
0f60: 4d 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  M.**.** If the p
0f70: 61 72 73 65 20 69 73 20 73 75 63 63 65 73 73 66  arse is successf
0f80: 75 6c 2c 20 77 72 69 74 65 20 74 68 65 20 6e 75  ul, write the nu
0f90: 6d 62 65 72 20 6f 66 20 6d 69 6e 75 74 65 73 0a  mber of minutes.
0fa0: 2a 2a 20 6f 66 20 63 68 61 6e 67 65 20 69 6e 20  ** of change in 
0fb0: 2a 70 6e 4d 69 6e 20 61 6e 64 20 72 65 74 75 72  *pnMin and retur
0fc0: 6e 20 30 2e 20 20 49 66 20 61 20 70 61 72 73 65  n 0.  If a parse
0fd0: 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  r error occurs,.
0fe0: 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ** return 0..**.
0ff0: 2a 2a 20 41 20 6d 69 73 73 69 6e 67 20 73 70 65  ** A missing spe
1000: 63 69 66 69 65 72 20 69 73 20 6e 6f 74 20 63 6f  cifier is not co
1010: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
1020: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1030: 20 70 61 72 73 65 54 69 6d 65 7a 6f 6e 65 28 63   parseTimezone(c
1040: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
1050: 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a  , DateTime *p){.
1060: 20 20 69 6e 74 20 73 67 6e 20 3d 20 30 3b 0a 20    int sgn = 0;. 
1070: 20 69 6e 74 20 6e 48 72 2c 20 6e 4d 6e 3b 0a 20   int nHr, nMn;. 
1080: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
1090: 2a 28 75 38 2a 29 7a 44 61 74 65 29 20 29 7b 20  *(u8*)zDate) ){ 
10a0: 7a 44 61 74 65 2b 2b 3b 20 7d 0a 20 20 70 2d 3e  zDate++; }.  p->
10b0: 74 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 7a  tz = 0;.  if( *z
10c0: 44 61 74 65 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  Date=='-' ){.   
10d0: 20 73 67 6e 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c   sgn = -1;.  }el
10e0: 73 65 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d 27  se if( *zDate=='
10f0: 2b 27 20 29 7b 0a 20 20 20 20 73 67 6e 20 3d 20  +' ){.    sgn = 
1100: 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  +1;.  }else{.   
1110: 20 72 65 74 75 72 6e 20 2a 7a 44 61 74 65 21 3d   return *zDate!=
1120: 30 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65 2b 2b  0;.  }.  zDate++
1130: 3b 0a 20 20 69 66 28 20 67 65 74 44 69 67 69 74  ;.  if( getDigit
1140: 73 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 31  s(zDate, 2, 0, 1
1150: 34 2c 20 27 3a 27 2c 20 26 6e 48 72 2c 20 32 2c  4, ':', &nHr, 2,
1160: 20 30 2c 20 35 39 2c 20 30 2c 20 26 6e 4d 6e 29   0, 59, 0, &nMn)
1170: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
1180: 6e 20 31 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65  n 1;.  }.  zDate
1190: 20 2b 3d 20 35 3b 0a 20 20 70 2d 3e 74 7a 20 3d   += 5;.  p->tz =
11a0: 20 73 67 6e 2a 28 6e 4d 6e 20 2b 20 6e 48 72 2a   sgn*(nMn + nHr*
11b0: 36 30 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  60);.  while( is
11c0: 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 44 61 74  space(*(u8*)zDat
11d0: 65 29 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d  e) ){ zDate++; }
11e0: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 44 61 74 65  .  return *zDate
11f0: 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  !=0;.}../*.** Pa
1200: 72 73 65 20 74 69 6d 65 73 20 6f 66 20 74 68 65  rse times of the
1210: 20 66 6f 72 6d 20 48 48 3a 4d 4d 20 6f 72 20 48   form HH:MM or H
1220: 48 3a 4d 4d 3a 53 53 20 6f 72 20 48 48 3a 4d 4d  H:MM:SS or HH:MM
1230: 3a 53 53 2e 46 46 46 46 2e 0a 2a 2a 20 54 68 65  :SS.FFFF..** The
1240: 20 48 48 2c 20 4d 4d 2c 20 61 6e 64 20 53 53 20   HH, MM, and SS 
1250: 6d 75 73 74 20 65 61 63 68 20 62 65 20 65 78 61  must each be exa
1260: 63 74 6c 79 20 32 20 64 69 67 69 74 73 2e 20 20  ctly 2 digits.  
1270: 54 68 65 0a 2a 2a 20 66 72 61 63 74 69 6f 6e 61  The.** fractiona
1280: 6c 20 73 65 63 6f 6e 64 73 20 46 46 46 46 20 63  l seconds FFFF c
1290: 61 6e 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  an be one or mor
12a0: 65 20 64 69 67 69 74 73 2e 0a 2a 2a 0a 2a 2a 20  e digits..**.** 
12b0: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72  Return 1 if ther
12c0: 65 20 69 73 20 61 20 70 61 72 73 69 6e 67 20 65  e is a parsing e
12d0: 72 72 6f 72 20 61 6e 64 20 30 20 6f 6e 20 73 75  rror and 0 on su
12e0: 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccess..*/.static
12f0: 20 69 6e 74 20 70 61 72 73 65 48 68 4d 6d 53 73   int parseHhMmSs
1300: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61  (const char *zDa
1310: 74 65 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29  te, DateTime *p)
1320: 7b 0a 20 20 69 6e 74 20 68 2c 20 6d 2c 20 73 3b  {.  int h, m, s;
1330: 0a 20 20 64 6f 75 62 6c 65 20 6d 73 20 3d 20 30  .  double ms = 0
1340: 2e 30 3b 0a 20 20 69 66 28 20 67 65 74 44 69 67  .0;.  if( getDig
1350: 69 74 73 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c  its(zDate, 2, 0,
1360: 20 32 34 2c 20 27 3a 27 2c 20 26 68 2c 20 32 2c   24, ':', &h, 2,
1370: 20 30 2c 20 35 39 2c 20 30 2c 20 26 6d 29 21 3d   0, 59, 0, &m)!=
1380: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
1390: 31 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b  1;.  }.  zDate +
13a0: 3d 20 35 3b 0a 20 20 69 66 28 20 2a 7a 44 61 74  = 5;.  if( *zDat
13b0: 65 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 44  e==':' ){.    zD
13c0: 61 74 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 67  ate++;.    if( g
13d0: 65 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c 20  etDigits(zDate, 
13e0: 32 2c 20 30 2c 20 35 39 2c 20 30 2c 20 26 73 29  2, 0, 59, 0, &s)
13f0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
1400: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1410: 20 7a 44 61 74 65 20 2b 3d 20 32 3b 0a 20 20 20   zDate += 2;.   
1420: 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d 27 2e 27   if( *zDate=='.'
1430: 20 26 26 20 69 73 64 69 67 69 74 28 28 75 38 29   && isdigit((u8)
1440: 7a 44 61 74 65 5b 31 5d 29 20 29 7b 0a 20 20 20  zDate[1]) ){.   
1450: 20 20 20 64 6f 75 62 6c 65 20 72 53 63 61 6c 65     double rScale
1460: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 7a 44   = 1.0;.      zD
1470: 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  ate++;.      whi
1480: 6c 65 28 20 69 73 64 69 67 69 74 28 2a 28 75 38  le( isdigit(*(u8
1490: 2a 29 7a 44 61 74 65 29 20 29 7b 0a 20 20 20 20  *)zDate) ){.    
14a0: 20 20 20 20 6d 73 20 3d 20 6d 73 2a 31 30 2e 30      ms = ms*10.0
14b0: 20 2b 20 2a 7a 44 61 74 65 20 2d 20 27 30 27 3b   + *zDate - '0';
14c0: 0a 20 20 20 20 20 20 20 20 72 53 63 61 6c 65 20  .        rScale 
14d0: 2a 3d 20 31 30 2e 30 3b 0a 20 20 20 20 20 20 20  *= 10.0;.       
14e0: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20   zDate++;.      
14f0: 7d 0a 20 20 20 20 20 20 6d 73 20 2f 3d 20 72 53  }.      ms /= rS
1500: 63 61 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  cale;.    }.  }e
1510: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 30 3b 0a  lse{.    s = 0;.
1520: 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44    }.  p->validJD
1530: 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64   = 0;.  p->valid
1540: 48 4d 53 20 3d 20 31 3b 0a 20 20 70 2d 3e 68 20  HMS = 1;.  p->h 
1550: 3d 20 68 3b 0a 20 20 70 2d 3e 6d 20 3d 20 6d 3b  = h;.  p->m = m;
1560: 0a 20 20 70 2d 3e 73 20 3d 20 73 20 2b 20 6d 73  .  p->s = s + ms
1570: 3b 0a 20 20 69 66 28 20 70 61 72 73 65 54 69 6d  ;.  if( parseTim
1580: 65 7a 6f 6e 65 28 7a 44 61 74 65 2c 20 70 29 20  ezone(zDate, p) 
1590: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 2d  ) return 1;.  p-
15a0: 3e 76 61 6c 69 64 54 5a 20 3d 20 70 2d 3e 74 7a  >validTZ = p->tz
15b0: 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  !=0;.  return 0;
15c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
15d0: 74 20 66 72 6f 6d 20 59 59 59 59 2d 4d 4d 2d 44  t from YYYY-MM-D
15e0: 44 20 48 48 3a 4d 4d 3a 53 53 20 74 6f 20 6a 75  D HH:MM:SS to ju
15f0: 6c 69 61 6e 20 64 61 79 2e 20 20 57 65 20 61 6c  lian day.  We al
1600: 77 61 79 73 20 61 73 73 75 6d 65 0a 2a 2a 20 74  ways assume.** t
1610: 68 61 74 20 74 68 65 20 59 59 59 59 2d 4d 4d 2d  hat the YYYY-MM-
1620: 44 44 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20  DD is according 
1630: 74 6f 20 74 68 65 20 47 72 65 67 6f 72 69 61 6e  to the Gregorian
1640: 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
1650: 20 52 65 66 65 72 65 6e 63 65 3a 20 20 4d 65 65   Reference:  Mee
1660: 75 73 20 70 61 67 65 20 36 31 0a 2a 2f 0a 73 74  us page 61.*/.st
1670: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
1680: 65 4a 44 28 44 61 74 65 54 69 6d 65 20 2a 70 29  eJD(DateTime *p)
1690: 7b 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c  {.  int Y, M, D,
16a0: 20 41 2c 20 42 2c 20 58 31 2c 20 58 32 3b 0a 0a   A, B, X1, X2;..
16b0: 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 4a 44    if( p->validJD
16c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
16d0: 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 29 7b 0a   p->validYMD ){.
16e0: 20 20 20 20 59 20 3d 20 70 2d 3e 59 3b 0a 20 20      Y = p->Y;.  
16f0: 20 20 4d 20 3d 20 70 2d 3e 4d 3b 0a 20 20 20 20    M = p->M;.    
1700: 44 20 3d 20 70 2d 3e 44 3b 0a 20 20 7d 65 6c 73  D = p->D;.  }els
1710: 65 7b 0a 20 20 20 20 59 20 3d 20 32 30 30 30 3b  e{.    Y = 2000;
1720: 20 20 2f 2a 20 49 66 20 6e 6f 20 59 4d 44 20 73    /* If no YMD s
1730: 70 65 63 69 66 69 65 64 2c 20 61 73 73 75 6d 65  pecified, assume
1740: 20 32 30 30 30 2d 4a 61 6e 2d 30 31 20 2a 2f 0a   2000-Jan-01 */.
1750: 20 20 20 20 4d 20 3d 20 31 3b 0a 20 20 20 20 44      M = 1;.    D
1760: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
1770: 4d 3c 3d 32 20 29 7b 0a 20 20 20 20 59 2d 2d 3b  M<=2 ){.    Y--;
1780: 0a 20 20 20 20 4d 20 2b 3d 20 31 32 3b 0a 20 20  .    M += 12;.  
1790: 7d 0a 20 20 41 20 3d 20 59 2f 31 30 30 3b 0a 20  }.  A = Y/100;. 
17a0: 20 42 20 3d 20 32 20 2d 20 41 20 2b 20 28 41 2f   B = 2 - A + (A/
17b0: 34 29 3b 0a 20 20 58 31 20 3d 20 33 36 35 2e 32  4);.  X1 = 365.2
17c0: 35 2a 28 59 2b 34 37 31 36 29 3b 0a 20 20 58 32  5*(Y+4716);.  X2
17d0: 20 3d 20 33 30 2e 36 30 30 31 2a 28 4d 2b 31 29   = 30.6001*(M+1)
17e0: 3b 0a 20 20 70 2d 3e 72 4a 44 20 3d 20 58 31 20  ;.  p->rJD = X1 
17f0: 2b 20 58 32 20 2b 20 44 20 2b 20 42 20 2d 20 31  + X2 + D + B - 1
1800: 35 32 34 2e 35 3b 0a 20 20 70 2d 3e 76 61 6c 69  524.5;.  p->vali
1810: 64 4a 44 20 3d 20 31 3b 0a 20 20 70 2d 3e 76 61  dJD = 1;.  p->va
1820: 6c 69 64 59 4d 44 20 3d 20 30 3b 0a 20 20 69 66  lidYMD = 0;.  if
1830: 28 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 29 7b  ( p->validHMS ){
1840: 0a 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 28  .    p->rJD += (
1850: 70 2d 3e 68 2a 33 36 30 30 2e 30 20 2b 20 70 2d  p->h*3600.0 + p-
1860: 3e 6d 2a 36 30 2e 30 20 2b 20 70 2d 3e 73 29 2f  >m*60.0 + p->s)/
1870: 38 36 34 30 30 2e 30 3b 0a 20 20 20 20 69 66 28  86400.0;.    if(
1880: 20 70 2d 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20   p->validTZ ){. 
1890: 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 70       p->rJD += p
18a0: 2d 3e 74 7a 2a 36 30 2f 38 36 34 30 30 2e 30 3b  ->tz*60/86400.0;
18b0: 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 48  .      p->validH
18c0: 4d 53 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  MS = 0;.      p-
18d0: 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20  >validTZ = 0;.  
18e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
18f0: 20 50 61 72 73 65 20 64 61 74 65 73 20 6f 66 20   Parse dates of 
1900: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
1910: 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48     YYYY-MM-DD HH
1920: 3a 4d 4d 3a 53 53 2e 46 46 46 0a 2a 2a 20 20 20  :MM:SS.FFF.**   
1930: 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a    YYYY-MM-DD HH:
1940: 4d 4d 3a 53 53 0a 2a 2a 20 20 20 20 20 59 59 59  MM:SS.**     YYY
1950: 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 0a 2a 2a  Y-MM-DD HH:MM.**
1960: 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 0a       YYYY-MM-DD.
1970: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
1980: 72 65 73 75 6c 74 20 69 6e 74 6f 20 74 68 65 20  result into the 
1990: 44 61 74 65 54 69 6d 65 20 73 74 72 75 63 74 75  DateTime structu
19a0: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 30 0a  re and return 0.
19b0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
19c0: 64 20 31 20 69 66 20 74 68 65 20 69 6e 70 75 74  d 1 if the input
19d0: 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 61   string is not a
19e0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
19f0: 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  date..*/.static 
1a00: 69 6e 74 20 70 61 72 73 65 59 79 79 79 4d 6d 44  int parseYyyyMmD
1a10: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  d(const char *zD
1a20: 61 74 65 2c 20 44 61 74 65 54 69 6d 65 20 2a 70  ate, DateTime *p
1a30: 29 7b 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44  ){.  int Y, M, D
1a40: 2c 20 6e 65 67 3b 0a 0a 20 20 69 66 28 20 7a 44  , neg;..  if( zD
1a50: 61 74 65 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ate[0]=='-' ){. 
1a60: 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20     zDate++;.    
1a70: 6e 65 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  neg = 1;.  }else
1a80: 7b 0a 20 20 20 20 6e 65 67 20 3d 20 30 3b 0a 20  {.    neg = 0;. 
1a90: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 69 67 69   }.  if( getDigi
1aa0: 74 73 28 7a 44 61 74 65 2c 34 2c 30 2c 39 39 39  ts(zDate,4,0,999
1ab0: 39 2c 27 2d 27 2c 26 59 2c 32 2c 31 2c 31 32 2c  9,'-',&Y,2,1,12,
1ac0: 27 2d 27 2c 26 4d 2c 32 2c 31 2c 33 31 2c 30 2c  '-',&M,2,1,31,0,
1ad0: 26 44 29 21 3d 33 20 29 7b 0a 20 20 20 20 72 65  &D)!=3 ){.    re
1ae0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 7a 44  turn 1;.  }.  zD
1af0: 61 74 65 20 2b 3d 20 31 30 3b 0a 20 20 77 68 69  ate += 10;.  whi
1b00: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
1b10: 2a 29 7a 44 61 74 65 29 20 29 7b 20 7a 44 61 74  *)zDate) ){ zDat
1b20: 65 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 70 61 72  e++; }.  if( par
1b30: 73 65 48 68 4d 6d 53 73 28 7a 44 61 74 65 2c 20  seHhMmSs(zDate, 
1b40: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  p)==0 ){.    /* 
1b50: 57 65 20 67 6f 74 20 74 68 65 20 74 69 6d 65 20  We got the time 
1b60: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  */.  }else if( *
1b70: 7a 44 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zDate==0 ){.    
1b80: 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 30 3b  p->validHMS = 0;
1b90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1ba0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 2d  turn 1;.  }.  p-
1bb0: 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20  >validJD = 0;.  
1bc0: 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d 20 31 3b  p->validYMD = 1;
1bd0: 0a 20 20 70 2d 3e 59 20 3d 20 6e 65 67 20 3f 20  .  p->Y = neg ? 
1be0: 2d 59 20 3a 20 59 3b 0a 20 20 70 2d 3e 4d 20 3d  -Y : Y;.  p->M =
1bf0: 20 4d 3b 0a 20 20 70 2d 3e 44 20 3d 20 44 3b 0a   M;.  p->D = D;.
1c00: 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 54 5a    if( p->validTZ
1c10: 20 29 7b 0a 20 20 20 20 63 6f 6d 70 75 74 65 4a   ){.    computeJ
1c20: 44 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  D(p);.  }.  retu
1c30: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
1c40: 74 74 65 6d 70 74 20 74 6f 20 70 61 72 73 65 20  ttempt to parse 
1c50: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
1c60: 20 69 6e 74 6f 20 61 20 4a 75 6c 69 61 6e 20 44   into a Julian D
1c70: 61 79 20 4e 75 6d 62 65 72 2e 20 20 52 65 74 75  ay Number.  Retu
1c80: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
1c90: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
1ca0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1cb0: 61 72 65 20 61 63 63 65 70 74 61 62 6c 65 20 66  are acceptable f
1cc0: 6f 72 6d 73 20 66 6f 72 20 74 68 65 20 69 6e 70  orms for the inp
1cd0: 75 74 20 73 74 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a  ut string:.**.**
1ce0: 20 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44        YYYY-MM-DD
1cf0: 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 20 20 2b   HH:MM:SS.FFF  +
1d00: 2f 2d 48 48 3a 4d 4d 0a 2a 2a 20 20 20 20 20 20  /-HH:MM.**      
1d10: 44 44 44 44 2e 44 44 20 0a 2a 2a 20 20 20 20 20  DDDD.DD .**     
1d20: 20 6e 6f 77 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68   now.**.** In th
1d30: 65 20 66 69 72 73 74 20 66 6f 72 6d 2c 20 74 68  e first form, th
1d40: 65 20 2b 2f 2d 48 48 3a 4d 4d 20 69 73 20 61 6c  e +/-HH:MM is al
1d50: 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  ways optional.  
1d60: 54 68 65 20 66 72 61 63 74 69 6f 6e 61 6c 0a 2a  The fractional.*
1d70: 2a 20 73 65 63 6f 6e 64 73 20 65 78 74 65 6e 73  * seconds extens
1d80: 69 6f 6e 20 28 74 68 65 20 22 2e 46 46 46 22 29  ion (the ".FFF")
1d90: 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 54   is optional.  T
1da0: 68 65 20 73 65 63 6f 6e 64 73 20 70 6f 72 74 69  he seconds porti
1db0: 6f 6e 0a 2a 2a 20 28 22 3a 53 53 2e 46 46 46 22  on.** (":SS.FFF"
1dc0: 29 20 69 73 20 6f 70 74 69 6f 6e 2e 20 20 54 68  ) is option.  Th
1dd0: 65 20 79 65 61 72 20 61 6e 64 20 64 61 74 65 20  e year and date 
1de0: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61  can be omitted a
1df0: 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 74 68 65  s long.** as the
1e00: 72 65 20 69 73 20 61 20 74 69 6d 65 20 73 74 72  re is a time str
1e10: 69 6e 67 2e 20 20 54 68 65 20 74 69 6d 65 20 73  ing.  The time s
1e20: 74 72 69 6e 67 20 63 61 6e 20 62 65 20 6f 6d 69  tring can be omi
1e30: 74 74 65 64 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20  tted as long.** 
1e40: 61 73 20 74 68 65 72 65 20 69 73 20 61 20 79 65  as there is a ye
1e50: 61 72 20 61 6e 64 20 64 61 74 65 2e 0a 2a 2f 0a  ar and date..*/.
1e60: 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 73 65  static int parse
1e70: 44 61 74 65 4f 72 54 69 6d 65 28 63 6f 6e 73 74  DateOrTime(const
1e80: 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 44 61   char *zDate, Da
1e90: 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 6d 65  teTime *p){.  me
1ea0: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
1eb0: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 61  f(*p));.  if( pa
1ec0: 72 73 65 59 79 79 79 4d 6d 44 64 28 7a 44 61 74  rseYyyyMmDd(zDat
1ed0: 65 2c 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  e,p)==0 ){.    r
1ee0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1ef0: 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73   if( parseHhMmSs
1f00: 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30 20 29 7b  (zDate, p)==0 ){
1f10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1f20: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
1f30: 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 65 2c  e3StrICmp(zDate,
1f40: 22 6e 6f 77 22 29 3d 3d 30 29 7b 0a 20 20 20 20  "now")==0){.    
1f50: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 69 66  double r;.    if
1f60: 28 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  ( sqlite3OsCurre
1f70: 6e 74 54 69 6d 65 28 26 72 29 3d 3d 30 20 29 7b  ntTime(&r)==0 ){
1f80: 0a 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 3d 20  .      p->rJD = 
1f90: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69  r;.      p->vali
1fa0: 64 4a 44 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  dJD = 1;.      r
1fb0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1fc0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1fd0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1fe0: 49 73 4e 75 6d 62 65 72 28 7a 44 61 74 65 2c 20  IsNumber(zDate, 
1ff0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 20  0, SQLITE_UTF8) 
2000: 29 7b 0a 20 20 20 20 70 2d 3e 72 4a 44 20 3d 20  ){.    p->rJD = 
2010: 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 44 61 74  sqlite3AtoF(zDat
2020: 65 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 76 61  e, 0);.    p->va
2030: 6c 69 64 4a 44 20 3d 20 31 3b 0a 20 20 20 20 72  lidJD = 1;.    r
2040: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
2050: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
2060: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 59 65  * Compute the Ye
2070: 61 72 2c 20 4d 6f 6e 74 68 2c 20 61 6e 64 20 44  ar, Month, and D
2080: 61 79 20 66 72 6f 6d 20 74 68 65 20 6a 75 6c 69  ay from the juli
2090: 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 2e 0a 2a  an day number..*
20a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
20b0: 6d 70 75 74 65 59 4d 44 28 44 61 74 65 54 69 6d  mputeYMD(DateTim
20c0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 5a 2c 20  e *p){.  int Z, 
20d0: 41 2c 20 42 2c 20 43 2c 20 44 2c 20 45 2c 20 58  A, B, C, D, E, X
20e0: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69  1;.  if( p->vali
20f0: 64 59 4d 44 20 29 20 72 65 74 75 72 6e 3b 0a 20  dYMD ) return;. 
2100: 20 69 66 28 20 21 70 2d 3e 76 61 6c 69 64 4a 44   if( !p->validJD
2110: 20 29 7b 0a 20 20 20 20 70 2d 3e 59 20 3d 20 32   ){.    p->Y = 2
2120: 30 30 30 3b 0a 20 20 20 20 70 2d 3e 4d 20 3d 20  000;.    p->M = 
2130: 31 3b 0a 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b  1;.    p->D = 1;
2140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 5a 20  .  }else{.    Z 
2150: 3d 20 70 2d 3e 72 4a 44 20 2b 20 30 2e 35 3b 0a  = p->rJD + 0.5;.
2160: 20 20 20 20 41 20 3d 20 28 5a 20 2d 20 31 38 36      A = (Z - 186
2170: 37 32 31 36 2e 32 35 29 2f 33 36 35 32 34 2e 32  7216.25)/36524.2
2180: 35 3b 0a 20 20 20 20 41 20 3d 20 5a 20 2b 20 31  5;.    A = Z + 1
2190: 20 2b 20 41 20 2d 20 28 41 2f 34 29 3b 0a 20 20   + A - (A/4);.  
21a0: 20 20 42 20 3d 20 41 20 2b 20 31 35 32 34 3b 0a    B = A + 1524;.
21b0: 20 20 20 20 43 20 3d 20 28 42 20 2d 20 31 32 32      C = (B - 122
21c0: 2e 31 29 2f 33 36 35 2e 32 35 3b 0a 20 20 20 20  .1)/365.25;.    
21d0: 44 20 3d 20 33 36 35 2e 32 35 2a 43 3b 0a 20 20  D = 365.25*C;.  
21e0: 20 20 45 20 3d 20 28 42 2d 44 29 2f 33 30 2e 36    E = (B-D)/30.6
21f0: 30 30 31 3b 0a 20 20 20 20 58 31 20 3d 20 33 30  001;.    X1 = 30
2200: 2e 36 30 30 31 2a 45 3b 0a 20 20 20 20 70 2d 3e  .6001*E;.    p->
2210: 44 20 3d 20 42 20 2d 20 44 20 2d 20 58 31 3b 0a  D = B - D - X1;.
2220: 20 20 20 20 70 2d 3e 4d 20 3d 20 45 3c 31 34 20      p->M = E<14 
2230: 3f 20 45 2d 31 20 3a 20 45 2d 31 33 3b 0a 20 20  ? E-1 : E-13;.  
2240: 20 20 70 2d 3e 59 20 3d 20 70 2d 3e 4d 3e 32 20    p->Y = p->M>2 
2250: 3f 20 43 20 2d 20 34 37 31 36 20 3a 20 43 20 2d  ? C - 4716 : C -
2260: 20 34 37 31 35 3b 0a 20 20 7d 0a 20 20 70 2d 3e   4715;.  }.  p->
2270: 76 61 6c 69 64 59 4d 44 20 3d 20 31 3b 0a 7d 0a  validYMD = 1;.}.
2280: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
2290: 68 65 20 48 6f 75 72 2c 20 4d 69 6e 75 74 65 2c  he Hour, Minute,
22a0: 20 61 6e 64 20 53 65 63 6f 6e 64 73 20 66 72 6f   and Seconds fro
22b0: 6d 20 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79  m the julian day
22c0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
22d0: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 48  ic void computeH
22e0: 4d 53 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b  MS(DateTime *p){
22f0: 0a 20 20 69 6e 74 20 5a 2c 20 73 3b 0a 20 20 69  .  int Z, s;.  i
2300: 66 28 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 29  f( p->validHMS )
2310: 20 72 65 74 75 72 6e 3b 0a 20 20 5a 20 3d 20 70   return;.  Z = p
2320: 2d 3e 72 4a 44 20 2b 20 30 2e 35 3b 0a 20 20 73  ->rJD + 0.5;.  s
2330: 20 3d 20 28 70 2d 3e 72 4a 44 20 2b 20 30 2e 35   = (p->rJD + 0.5
2340: 20 2d 20 5a 29 2a 38 36 34 30 30 30 30 30 2e 30   - Z)*86400000.0
2350: 20 2b 20 30 2e 35 3b 0a 20 20 70 2d 3e 73 20 3d   + 0.5;.  p->s =
2360: 20 30 2e 30 30 31 2a 73 3b 0a 20 20 73 20 3d 20   0.001*s;.  s = 
2370: 70 2d 3e 73 3b 0a 20 20 70 2d 3e 73 20 2d 3d 20  p->s;.  p->s -= 
2380: 73 3b 0a 20 20 70 2d 3e 68 20 3d 20 73 2f 33 36  s;.  p->h = s/36
2390: 30 30 3b 0a 20 20 73 20 2d 3d 20 70 2d 3e 68 2a  00;.  s -= p->h*
23a0: 33 36 30 30 3b 0a 20 20 70 2d 3e 6d 20 3d 20 73  3600;.  p->m = s
23b0: 2f 36 30 3b 0a 20 20 70 2d 3e 73 20 2b 3d 20 73  /60;.  p->s += s
23c0: 20 2d 20 70 2d 3e 6d 2a 36 30 3b 0a 20 20 70 2d   - p->m*60;.  p-
23d0: 3e 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 7d  >validHMS = 1;.}
23e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
23f0: 62 6f 74 68 20 59 4d 44 20 61 6e 64 20 48 4d 53  both YMD and HMS
2400: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2410: 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 44  computeYMD_HMS(D
2420: 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 63  ateTime *p){.  c
2430: 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a 20 20  omputeYMD(p);.  
2440: 63 6f 6d 70 75 74 65 48 4d 53 28 70 29 3b 0a 7d  computeHMS(p);.}
2450: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
2460: 65 20 59 4d 44 20 61 6e 64 20 48 4d 53 20 61 6e  e YMD and HMS an
2470: 64 20 74 68 65 20 54 5a 0a 2a 2f 0a 73 74 61 74  d the TZ.*/.stat
2480: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 59 4d 44  ic void clearYMD
2490: 5f 48 4d 53 5f 54 5a 28 44 61 74 65 54 69 6d 65  _HMS_TZ(DateTime
24a0: 20 2a 70 29 7b 0a 20 20 70 2d 3e 76 61 6c 69 64   *p){.  p->valid
24b0: 59 4d 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61  YMD = 0;.  p->va
24c0: 6c 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20 70 2d  lidHMS = 0;.  p-
24d0: 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 7d 0a  >validTZ = 0;.}.
24e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
24f0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 28 69  he difference (i
2500: 6e 20 64 61 79 73 29 20 62 65 74 77 65 65 6e 20  n days) between 
2510: 6c 6f 63 61 6c 74 69 6d 65 20 61 6e 64 20 55 54  localtime and UT
2520: 43 20 28 61 2e 6b 2e 61 2e 20 47 4d 54 29 0a 2a  C (a.k.a. GMT).*
2530: 2a 20 66 6f 72 20 74 68 65 20 74 69 6d 65 20 76  * for the time v
2540: 61 6c 75 65 20 70 20 77 68 65 72 65 20 70 20 69  alue p where p i
2550: 73 20 69 6e 20 55 54 43 2e 0a 2a 2f 0a 73 74 61  s in UTC..*/.sta
2560: 74 69 63 20 64 6f 75 62 6c 65 20 6c 6f 63 61 6c  tic double local
2570: 74 69 6d 65 4f 66 66 73 65 74 28 44 61 74 65 54  timeOffset(DateT
2580: 69 6d 65 20 2a 70 29 7b 0a 20 20 44 61 74 65 54  ime *p){.  DateT
2590: 69 6d 65 20 78 2c 20 79 3b 0a 20 20 74 69 6d 65  ime x, y;.  time
25a0: 5f 74 20 74 3b 0a 20 20 73 74 72 75 63 74 20 74  _t t;.  struct t
25b0: 6d 20 2a 70 54 6d 3b 0a 20 20 78 20 3d 20 2a 70  m *pTm;.  x = *p
25c0: 3b 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48  ;.  computeYMD_H
25d0: 4d 53 28 26 78 29 3b 0a 20 20 69 66 28 20 78 2e  MS(&x);.  if( x.
25e0: 59 3c 31 39 37 31 20 7c 7c 20 78 2e 59 3e 3d 32  Y<1971 || x.Y>=2
25f0: 30 33 38 20 29 7b 0a 20 20 20 20 78 2e 59 20 3d  038 ){.    x.Y =
2600: 20 32 30 30 30 3b 0a 20 20 20 20 78 2e 4d 20 3d   2000;.    x.M =
2610: 20 31 3b 0a 20 20 20 20 78 2e 44 20 3d 20 31 3b   1;.    x.D = 1;
2620: 0a 20 20 20 20 78 2e 68 20 3d 20 30 3b 0a 20 20  .    x.h = 0;.  
2630: 20 20 78 2e 6d 20 3d 20 30 3b 0a 20 20 20 20 78    x.m = 0;.    x
2640: 2e 73 20 3d 20 30 2e 30 3b 0a 20 20 7d 20 65 6c  .s = 0.0;.  } el
2650: 73 65 20 7b 0a 20 20 20 20 69 6e 74 20 73 20 3d  se {.    int s =
2660: 20 78 2e 73 20 2b 20 30 2e 35 3b 0a 20 20 20 20   x.s + 0.5;.    
2670: 78 2e 73 20 3d 20 73 3b 0a 20 20 7d 0a 20 20 78  x.s = s;.  }.  x
2680: 2e 74 7a 20 3d 20 30 3b 0a 20 20 78 2e 76 61 6c  .tz = 0;.  x.val
2690: 69 64 4a 44 20 3d 20 30 3b 0a 20 20 63 6f 6d 70  idJD = 0;.  comp
26a0: 75 74 65 4a 44 28 26 78 29 3b 0a 20 20 74 20 3d  uteJD(&x);.  t =
26b0: 20 28 78 2e 72 4a 44 2d 32 34 34 30 35 38 37 2e   (x.rJD-2440587.
26c0: 35 29 2a 38 36 34 30 30 2e 30 20 2b 20 30 2e 35  5)*86400.0 + 0.5
26d0: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 45 6e 74  ;.  sqlite3OsEnt
26e0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 54 6d  erMutex();.  pTm
26f0: 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 26 74 29   = localtime(&t)
2700: 3b 0a 20 20 79 2e 59 20 3d 20 70 54 6d 2d 3e 74  ;.  y.Y = pTm->t
2710: 6d 5f 79 65 61 72 20 2b 20 31 39 30 30 3b 0a 20  m_year + 1900;. 
2720: 20 79 2e 4d 20 3d 20 70 54 6d 2d 3e 74 6d 5f 6d   y.M = pTm->tm_m
2730: 6f 6e 20 2b 20 31 3b 0a 20 20 79 2e 44 20 3d 20  on + 1;.  y.D = 
2740: 70 54 6d 2d 3e 74 6d 5f 6d 64 61 79 3b 0a 20 20  pTm->tm_mday;.  
2750: 79 2e 68 20 3d 20 70 54 6d 2d 3e 74 6d 5f 68 6f  y.h = pTm->tm_ho
2760: 75 72 3b 0a 20 20 79 2e 6d 20 3d 20 70 54 6d 2d  ur;.  y.m = pTm-
2770: 3e 74 6d 5f 6d 69 6e 3b 0a 20 20 79 2e 73 20 3d  >tm_min;.  y.s =
2780: 20 70 54 6d 2d 3e 74 6d 5f 73 65 63 3b 0a 20 20   pTm->tm_sec;.  
2790: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
27a0: 74 65 78 28 29 3b 0a 20 20 79 2e 76 61 6c 69 64  tex();.  y.valid
27b0: 59 4d 44 20 3d 20 31 3b 0a 20 20 79 2e 76 61 6c  YMD = 1;.  y.val
27c0: 69 64 48 4d 53 20 3d 20 31 3b 0a 20 20 79 2e 76  idHMS = 1;.  y.v
27d0: 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 79 2e  alidJD = 0;.  y.
27e0: 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 63  validTZ = 0;.  c
27f0: 6f 6d 70 75 74 65 4a 44 28 26 79 29 3b 0a 20 20  omputeJD(&y);.  
2800: 72 65 74 75 72 6e 20 79 2e 72 4a 44 20 2d 20 78  return y.rJD - x
2810: 2e 72 4a 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  .rJD;.}../*.** P
2820: 72 6f 63 65 73 73 20 61 20 6d 6f 64 69 66 69 65  rocess a modifie
2830: 72 20 74 6f 20 61 20 64 61 74 65 2d 74 69 6d 65  r to a date-time
2840: 20 73 74 61 6d 70 2e 20 20 54 68 65 20 6d 6f 64   stamp.  The mod
2850: 69 66 69 65 72 73 20 61 72 65 0a 2a 2a 20 61 73  ifiers are.** as
2860: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2870: 20 20 20 20 4e 4e 4e 20 64 61 79 73 0a 2a 2a 20      NNN days.** 
2880: 20 20 20 20 4e 4e 4e 20 68 6f 75 72 73 0a 2a 2a      NNN hours.**
2890: 20 20 20 20 20 4e 4e 4e 20 6d 69 6e 75 74 65 73       NNN minutes
28a0: 0a 2a 2a 20 20 20 20 20 4e 4e 4e 2e 4e 4e 4e 4e  .**     NNN.NNNN
28b0: 20 73 65 63 6f 6e 64 73 0a 2a 2a 20 20 20 20 20   seconds.**     
28c0: 4e 4e 4e 20 6d 6f 6e 74 68 73 0a 2a 2a 20 20 20  NNN months.**   
28d0: 20 20 4e 4e 4e 20 79 65 61 72 73 0a 2a 2a 20 20    NNN years.**  
28e0: 20 20 20 73 74 61 72 74 20 6f 66 20 6d 6f 6e 74     start of mont
28f0: 68 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20 6f  h.**     start o
2900: 66 20 79 65 61 72 0a 2a 2a 20 20 20 20 20 73 74  f year.**     st
2910: 61 72 74 20 6f 66 20 77 65 65 6b 0a 2a 2a 20 20  art of week.**  
2920: 20 20 20 73 74 61 72 74 20 6f 66 20 64 61 79 0a     start of day.
2930: 2a 2a 20 20 20 20 20 77 65 65 6b 64 61 79 20 4e  **     weekday N
2940: 0a 2a 2a 20 20 20 20 20 75 6e 69 78 65 70 6f 63  .**     unixepoc
2950: 68 0a 2a 2a 20 20 20 20 20 6c 6f 63 61 6c 74 69  h.**     localti
2960: 6d 65 0a 2a 2a 20 20 20 20 20 75 74 63 0a 2a 2a  me.**     utc.**
2970: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20  .** Return 0 on 
2980: 73 75 63 63 65 73 73 20 61 6e 64 20 31 20 69 66  success and 1 if
2990: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
29a0: 6e 64 20 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nd of error..*/.
29b0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 73 65  static int parse
29c0: 4d 6f 64 69 66 69 65 72 28 63 6f 6e 73 74 20 63  Modifier(const c
29d0: 68 61 72 20 2a 7a 4d 6f 64 2c 20 44 61 74 65 54  har *zMod, DateT
29e0: 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ime *p){.  int r
29f0: 63 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 3b 0a  c = 1;.  int n;.
2a00: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68    double r;.  ch
2a10: 61 72 20 2a 7a 2c 20 7a 42 75 66 5b 33 30 5d 3b  ar *z, zBuf[30];
2a20: 0a 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 66  .  z = zBuf;.  f
2a30: 6f 72 28 6e 3d 30 3b 20 6e 3c 73 69 7a 65 6f 66  or(n=0; n<sizeof
2a40: 28 7a 42 75 66 29 2d 31 20 26 26 20 7a 4d 6f 64  (zBuf)-1 && zMod
2a50: 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 7a  [n]; n++){.    z
2a60: 5b 6e 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4d  [n] = tolower(zM
2a70: 6f 64 5b 6e 5d 29 3b 0a 20 20 7d 0a 20 20 7a 5b  od[n]);.  }.  z[
2a80: 6e 5d 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  n] = 0;.  switch
2a90: 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 63 61  ( z[0] ){.    ca
2aa0: 73 65 20 27 6c 27 3a 20 7b 0a 20 20 20 20 20 20  se 'l': {.      
2ab0: 2f 2a 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65 0a  /*    localtime.
2ac0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2ad0: 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63  * Assuming the c
2ae0: 75 72 72 65 6e 74 20 74 69 6d 65 20 76 61 6c 75  urrent time valu
2af0: 65 20 69 73 20 55 54 43 20 28 61 2e 6b 2e 61 2e  e is UTC (a.k.a.
2b00: 20 47 4d 54 29 2c 20 73 68 69 66 74 20 69 74 20   GMT), shift it 
2b10: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 77  to.      ** show
2b20: 20 6c 6f 63 61 6c 20 74 69 6d 65 2e 0a 20 20 20   local time..   
2b30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2b40: 73 74 72 63 6d 70 28 7a 2c 20 22 6c 6f 63 61 6c  strcmp(z, "local
2b50: 74 69 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  time")==0 ){.   
2b60: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
2b70: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 4a  );.        p->rJ
2b80: 44 20 2b 3d 20 6c 6f 63 61 6c 74 69 6d 65 4f 66  D += localtimeOf
2b90: 66 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20  fset(p);.       
2ba0: 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a   clearYMD_HMS_TZ
2bb0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (p);.        rc 
2bc0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2bd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2be0: 20 20 20 20 63 61 73 65 20 27 75 27 3a 20 7b 0a      case 'u': {.
2bf0: 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a        /*.      *
2c00: 2a 20 20 20 20 75 6e 69 78 65 70 6f 63 68 0a 20  *    unixepoch. 
2c10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2c20: 20 54 72 65 61 74 20 74 68 65 20 63 75 72 72 65   Treat the curre
2c30: 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 72  nt value of p->r
2c40: 4a 44 20 61 73 20 74 68 65 20 6e 75 6d 62 65 72  JD as the number
2c50: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 73 65 63   of.      ** sec
2c60: 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
2c70: 20 20 43 6f 6e 76 65 72 74 20 74 6f 20 61 20 72    Convert to a r
2c80: 65 61 6c 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e  eal julian day n
2c90: 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  umber..      */.
2ca0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2cb0: 28 7a 2c 20 22 75 6e 69 78 65 70 6f 63 68 22 29  (z, "unixepoch")
2cc0: 3d 3d 30 20 26 26 20 70 2d 3e 76 61 6c 69 64 4a  ==0 && p->validJ
2cd0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  D ){.        p->
2ce0: 72 4a 44 20 3d 20 70 2d 3e 72 4a 44 2f 38 36 34  rJD = p->rJD/864
2cf0: 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
2d00: 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72 59  ;.        clearY
2d10: 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20  MD_HMS_TZ(p);.  
2d20: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
2d30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
2d40: 72 63 6d 70 28 7a 2c 20 22 75 74 63 22 29 3d 3d  rcmp(z, "utc")==
2d50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75  0 ){.        dou
2d60: 62 6c 65 20 63 31 3b 0a 20 20 20 20 20 20 20 20  ble c1;.        
2d70: 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20  computeJD(p);.  
2d80: 20 20 20 20 20 20 63 31 20 3d 20 6c 6f 63 61 6c        c1 = local
2d90: 74 69 6d 65 4f 66 66 73 65 74 28 70 29 3b 0a 20  timeOffset(p);. 
2da0: 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2d 3d         p->rJD -=
2db0: 20 63 31 3b 0a 20 20 20 20 20 20 20 20 63 6c 65   c1;.        cle
2dc0: 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b  arYMD_HMS_TZ(p);
2dd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20  .        p->rJD 
2de0: 2b 3d 20 63 31 20 2d 20 6c 6f 63 61 6c 74 69 6d  += c1 - localtim
2df0: 65 4f 66 66 73 65 74 28 70 29 3b 0a 20 20 20 20  eOffset(p);.    
2e00: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
2e10: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
2e20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2e30: 27 77 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a  'w': {.      /*.
2e40: 20 20 20 20 20 20 2a 2a 20 20 20 20 77 65 65 6b        **    week
2e50: 64 61 79 20 4e 0a 20 20 20 20 20 20 2a 2a 0a 20  day N.      **. 
2e60: 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65       ** Move the
2e70: 20 64 61 74 65 20 74 6f 20 74 68 65 20 73 61 6d   date to the sam
2e80: 65 20 74 69 6d 65 20 6f 6e 20 74 68 65 20 6e 65  e time on the ne
2e90: 78 74 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66  xt occurrence of
2ea0: 0a 20 20 20 20 20 20 2a 2a 20 77 65 65 6b 64 61  .      ** weekda
2eb0: 79 20 4e 20 77 68 65 72 65 20 30 3d 3d 53 75 6e  y N where 0==Sun
2ec0: 64 61 79 2c 20 31 3d 3d 4d 6f 6e 64 61 79 2c 20  day, 1==Monday, 
2ed0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  and so forth.  I
2ee0: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  f the.      ** d
2ef0: 61 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ate is already o
2f00: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
2f10: 65 20 77 65 65 6b 64 61 79 2c 20 74 68 69 73 20  e weekday, this 
2f20: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
2f30: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
2f40: 74 72 6e 63 6d 70 28 7a 2c 20 22 77 65 65 6b 64  trncmp(z, "weekd
2f50: 61 79 20 22 2c 20 38 29 3d 3d 30 20 26 26 20 67  ay ", 8)==0 && g
2f60: 65 74 56 61 6c 75 65 28 26 7a 5b 38 5d 2c 26 72  etValue(&z[8],&r
2f70: 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  )>0.            
2f80: 20 20 20 20 20 26 26 20 28 6e 3d 72 29 3d 3d 72       && (n=r)==r
2f90: 20 26 26 20 6e 3e 3d 30 20 26 26 20 72 3c 37 20   && n>=0 && r<7 
2fa0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 5a  ){.        int Z
2fb0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
2fc0: 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a 20 20 20  eYMD_HMS(p);.   
2fd0: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20       p->validTZ 
2fe0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
2ff0: 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20  validJD = 0;.   
3000: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
3010: 29 3b 0a 20 20 20 20 20 20 20 20 5a 20 3d 20 70  );.        Z = p
3020: 2d 3e 72 4a 44 20 2b 20 31 2e 35 3b 0a 20 20 20  ->rJD + 1.5;.   
3030: 20 20 20 20 20 5a 20 25 3d 20 37 3b 0a 20 20 20       Z %= 7;.   
3040: 20 20 20 20 20 69 66 28 20 5a 3e 6e 20 29 20 5a       if( Z>n ) Z
3050: 20 2d 3d 20 37 3b 0a 20 20 20 20 20 20 20 20 70   -= 7;.        p
3060: 2d 3e 72 4a 44 20 2b 3d 20 6e 20 2d 20 5a 3b 0a  ->rJD += n - Z;.
3070: 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44          clearYMD
3080: 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20  _HMS_TZ(p);.    
3090: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
30a0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
30b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
30c0: 27 73 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a  's': {.      /*.
30d0: 20 20 20 20 20 20 2a 2a 20 20 20 20 73 74 61 72        **    star
30e0: 74 20 6f 66 20 54 54 54 54 54 0a 20 20 20 20 20  t of TTTTT.     
30f0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76   **.      ** Mov
3100: 65 20 74 68 65 20 64 61 74 65 20 62 61 63 6b 77  e the date backw
3110: 61 72 64 73 20 74 6f 20 74 68 65 20 62 65 67 69  ards to the begi
3120: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72  nning of the cur
3130: 72 65 6e 74 20 64 61 79 2c 0a 20 20 20 20 20 20  rent day,.      
3140: 2a 2a 20 6f 72 20 6d 6f 6e 74 68 20 6f 72 20 79  ** or month or y
3150: 65 61 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ear..      */.  
3160: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
3170: 7a 2c 20 22 73 74 61 72 74 20 6f 66 20 22 2c 20  z, "start of ", 
3180: 39 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  9)!=0 ) break;. 
3190: 20 20 20 20 20 7a 20 2b 3d 20 39 3b 0a 20 20 20       z += 9;.   
31a0: 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 28 70 29     computeYMD(p)
31b0: 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64  ;.      p->valid
31c0: 48 4d 53 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  HMS = 1;.      p
31d0: 2d 3e 68 20 3d 20 70 2d 3e 6d 20 3d 20 30 3b 0a  ->h = p->m = 0;.
31e0: 20 20 20 20 20 20 70 2d 3e 73 20 3d 20 30 2e 30        p->s = 0.0
31f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64  ;.      p->valid
3200: 54 5a 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  TZ = 0;.      p-
3210: 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20  >validJD = 0;.  
3220: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
3230: 2c 22 6d 6f 6e 74 68 22 29 3d 3d 30 20 29 7b 0a  ,"month")==0 ){.
3240: 20 20 20 20 20 20 20 20 70 2d 3e 44 20 3d 20 31          p->D = 1
3250: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30  ;.        rc = 0
3260: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
3270: 28 20 73 74 72 63 6d 70 28 7a 2c 22 79 65 61 72  ( strcmp(z,"year
3280: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
3290: 20 63 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a   computeYMD(p);.
32a0: 20 20 20 20 20 20 20 20 70 2d 3e 4d 20 3d 20 31          p->M = 1
32b0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 44 20 3d  ;.        p->D =
32c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
32d0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
32e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 64 61  if( strcmp(z,"da
32f0: 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
3300: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
3310: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3320: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27 2b     }.    case '+
3330: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 2d 27 3a  ':.    case '-':
3340: 0a 20 20 20 20 63 61 73 65 20 27 30 27 3a 0a 20  .    case '0':. 
3350: 20 20 20 63 61 73 65 20 27 31 27 3a 0a 20 20 20     case '1':.   
3360: 20 63 61 73 65 20 27 32 27 3a 0a 20 20 20 20 63   case '2':.    c
3370: 61 73 65 20 27 33 27 3a 0a 20 20 20 20 63 61 73  ase '3':.    cas
3380: 65 20 27 34 27 3a 0a 20 20 20 20 63 61 73 65 20  e '4':.    case 
3390: 27 35 27 3a 0a 20 20 20 20 63 61 73 65 20 27 36  '5':.    case '6
33a0: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 37 27 3a  ':.    case '7':
33b0: 0a 20 20 20 20 63 61 73 65 20 27 38 27 3a 0a 20  .    case '8':. 
33c0: 20 20 20 63 61 73 65 20 27 39 27 3a 20 7b 0a 20     case '9': {. 
33d0: 20 20 20 20 20 6e 20 3d 20 67 65 74 56 61 6c 75       n = getValu
33e0: 65 28 7a 2c 20 26 72 29 3b 0a 20 20 20 20 20 20  e(z, &r);.      
33f0: 69 66 28 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b  if( n<=0 ) break
3400: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d  ;.      if( z[n]
3410: 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20  ==':' ){.       
3420: 20 2f 2a 20 41 20 6d 6f 64 69 66 69 65 72 20 6f   /* A modifier o
3430: 66 20 74 68 65 20 66 6f 72 6d 20 28 2b 7c 2d 29  f the form (+|-)
3440: 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 20 61 64 64  HH:MM:SS.FFF add
3450: 73 20 28 6f 72 20 73 75 62 74 72 61 63 74 73 29  s (or subtracts)
3460: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
3470: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
3480: 20 6f 66 20 68 6f 75 72 73 2c 20 6d 69 6e 75 74   of hours, minut
3490: 65 73 2c 20 73 65 63 6f 6e 64 73 2c 20 61 6e 64  es, seconds, and
34a0: 20 66 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f   fractional seco
34b0: 6e 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  nds.        ** t
34c0: 6f 20 74 68 65 20 74 69 6d 65 2e 20 20 54 68 65  o the time.  The
34d0: 20 22 2e 46 46 46 22 20 6d 61 79 20 62 65 20 6f   ".FFF" may be o
34e0: 6d 69 74 74 65 64 2e 20 20 54 68 65 20 22 3a 53  mitted.  The ":S
34f0: 53 2e 46 46 46 22 20 6d 61 79 20 62 65 0a 20 20  S.FFF" may be.  
3500: 20 20 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64        ** omitted
3510: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
3520: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
3530: 2a 7a 32 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20  *z2 = z;.       
3540: 20 44 61 74 65 54 69 6d 65 20 74 78 3b 0a 20 20   DateTime tx;.  
3550: 20 20 20 20 20 20 69 6e 74 20 64 61 79 3b 0a 20        int day;. 
3560: 20 20 20 20 20 20 20 69 66 28 20 21 69 73 64 69         if( !isdi
3570: 67 69 74 28 2a 28 75 38 2a 29 7a 32 29 20 29 20  git(*(u8*)z2) ) 
3580: 7a 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 65  z2++;.        me
3590: 6d 73 65 74 28 26 74 78 2c 20 30 2c 20 73 69 7a  mset(&tx, 0, siz
35a0: 65 6f 66 28 74 78 29 29 3b 0a 20 20 20 20 20 20  eof(tx));.      
35b0: 20 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53    if( parseHhMmS
35c0: 73 28 7a 32 2c 20 26 74 78 29 20 29 20 62 72 65  s(z2, &tx) ) bre
35d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  ak;.        comp
35e0: 75 74 65 4a 44 28 26 74 78 29 3b 0a 20 20 20 20  uteJD(&tx);.    
35f0: 20 20 20 20 74 78 2e 72 4a 44 20 2d 3d 20 30 2e      tx.rJD -= 0.
3600: 35 3b 0a 20 20 20 20 20 20 20 20 64 61 79 20 3d  5;.        day =
3610: 20 28 69 6e 74 29 74 78 2e 72 4a 44 3b 0a 20 20   (int)tx.rJD;.  
3620: 20 20 20 20 20 20 74 78 2e 72 4a 44 20 2d 3d 20        tx.rJD -= 
3630: 64 61 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  day;.        if(
3640: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 74 78 2e   z[0]=='-' ) tx.
3650: 72 4a 44 20 3d 20 2d 74 78 2e 72 4a 44 3b 0a 20  rJD = -tx.rJD;. 
3660: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44         computeJD
3670: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 65  (p);.        cle
3680: 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b  arYMD_HMS_TZ(p);
3690: 0a 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b  .       p->rJD +
36a0: 3d 20 74 78 2e 72 4a 44 3b 0a 20 20 20 20 20 20  = tx.rJD;.      
36b0: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
36c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
36d0: 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 3b 0a 20  .      z += n;. 
36e0: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70       while( issp
36f0: 61 63 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a  ace(*(u8*)z) ) z
3700: 2b 2b 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74  ++;.      n = st
3710: 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 20 20 69  rlen(z);.      i
3720: 66 28 20 6e 3e 31 30 20 7c 7c 20 6e 3c 33 20 29  f( n>10 || n<3 )
3730: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
3740: 28 20 7a 5b 6e 2d 31 5d 3d 3d 27 73 27 20 29 7b  ( z[n-1]=='s' ){
3750: 20 7a 5b 6e 2d 31 5d 20 3d 20 30 3b 20 6e 2d 2d   z[n-1] = 0; n--
3760: 3b 20 7d 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  ; }.      comput
3770: 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 72 63  eJD(p);.      rc
3780: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
3790: 6e 3d 3d 33 20 26 26 20 73 74 72 63 6d 70 28 7a  n==3 && strcmp(z
37a0: 2c 22 64 61 79 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"day")==0 ){.  
37b0: 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20        p->rJD += 
37c0: 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  r;.      }else i
37d0: 66 28 20 6e 3d 3d 34 20 26 26 20 73 74 72 63 6d  f( n==4 && strcm
37e0: 70 28 7a 2c 22 68 6f 75 72 22 29 3d 3d 30 20 29  p(z,"hour")==0 )
37f0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 4a 44  {.        p->rJD
3800: 20 2b 3d 20 72 2f 32 34 2e 30 3b 0a 20 20 20 20   += r/24.0;.    
3810: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36    }else if( n==6
3820: 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d 69   && strcmp(z,"mi
3830: 6e 75 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nute")==0 ){.   
3840: 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 72       p->rJD += r
3850: 2f 28 32 34 2e 30 2a 36 30 2e 30 29 3b 0a 20 20  /(24.0*60.0);.  
3860: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d      }else if( n=
3870: 3d 36 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22  =6 && strcmp(z,"
3880: 73 65 63 6f 6e 64 22 29 3d 3d 30 20 29 7b 0a 20  second")==0 ){. 
3890: 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d         p->rJD +=
38a0: 20 72 2f 28 32 34 2e 30 2a 36 30 2e 30 2a 36 30   r/(24.0*60.0*60
38b0: 2e 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .0);.      }else
38c0: 20 69 66 28 20 6e 3d 3d 35 20 26 26 20 73 74 72   if( n==5 && str
38d0: 63 6d 70 28 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d  cmp(z,"month")==
38e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
38f0: 20 78 2c 20 79 3b 0a 20 20 20 20 20 20 20 20 63   x, y;.        c
3900: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29  omputeYMD_HMS(p)
3910: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 4d 20 2b  ;.        p->M +
3920: 3d 20 72 3b 0a 20 20 20 20 20 20 20 20 78 20 3d  = r;.        x =
3930: 20 70 2d 3e 4d 3e 30 20 3f 20 28 70 2d 3e 4d 2d   p->M>0 ? (p->M-
3940: 31 29 2f 31 32 20 3a 20 28 70 2d 3e 4d 2d 31 32  1)/12 : (p->M-12
3950: 29 2f 31 32 3b 0a 20 20 20 20 20 20 20 20 70 2d  )/12;.        p-
3960: 3e 59 20 2b 3d 20 78 3b 0a 20 20 20 20 20 20 20  >Y += x;.       
3970: 20 70 2d 3e 4d 20 2d 3d 20 78 2a 31 32 3b 0a 20   p->M -= x*12;. 
3980: 20 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a         p->validJ
3990: 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  D = 0;.        c
39a0: 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20  omputeJD(p);.   
39b0: 20 20 20 20 20 79 20 3d 20 72 3b 0a 20 20 20 20       y = r;.    
39c0: 20 20 20 20 69 66 28 20 79 21 3d 72 20 29 7b 0a      if( y!=r ){.
39d0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 4a 44            p->rJD
39e0: 20 2b 3d 20 28 72 20 2d 20 79 29 2a 33 30 2e 30   += (r - y)*30.0
39f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3a00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 34    }else if( n==4
3a10: 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 79 65   && strcmp(z,"ye
3a20: 61 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ar")==0 ){.     
3a30: 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d     computeYMD_HM
3a40: 53 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  S(p);.        p-
3a50: 3e 59 20 2b 3d 20 72 3b 0a 20 20 20 20 20 20 20  >Y += r;.       
3a60: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b   p->validJD = 0;
3a70: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
3a80: 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  JD(p);.      }el
3a90: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
3aa0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
3ab0: 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54    clearYMD_HMS_T
3ac0: 5a 28 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Z(p);.      brea
3ad0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
3ae0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72  ault: {.      br
3af0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
3b00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3b10: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 74 69 6d  *.** Process tim
3b20: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  e function argum
3b30: 65 6e 74 73 2e 20 20 61 72 67 76 5b 30 5d 20 69  ents.  argv[0] i
3b40: 73 20 61 20 64 61 74 65 2d 74 69 6d 65 20 73 74  s a date-time st
3b50: 61 6d 70 2e 0a 2a 2a 20 61 72 67 76 5b 31 5d 20  amp..** argv[1] 
3b60: 61 6e 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  and following ar
3b70: 65 20 6d 6f 64 69 66 69 65 72 73 2e 20 20 50 61  e modifiers.  Pa
3b80: 72 73 65 20 74 68 65 6d 20 61 6c 6c 20 61 6e 64  rse them all and
3b90: 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 72 65   write.** the re
3ba0: 73 75 6c 74 69 6e 67 20 74 69 6d 65 20 69 6e 74  sulting time int
3bb0: 6f 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 73  o the DateTime s
3bc0: 74 72 75 63 74 75 72 65 20 70 2e 20 20 52 65 74  tructure p.  Ret
3bd0: 75 72 6e 20 30 0a 2a 2a 20 6f 6e 20 73 75 63 63  urn 0.** on succ
3be0: 65 73 73 20 61 6e 64 20 31 20 69 66 20 74 68 65  ess and 1 if the
3bf0: 72 65 20 61 72 65 20 61 6e 79 20 65 72 72 6f 72  re are any error
3c00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
3c10: 20 69 73 44 61 74 65 28 69 6e 74 20 61 72 67 63   isDate(int argc
3c20: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
3c30: 2a 2a 61 72 67 76 2c 20 44 61 74 65 54 69 6d 65  **argv, DateTime
3c40: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
3c50: 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29 20 72   if( argc==0 ) r
3c60: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 53  eturn 1;.  if( S
3c70: 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69  QLITE_NULL==sqli
3c80: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
3c90: 72 67 76 5b 30 5d 29 20 7c 7c 20 0a 20 20 20 20  rgv[0]) || .    
3ca0: 20 20 70 61 72 73 65 44 61 74 65 4f 72 54 69 6d    parseDateOrTim
3cb0: 65 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  e(sqlite3_value_
3cc0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 70  text(argv[0]), p
3cd0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
3ce0: 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b  for(i=1; i<argc;
3cf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
3d00: 51 4c 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69  QLITE_NULL==sqli
3d10: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
3d20: 72 67 76 5b 69 5d 29 20 7c 7c 20 0a 20 20 20 20  rgv[i]) || .    
3d30: 20 20 20 20 70 61 72 73 65 4d 6f 64 69 66 69 65      parseModifie
3d40: 72 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  r(sqlite3_value_
3d50: 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 20 70  text(argv[i]), p
3d60: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
3d70: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3d80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
3d90: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69  owing routines i
3da0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 76 61 72  mplement the var
3db0: 69 6f 75 73 20 64 61 74 65 20 61 6e 64 20 74 69  ious date and ti
3dc0: 6d 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  me functions.** 
3dd0: 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 0a 2f  of SQLite..*/../
3de0: 2a 0a 2a 2a 20 20 20 20 6a 75 6c 69 61 6e 64 61  *.**    julianda
3df0: 79 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d  y( TIMESTRING, M
3e00: 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a  OD, MOD, ...).**
3e10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6a  .** Return the j
3e20: 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72  ulian day number
3e30: 20 6f 66 20 74 68 65 20 64 61 74 65 20 73 70 65   of the date spe
3e40: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72  cified in the ar
3e50: 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  guments.*/.stati
3e60: 63 20 76 6f 69 64 20 6a 75 6c 69 61 6e 64 61 79  c void julianday
3e70: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
3e80: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
3e90: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
3ea0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3eb0: 61 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69  argv.){.  DateTi
3ec0: 6d 65 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61  me x;.  if( isDa
3ed0: 74 65 28 61 72 67 63 2c 20 61 72 67 76 2c 20 26  te(argc, argv, &
3ee0: 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6d  x)==0 ){.    com
3ef0: 70 75 74 65 4a 44 28 26 78 29 3b 0a 20 20 20 20  puteJD(&x);.    
3f00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
3f10: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 78  ouble(context, x
3f20: 2e 72 4a 44 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .rJD);.  }.}../*
3f30: 0a 2a 2a 20 20 20 20 64 61 74 65 74 69 6d 65 28  .**    datetime(
3f40: 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44   TIMESTRING, MOD
3f50: 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  , MOD, ...).**.*
3f60: 2a 20 52 65 74 75 72 6e 20 59 59 59 59 2d 4d 4d  * Return YYYY-MM
3f70: 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2f 0a  -DD HH:MM:SS.*/.
3f80: 73 74 61 74 69 63 20 76 6f 69 64 20 64 61 74 65  static void date
3f90: 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  timeFunc(.  sqli
3fa0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
3fb0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
3fc0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
3fd0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61  e **argv.){.  Da
3fe0: 74 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20  teTime x;.  if( 
3ff0: 69 73 44 61 74 65 28 61 72 67 63 2c 20 61 72 67  isDate(argc, arg
4000: 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20  v, &x)==0 ){.   
4010: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
4020: 0a 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f  .    computeYMD_
4030: 48 4d 53 28 26 78 29 3b 0a 20 20 20 20 73 70 72  HMS(&x);.    spr
4040: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 30 34 64  intf(zBuf, "%04d
4050: 2d 25 30 32 64 2d 25 30 32 64 20 25 30 32 64 3a  -%02d-%02d %02d:
4060: 25 30 32 64 3a 25 30 32 64 22 2c 78 2e 59 2c 20  %02d:%02d",x.Y, 
4070: 78 2e 4d 2c 20 78 2e 44 2c 20 78 2e 68 2c 20 78  x.M, x.D, x.h, x
4080: 2e 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  .m,.           (
4090: 69 6e 74 29 28 78 2e 73 29 29 3b 0a 20 20 20 20  int)(x.s));.    
40a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
40b0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
40c0: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
40d0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
40e0: 0a 2f 2a 0a 2a 2a 20 20 20 20 74 69 6d 65 28 20  ./*.**    time( 
40f0: 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c  TIMESTRING, MOD,
4100: 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a   MOD, ...).**.**
4110: 20 52 65 74 75 72 6e 20 48 48 3a 4d 4d 3a 53 53   Return HH:MM:SS
4120: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4130: 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  timeFunc(.  sqli
4140: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
4150: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4160: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4170: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61  e **argv.){.  Da
4180: 74 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20  teTime x;.  if( 
4190: 69 73 44 61 74 65 28 61 72 67 63 2c 20 61 72 67  isDate(argc, arg
41a0: 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20  v, &x)==0 ){.   
41b0: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
41c0: 0a 20 20 20 20 63 6f 6d 70 75 74 65 48 4d 53 28  .    computeHMS(
41d0: 26 78 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  &x);.    sprintf
41e0: 28 7a 42 75 66 2c 20 22 25 30 32 64 3a 25 30 32  (zBuf, "%02d:%02
41f0: 64 3a 25 30 32 64 22 2c 20 78 2e 68 2c 20 78 2e  d:%02d", x.h, x.
4200: 6d 2c 20 28 69 6e 74 29 78 2e 73 29 3b 0a 20 20  m, (int)x.s);.  
4210: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4220: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
4230: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
4240: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
4250: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64 61 74 65  }../*.**    date
4260: 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f  ( TIMESTRING, MO
4270: 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a  D, MOD, ...).**.
4280: 2a 2a 20 52 65 74 75 72 6e 20 59 59 59 59 2d 4d  ** Return YYYY-M
4290: 4d 2d 44 44 0a 2a 2f 0a 73 74 61 74 69 63 20 76  M-DD.*/.static v
42a0: 6f 69 64 20 64 61 74 65 46 75 6e 63 28 0a 20 20  oid dateFunc(.  
42b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
42c0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
42d0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
42e0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
42f0: 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20    DateTime x;.  
4300: 69 66 28 20 69 73 44 61 74 65 28 61 72 67 63 2c  if( isDate(argc,
4310: 20 61 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b   argv, &x)==0 ){
4320: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31  .    char zBuf[1
4330: 30 30 5d 3b 0a 20 20 20 20 63 6f 6d 70 75 74 65  00];.    compute
4340: 59 4d 44 28 26 78 29 3b 0a 20 20 20 20 73 70 72  YMD(&x);.    spr
4350: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 30 34 64  intf(zBuf, "%04d
4360: 2d 25 30 32 64 2d 25 30 32 64 22 2c 20 78 2e 59  -%02d-%02d", x.Y
4370: 2c 20 78 2e 4d 2c 20 78 2e 44 29 3b 0a 20 20 20  , x.M, x.D);.   
4380: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4390: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
43a0: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
43b0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d  RANSIENT);.  }.}
43c0: 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 74 72 66 74  ../*.**    strft
43d0: 69 6d 65 28 20 46 4f 52 4d 41 54 2c 20 54 49 4d  ime( FORMAT, TIM
43e0: 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f  ESTRING, MOD, MO
43f0: 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65  D, ...).**.** Re
4400: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 64 65  turn a string de
4410: 73 63 72 69 62 65 64 20 62 79 20 46 4f 52 4d 41  scribed by FORMA
4420: 54 2e 20 20 43 6f 6e 76 65 72 73 69 6f 6e 73 20  T.  Conversions 
4430: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
4440: 2a 20 20 20 25 64 20 20 64 61 79 20 6f 66 20 6d  *   %d  day of m
4450: 6f 6e 74 68 0a 2a 2a 20 20 20 25 66 20 20 2a 2a  onth.**   %f  **
4460: 20 66 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f   fractional seco
4470: 6e 64 73 20 20 53 53 2e 53 53 53 0a 2a 2a 20 20  nds  SS.SSS.**  
4480: 20 25 48 20 20 68 6f 75 72 20 30 30 2d 32 34 0a   %H  hour 00-24.
4490: 2a 2a 20 20 20 25 6a 20 20 64 61 79 20 6f 66 20  **   %j  day of 
44a0: 79 65 61 72 20 30 30 30 2d 33 36 36 0a 2a 2a 20  year 000-366.** 
44b0: 20 20 25 4a 20 20 2a 2a 20 4a 75 6c 69 61 6e 20    %J  ** Julian 
44c0: 64 61 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  day number.**   
44d0: 25 6d 20 20 6d 6f 6e 74 68 20 30 31 2d 31 32 0a  %m  month 01-12.
44e0: 2a 2a 20 20 20 25 4d 20 20 6d 69 6e 75 74 65 20  **   %M  minute 
44f0: 30 30 2d 35 39 0a 2a 2a 20 20 20 25 73 20 20 73  00-59.**   %s  s
4500: 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
4510: 30 2d 30 31 2d 30 31 0a 2a 2a 20 20 20 25 53 20  0-01-01.**   %S 
4520: 20 73 65 63 6f 6e 64 73 20 30 30 2d 35 39 0a 2a   seconds 00-59.*
4530: 2a 20 20 20 25 77 20 20 64 61 79 20 6f 66 20 77  *   %w  day of w
4540: 65 65 6b 20 30 2d 36 20 20 73 75 6e 64 61 79 3d  eek 0-6  sunday=
4550: 3d 30 0a 2a 2a 20 20 20 25 57 20 20 77 65 65 6b  =0.**   %W  week
4560: 20 6f 66 20 79 65 61 72 20 30 30 2d 35 33 0a 2a   of year 00-53.*
4570: 2a 20 20 20 25 59 20 20 79 65 61 72 20 30 30 30  *   %Y  year 000
4580: 30 2d 39 39 39 39 0a 2a 2a 20 20 20 25 25 20 20  0-9999.**   %%  
4590: 25 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  %.*/.static void
45a0: 20 73 74 72 66 74 69 6d 65 46 75 6e 63 28 0a 20   strftimeFunc(. 
45b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
45c0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
45d0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
45e0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
45f0: 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20  .  DateTime x;. 
4600: 20 69 6e 74 20 6e 2c 20 69 2c 20 6a 3b 0a 20 20   int n, i, j;.  
4610: 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74  char *z;.  const
4620: 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 73 71   char *zFmt = sq
4630: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
4640: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 68 61  (argv[0]);.  cha
4650: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69  r zBuf[100];.  i
4660: 66 28 20 7a 46 6d 74 3d 3d 30 20 7c 7c 20 69 73  f( zFmt==0 || is
4670: 44 61 74 65 28 61 72 67 63 2d 31 2c 20 61 72 67  Date(argc-1, arg
4680: 76 2b 31 2c 20 26 78 29 20 29 20 72 65 74 75 72  v+1, &x) ) retur
4690: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d  n;.  for(i=0, n=
46a0: 31 3b 20 7a 46 6d 74 5b 69 5d 3b 20 69 2b 2b 2c  1; zFmt[i]; i++,
46b0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   n++){.    if( z
46c0: 46 6d 74 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20  Fmt[i]=='%' ){. 
46d0: 20 20 20 20 20 73 77 69 74 63 68 28 20 7a 46 6d       switch( zFm
46e0: 74 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  t[i+1] ){.      
46f0: 20 20 63 61 73 65 20 27 64 27 3a 0a 20 20 20 20    case 'd':.    
4700: 20 20 20 20 63 61 73 65 20 27 48 27 3a 0a 20 20      case 'H':.  
4710: 20 20 20 20 20 20 63 61 73 65 20 27 6d 27 3a 0a        case 'm':.
4720: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 4d 27          case 'M'
4730: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  :.        case '
4740: 53 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  S':.        case
4750: 20 27 57 27 3a 0a 20 20 20 20 20 20 20 20 20 20   'W':.          
4760: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  n++;.          /
4770: 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * fall thru */. 
4780: 20 20 20 20 20 20 20 63 61 73 65 20 27 77 27 3a         case 'w':
4790: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 25  .        case '%
47a0: 27 3a 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ':.          bre
47b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
47c0: 20 27 66 27 3a 0a 20 20 20 20 20 20 20 20 20 20   'f':.          
47d0: 6e 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20 20  n += 8;.        
47e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
47f0: 20 63 61 73 65 20 27 6a 27 3a 0a 20 20 20 20 20   case 'j':.     
4800: 20 20 20 20 20 6e 20 2b 3d 20 33 3b 0a 20 20 20       n += 3;.   
4810: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4820: 20 20 20 20 20 20 63 61 73 65 20 27 59 27 3a 0a        case 'Y':.
4830: 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 38            n += 8
4840: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4850: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
4860: 27 73 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73  's':.        cas
4870: 65 20 27 4a 27 3a 0a 20 20 20 20 20 20 20 20 20  e 'J':.         
4880: 20 6e 20 2b 3d 20 35 30 3b 0a 20 20 20 20 20 20   n += 50;.      
4890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
48a0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
48b0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f        return;  /
48c0: 2a 20 45 52 52 4f 52 2e 20 20 72 65 74 75 72 6e  * ERROR.  return
48d0: 20 61 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20   a NULL */.     
48e0: 20 7d 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20   }.      i++;.  
48f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c    }.  }.  if( n<
4900: 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 7b 0a  sizeof(zBuf) ){.
4910: 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20      z = zBuf;.  
4920: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
4930: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 20 29  qliteMalloc( n )
4940: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
4950: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 63   return;.  }.  c
4960: 6f 6d 70 75 74 65 4a 44 28 26 78 29 3b 0a 20 20  omputeJD(&x);.  
4970: 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26  computeYMD_HMS(&
4980: 78 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  x);.  for(i=j=0;
4990: 20 7a 46 6d 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   zFmt[i]; i++){.
49a0: 20 20 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 21      if( zFmt[i]!
49b0: 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 5b  ='%' ){.      z[
49c0: 6a 2b 2b 5d 20 3d 20 7a 46 6d 74 5b 69 5d 3b 0a  j++] = zFmt[i];.
49d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
49e0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 73 77 69 74   i++;.      swit
49f0: 63 68 28 20 7a 46 6d 74 5b 69 5d 20 29 7b 0a 20  ch( zFmt[i] ){. 
4a00: 20 20 20 20 20 20 20 63 61 73 65 20 27 64 27 3a         case 'd':
4a10: 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c    sprintf(&z[j],
4a20: 22 25 30 32 64 22 2c 78 2e 44 29 3b 20 6a 2b 3d  "%02d",x.D); j+=
4a30: 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  2; break;.      
4a40: 20 20 63 61 73 65 20 27 66 27 3a 20 7b 0a 20 20    case 'f': {.  
4a50: 20 20 20 20 20 20 20 20 69 6e 74 20 73 20 3d 20          int s = 
4a60: 78 2e 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x.s;.          i
4a70: 6e 74 20 6d 73 20 3d 20 28 78 2e 73 20 2d 20 73  nt ms = (x.s - s
4a80: 29 2a 31 30 30 30 2e 30 3b 0a 20 20 20 20 20 20  )*1000.0;.      
4a90: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a      sprintf(&z[j
4aa0: 5d 2c 22 25 30 32 64 2e 25 30 33 64 22 2c 73 2c  ],"%02d.%03d",s,
4ab0: 6d 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  ms);.          j
4ac0: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 5b 6a 5d   += strlen(&z[j]
4ad0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
4ae0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4af0: 20 20 20 20 20 20 63 61 73 65 20 27 48 27 3a 20        case 'H': 
4b00: 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22   sprintf(&z[j],"
4b10: 25 30 32 64 22 2c 78 2e 68 29 3b 20 6a 2b 3d 32  %02d",x.h); j+=2
4b20: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
4b30: 20 63 61 73 65 20 27 57 27 3a 20 2f 2a 20 46 61   case 'W': /* Fa
4b40: 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20  ll thru */.     
4b50: 20 20 20 63 61 73 65 20 27 6a 27 3a 20 7b 0a 20     case 'j': {. 
4b60: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20           int n; 
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4b80: 75 6d 62 65 72 20 6f 66 20 64 61 79 73 20 73 69  umber of days si
4b90: 6e 63 65 20 31 73 74 20 64 61 79 20 6f 66 20 79  nce 1st day of y
4ba0: 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ear */.         
4bb0: 20 44 61 74 65 54 69 6d 65 20 79 20 3d 20 78 3b   DateTime y = x;
4bc0: 0a 20 20 20 20 20 20 20 20 20 20 79 2e 76 61 6c  .          y.val
4bd0: 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20  idJD = 0;.      
4be0: 20 20 20 20 79 2e 4d 20 3d 20 31 3b 0a 20 20 20      y.M = 1;.   
4bf0: 20 20 20 20 20 20 20 79 2e 44 20 3d 20 31 3b 0a         y.D = 1;.
4c00: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74            comput
4c10: 65 4a 44 28 26 79 29 3b 0a 20 20 20 20 20 20 20  eJD(&y);.       
4c20: 20 20 20 6e 20 3d 20 78 2e 72 4a 44 20 2d 20 79     n = x.rJD - y
4c30: 2e 72 4a 44 3b 0a 20 20 20 20 20 20 20 20 20 20  .rJD;.          
4c40: 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27 57 27  if( zFmt[i]=='W'
4c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4c60: 69 6e 74 20 77 64 3b 20 20 20 2f 2a 20 30 3d 4d  int wd;   /* 0=M
4c70: 6f 6e 64 61 79 2c 20 31 3d 54 75 65 73 64 61 79  onday, 1=Tuesday
4c80: 2c 20 2e 2e 2e 20 36 3d 53 75 6e 64 61 79 20 2a  , ... 6=Sunday *
4c90: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 64  /.            wd
4ca0: 20 3d 20 28 28 69 6e 74 29 28 78 2e 72 4a 44 2b   = ((int)(x.rJD+
4cb0: 30 2e 35 29 29 20 25 20 37 3b 0a 20 20 20 20 20  0.5)) % 7;.     
4cc0: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 26         sprintf(&
4cd0: 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 28 6e 2b 37  z[j],"%02d",(n+7
4ce0: 2d 77 64 29 2f 37 29 3b 0a 20 20 20 20 20 20 20  -wd)/7);.       
4cf0: 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20 20       j += 2;.   
4d00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
4d10: 20 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74            sprint
4d20: 66 28 26 7a 5b 6a 5d 2c 22 25 30 33 64 22 2c 6e  f(&z[j],"%03d",n
4d30: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
4d40: 20 6a 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20   j += 3;.       
4d50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
4d60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4d70: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 4a 27          case 'J'
4d80: 3a 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d  :  sprintf(&z[j]
4d90: 2c 22 25 2e 31 36 67 22 2c 78 2e 72 4a 44 29 3b  ,"%.16g",x.rJD);
4da0: 20 6a 2b 3d 73 74 72 6c 65 6e 28 26 7a 5b 6a 5d   j+=strlen(&z[j]
4db0: 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ); break;.      
4dc0: 20 20 63 61 73 65 20 27 6d 27 3a 20 20 73 70 72    case 'm':  spr
4dd0: 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 30 32 64  intf(&z[j],"%02d
4de0: 22 2c 78 2e 4d 29 3b 20 6a 2b 3d 32 3b 20 62 72  ",x.M); j+=2; br
4df0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
4e00: 65 20 27 4d 27 3a 20 20 73 70 72 69 6e 74 66 28  e 'M':  sprintf(
4e10: 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 6d  &z[j],"%02d",x.m
4e20: 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a  ); j+=2; break;.
4e30: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 73 27          case 's'
4e40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70  : {.          sp
4e50: 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 64 22  rintf(&z[j],"%d"
4e60: 2c 28 69 6e 74 29 28 28 78 2e 72 4a 44 2d 32 34  ,(int)((x.rJD-24
4e70: 34 30 35 38 37 2e 35 29 2a 38 36 34 30 30 2e 30  40587.5)*86400.0
4e80: 20 2b 20 30 2e 35 29 29 3b 0a 20 20 20 20 20 20   + 0.5));.      
4e90: 20 20 20 20 6a 20 2b 3d 20 73 74 72 6c 65 6e 28      j += strlen(
4ea0: 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  &z[j]);.        
4eb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4ec0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
4ed0: 27 53 27 3a 20 20 73 70 72 69 6e 74 66 28 26 7a  'S':  sprintf(&z
4ee0: 5b 6a 5d 2c 22 25 30 32 64 22 2c 28 69 6e 74 29  [j],"%02d",(int)
4ef0: 28 78 2e 73 2b 30 2e 35 29 29 3b 20 6a 2b 3d 32  (x.s+0.5)); j+=2
4f00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
4f10: 20 63 61 73 65 20 27 77 27 3a 20 20 7a 5b 6a 2b   case 'w':  z[j+
4f20: 2b 5d 20 3d 20 28 28 28 69 6e 74 29 28 78 2e 72  +] = (((int)(x.r
4f30: 4a 44 2b 31 2e 35 29 29 20 25 20 37 29 20 2b 20  JD+1.5)) % 7) + 
4f40: 27 30 27 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  '0'; break;.    
4f50: 20 20 20 20 63 61 73 65 20 27 59 27 3a 20 20 73      case 'Y':  s
4f60: 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 30  printf(&z[j],"%0
4f70: 34 64 22 2c 78 2e 59 29 3b 20 6a 2b 3d 73 74 72  4d",x.Y); j+=str
4f80: 6c 65 6e 28 26 7a 5b 6a 5d 29 3b 20 62 72 65 61  len(&z[j]); brea
4f90: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
4fa0: 27 25 27 3a 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27  '%':  z[j++] = '
4fb0: 25 27 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  %'; break;.     
4fc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a   }.    }.  }.  z
4fd0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [j] = 0;.  sqlit
4fe0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
4ff0: 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 53  ontext, z, -1, S
5000: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5010: 3b 0a 20 20 69 66 28 20 7a 21 3d 7a 42 75 66 20  ;.  if( z!=zBuf 
5020: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
5030: 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(z);.  }.}../*.
5040: 2a 2a 20 63 75 72 72 65 6e 74 5f 74 69 6d 65 28  ** current_time(
5050: 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ).**.** This fun
5060: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
5070: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
5080: 74 69 6d 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a  time('now')..*/.
5090: 73 74 61 74 69 63 20 76 6f 69 64 20 63 74 69 6d  static void ctim
50a0: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
50b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
50c0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
50d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
50e0: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
50f0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d  e3_value *pVal =
5100: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
5110: 28 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29  ();.  if( pVal )
5120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
5130: 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
5140: 31 2c 20 22 6e 6f 77 22 2c 20 53 51 4c 49 54 45  1, "now", SQLITE
5150: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
5160: 41 54 49 43 29 3b 0a 20 20 20 20 74 69 6d 65 46  ATIC);.    timeF
5170: 75 6e 63 28 63 6f 6e 74 65 78 74 2c 20 31 2c 20  unc(context, 1, 
5180: 26 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  &pVal);.    sqli
5190: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
51a0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
51b0: 20 63 75 72 72 65 6e 74 5f 64 61 74 65 28 29 0a   current_date().
51c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
51d0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
51e0: 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 64 61  same value as da
51f0: 74 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74  te('now')..*/.st
5200: 61 74 69 63 20 76 6f 69 64 20 63 64 61 74 65 46  atic void cdateF
5210: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
5220: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5230: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5240: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5250: 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
5260: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 73  _value *pVal = s
5270: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
5280: 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a  ;.  if( pVal ){.
5290: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
52a0: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
52b0: 20 22 6e 6f 77 22 2c 20 53 51 4c 49 54 45 5f 55   "now", SQLITE_U
52c0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
52d0: 49 43 29 3b 0a 20 20 20 20 64 61 74 65 46 75 6e  IC);.    dateFun
52e0: 63 28 63 6f 6e 74 65 78 74 2c 20 31 2c 20 26 70  c(context, 1, &p
52f0: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
5300: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
5310: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63  ;.  }.}../*.** c
5320: 75 72 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70  urrent_timestamp
5330: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ().**.** This fu
5340: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5350: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
5360: 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29   datetime('now')
5370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5380: 20 63 74 69 6d 65 73 74 61 6d 70 46 75 6e 63 28   ctimestampFunc(
5390: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
53a0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
53b0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
53c0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
53d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ){.  sqlite3_val
53e0: 75 65 20 2a 70 56 61 6c 20 3d 20 73 71 6c 69 74  ue *pVal = sqlit
53f0: 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20  e3ValueNew();.  
5400: 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20  if( pVal ){.    
5410: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
5420: 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 6e 6f  tr(pVal, -1, "no
5430: 77 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  w", SQLITE_UTF8,
5440: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
5450: 0a 20 20 20 20 64 61 74 65 74 69 6d 65 46 75 6e  .    datetimeFun
5460: 63 28 63 6f 6e 74 65 78 74 2c 20 31 2c 20 26 70  c(context, 1, &p
5470: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
5480: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
5490: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
54a0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
54b0: 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f  E_OMIT_DATETIME_
54c0: 46 55 4e 43 53 29 20 2a 2f 0a 0a 23 69 66 64 65  FUNCS) */..#ifde
54d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41  f SQLITE_OMIT_DA
54e0: 54 45 54 49 4d 45 5f 46 55 4e 43 53 0a 2f 2a 0a  TETIME_FUNCS./*.
54f0: 2a 2a 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  ** If the librar
5500: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  y is compiled to
5510: 20 6f 6d 69 74 20 74 68 65 20 66 75 6c 6c 2d 73   omit the full-s
5520: 63 61 6c 65 20 64 61 74 65 20 61 6e 64 20 74 69  cale date and ti
5530: 6d 65 0a 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 28  me.** handling (
5540: 74 6f 20 67 65 74 20 61 20 73 6d 61 6c 6c 65 72  to get a smaller
5550: 20 62 69 6e 61 72 79 29 2c 20 74 68 65 20 66 6f   binary), the fo
5560: 6c 6c 6f 77 69 6e 67 20 6d 69 6e 69 6d 61 6c 20  llowing minimal 
5570: 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  version.** of th
5580: 65 20 66 75 6e 63 74 69 6f 6e 73 20 63 75 72 72  e functions curr
5590: 65 6e 74 5f 74 69 6d 65 28 29 2c 20 63 75 72 72  ent_time(), curr
55a0: 65 6e 74 5f 64 61 74 65 28 29 20 61 6e 64 20 63  ent_date() and c
55b0: 75 72 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70  urrent_timestamp
55c0: 28 29 0a 2a 2a 20 61 72 65 20 69 6e 63 6c 75 64  ().** are includ
55d0: 65 64 20 69 6e 73 74 65 61 64 2e 20 54 68 69 73  ed instead. This
55e0: 20 69 73 20 74 6f 20 73 75 70 70 6f 72 74 20 63   is to support c
55f0: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
5600: 6e 73 20 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75  ns that.** inclu
5610: 64 65 20 22 44 45 46 41 55 4c 54 20 43 55 52 52  de "DEFAULT CURR
5620: 45 4e 54 5f 54 49 4d 45 22 20 65 74 63 2e 0a 2a  ENT_TIME" etc..*
5630: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5640: 6f 6e 20 75 73 65 73 20 74 68 65 20 43 2d 6c 69  on uses the C-li
5650: 62 72 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20  brary functions 
5660: 74 69 6d 65 28 29 2c 20 6c 6f 63 61 6c 74 69 6d  time(), localtim
5670: 65 5f 72 28 29 0a 2a 2a 20 61 6e 64 20 73 74 72  e_r().** and str
5680: 66 74 69 6d 65 28 29 2e 20 54 68 65 20 66 6f 72  ftime(). The for
5690: 6d 61 74 20 73 74 72 69 6e 67 20 74 6f 20 70 61  mat string to pa
56a0: 73 73 20 74 6f 20 73 74 72 66 74 69 6d 65 28 29  ss to strftime()
56b0: 20 69 73 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20   is supplied.** 
56c0: 61 73 20 74 68 65 20 75 73 65 72 2d 64 61 74 61  as the user-data
56d0: 20 66 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f   for the functio
56e0: 6e 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  n..*/..static vo
56f0: 69 64 20 63 75 72 72 65 6e 74 54 69 6d 65 46 75  id currentTimeFu
5700: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
5710: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
5720: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
5730: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
5740: 67 76 0a 29 7b 0a 20 20 74 69 6d 65 5f 74 20 74  gv.){.  time_t t
5750: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  ;.  char *zForma
5760: 74 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  t = (char *)sqli
5770: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
5780: 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72 20 7a  ntext);.  char z
5790: 42 75 66 5b 32 30 5d 3b 0a 0a 23 69 66 64 65 66  Buf[20];..#ifdef
57a0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f   SQLITE_TEST.  /
57b0: 2a 20 54 68 69 73 20 74 65 73 74 20 76 61 72 69  * This test vari
57c0: 61 62 6c 65 20 69 73 20 6c 6f 63 61 74 65 64 20  able is located 
57d0: 69 6e 20 6f 73 5f 58 58 58 2e 63 20 2a 2f 0a 65  in os_XXX.c */.e
57e0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
57f0: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a  3_current_time;.
5800: 23 65 6e 64 69 66 0a 20 20 74 69 6d 65 28 26 74  #endif.  time(&t
5810: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
5820: 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
5830: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
5840: 20 29 7b 0a 20 20 20 20 74 20 3d 20 73 71 6c 69   ){.    t = sqli
5850: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
5860: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
5870: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
5880: 74 65 78 28 29 3b 0a 20 20 73 74 72 66 74 69 6d  tex();.  strftim
5890: 65 28 7a 42 75 66 2c 20 32 30 2c 20 7a 46 6f 72  e(zBuf, 20, zFor
58a0: 6d 61 74 2c 20 67 6d 74 69 6d 65 28 26 74 29 29  mat, gmtime(&t))
58b0: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4c 65 61  ;.  sqlite3OsLea
58c0: 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 73 71  veMutex();..  sq
58d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
58e0: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c  t(context, zBuf,
58f0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
5900: 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66  SIENT);.}.#endif
5910: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5920: 63 74 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64  ction registered
5930: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
5940: 65 20 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  e C functions as
5950: 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   SQL.** function
5960: 73 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  s.  This should 
5970: 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74  be the only rout
5980: 69 6e 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ine in this file
5990: 20 77 69 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61   with.** externa
59a0: 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f  l linkage..*/.vo
59b0: 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  id sqlite3Regist
59c0: 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69  erDateTimeFuncti
59d0: 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ons(sqlite3 *db)
59e0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
59f0: 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46  _OMIT_DATETIME_F
5a00: 55 4e 43 53 0a 20 20 73 74 61 74 69 63 20 63 6f  UNCS.  static co
5a10: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
5a20: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
5a30: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
5a40: 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29     void (*xFunc)
5a50: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5a60: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
5a70: 6c 75 65 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e  lue**);.  } aFun
5a80: 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  cs[] = {.    { "
5a90: 6a 75 6c 69 61 6e 64 61 79 22 2c 20 2d 31 2c 20  julianday", -1, 
5aa0: 6a 75 6c 69 61 6e 64 61 79 46 75 6e 63 20 20 20  juliandayFunc   
5ab0: 7d 2c 0a 20 20 20 20 7b 20 22 64 61 74 65 22 2c  },.    { "date",
5ac0: 20 20 20 20 20 20 2d 31 2c 20 64 61 74 65 46 75        -1, dateFu
5ad0: 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  nc        },.   
5ae0: 20 7b 20 22 74 69 6d 65 22 2c 20 20 20 20 20 20   { "time",      
5af0: 2d 31 2c 20 74 69 6d 65 46 75 6e 63 20 20 20 20  -1, timeFunc    
5b00: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 61      },.    { "da
5b10: 74 65 74 69 6d 65 22 2c 20 20 2d 31 2c 20 64 61  tetime",  -1, da
5b20: 74 65 74 69 6d 65 46 75 6e 63 20 20 20 20 7d 2c  tetimeFunc    },
5b30: 0a 20 20 20 20 7b 20 22 73 74 72 66 74 69 6d 65  .    { "strftime
5b40: 22 2c 20 20 2d 31 2c 20 73 74 72 66 74 69 6d 65  ",  -1, strftime
5b50: 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b  Func    },.    {
5b60: 20 22 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c   "current_time",
5b70: 20 20 20 20 20 20 20 30 2c 20 63 74 69 6d 65 46         0, ctimeF
5b80: 75 6e 63 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  unc      },.    
5b90: 7b 20 22 63 75 72 72 65 6e 74 5f 74 69 6d 65 73  { "current_times
5ba0: 74 61 6d 70 22 2c 20 20 30 2c 20 63 74 69 6d 65  tamp",  0, ctime
5bb0: 73 74 61 6d 70 46 75 6e 63 20 7d 2c 0a 20 20 20  stampFunc },.   
5bc0: 20 7b 20 22 63 75 72 72 65 6e 74 5f 64 61 74 65   { "current_date
5bd0: 22 2c 20 20 20 20 20 20 20 30 2c 20 63 64 61 74  ",       0, cdat
5be0: 65 46 75 6e 63 20 20 20 20 20 20 7d 2c 0a 20 20  eFunc      },.  
5bf0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  };.  int i;..  f
5c00: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
5c10: 28 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28  (aFuncs)/sizeof(
5c20: 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29  aFuncs[0]); i++)
5c30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
5c40: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
5c50: 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d  , aFuncs[i].zNam
5c60: 65 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72  e, aFuncs[i].nAr
5c70: 67 2c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  g,.        SQLIT
5c80: 45 5f 55 54 46 38 2c 20 30 2c 20 61 46 75 6e 63  E_UTF8, 0, aFunc
5c90: 73 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c 20 30  s[i].xFunc, 0, 0
5ca0: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73  );.  }.#else.  s
5cb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
5cc0: 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
5cd0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 63 68 61 72  zName;.     char
5ce0: 20 2a 7a 46 6f 72 6d 61 74 3b 0a 20 20 7d 20 61   *zFormat;.  } a
5cf0: 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  Funcs[] = {.    
5d00: 7b 20 22 63 75 72 72 65 6e 74 5f 74 69 6d 65 22  { "current_time"
5d10: 2c 20 22 25 48 3a 25 4d 3a 25 53 22 20 7d 2c 0a  , "%H:%M:%S" },.
5d20: 20 20 20 20 7b 20 22 63 75 72 72 65 6e 74 5f 64      { "current_d
5d30: 61 74 65 22 2c 20 22 25 59 2d 25 6d 2d 25 64 22  ate", "%Y-%m-%d"
5d40: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 75 72 72 65   },.    { "curre
5d50: 6e 74 5f 74 69 6d 65 73 74 61 6d 70 22 2c 20 22  nt_timestamp", "
5d60: 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25  %Y-%m-%d %H:%M:%
5d70: 53 22 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  S" }.  };.  int 
5d80: 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  i;..  for(i=0; i
5d90: 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 29 2f  <sizeof(aFuncs)/
5da0: 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b 30 5d  sizeof(aFuncs[0]
5db0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
5dc0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
5dd0: 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73 5b  tion(db, aFuncs[
5de0: 69 5d 2e 7a 4e 61 6d 65 2c 20 30 2c 20 53 51 4c  i].zName, 0, SQL
5df0: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
5e00: 20 20 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 46 6f     aFuncs[i].zFo
5e10: 72 6d 61 74 2c 20 63 75 72 72 65 6e 74 54 69 6d  rmat, currentTim
5e20: 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  eFunc, 0, 0);.  
5e30: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a              }.#endif.}..