/ Hex Artifact Content
Login

Artifact 33a5267827347e106cef2fe001770b6911fcfa3d:


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: 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 65  RegisterDateTime
0230: 46 75 6e 63 74 69 6f 6e 73 28 29 20 66 6f 75 6e  Functions() foun
0240: 64 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  d at the bottom 
0250: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  of the file..** 
0260: 41 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68  All other code h
0270: 61 73 20 66 69 6c 65 20 73 63 6f 70 65 2e 0a 2a  as file scope..*
0280: 2a 0a 2a 2a 20 24 49 64 3a 20 64 61 74 65 2e 63  *.** $Id: date.c
0290: 2c 76 20 31 2e 31 35 20 32 30 30 34 2f 30 32 2f  ,v 1.15 2004/02/
02a0: 32 39 20 30 30 3a 35 30 3a 33 33 20 64 72 68 20  29 00:50:33 drh 
02b0: 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 4e 4f 54 45  Exp $.**.** NOTE
02c0: 53 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  S:.**.** SQLite 
02d0: 70 72 6f 63 65 73 73 65 73 20 61 6c 6c 20 74 69  processes all ti
02e0: 6d 65 73 20 61 6e 64 20 64 61 74 65 73 20 61 73  mes and dates as
02f0: 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
0300: 65 72 73 2e 20 20 54 68 65 0a 2a 2a 20 64 61 74  ers.  The.** dat
0310: 65 73 20 61 6e 64 20 74 69 6d 65 73 20 61 72 65  es and times are
0320: 20 73 74 6f 72 65 64 20 61 73 20 74 68 65 20 6e   stored as the n
0330: 75 6d 62 65 72 20 6f 66 20 64 61 79 73 20 73 69  umber of days si
0340: 6e 63 65 20 6e 6f 6f 6e 0a 2a 2a 20 69 6e 20 47  nce noon.** in G
0350: 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
0360: 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
0370: 43 2e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  C. according to 
0380: 74 68 65 20 47 72 65 67 6f 72 69 61 6e 0a 2a 2a  the Gregorian.**
0390: 20 63 61 6c 65 6e 64 61 72 20 73 79 73 74 65 6d   calendar system
03a0: 2e 0a 2a 2a 0a 2a 2a 20 31 39 37 30 2d 30 31 2d  ..**.** 1970-01-
03b0: 30 31 20 30 30 3a 30 30 3a 30 30 20 69 73 20 4a  01 00:00:00 is J
03c0: 44 20 32 34 34 30 35 38 37 2e 35 0a 2a 2a 20 32  D 2440587.5.** 2
03d0: 30 30 30 2d 30 31 2d 30 31 20 30 30 3a 30 30 3a  000-01-01 00:00:
03e0: 30 30 20 69 73 20 4a 44 20 32 34 35 31 35 34 34  00 is JD 2451544
03f0: 2e 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6d  .5.**.** This im
0400: 70 6c 65 6d 65 6e 74 69 6f 6e 20 72 65 71 75 69  plemention requi
0410: 72 65 73 20 79 65 61 72 73 20 74 6f 20 62 65 20  res years to be 
0420: 65 78 70 72 65 73 73 65 64 20 61 73 20 61 20 34  expressed as a 4
0430: 2d 64 69 67 69 74 20 6e 75 6d 62 65 72 0a 2a 2a  -digit number.**
0440: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
0450: 74 20 6f 6e 6c 79 20 64 61 74 65 73 20 62 65 74  t only dates bet
0460: 77 65 65 6e 20 30 30 30 30 2d 30 31 2d 30 31 20  ween 0000-01-01 
0470: 61 6e 64 20 39 39 39 39 2d 31 32 2d 33 31 20 63  and 9999-12-31 c
0480: 61 6e 0a 2a 2a 20 62 65 20 72 65 70 72 65 73 65  an.** be represe
0490: 6e 74 65 64 2c 20 65 76 65 6e 20 74 68 6f 75 67  nted, even thoug
04a0: 68 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d  h julian day num
04b0: 62 65 72 73 20 61 6c 6c 6f 77 20 61 20 6d 75 63  bers allow a muc
04c0: 68 20 77 69 64 65 72 0a 2a 2a 20 72 61 6e 67 65  h wider.** range
04d0: 20 6f 66 20 64 61 74 65 73 2e 0a 2a 2a 0a 2a 2a   of dates..**.**
04e0: 20 54 68 65 20 47 72 65 67 6f 72 69 61 6e 20 63   The Gregorian c
04f0: 61 6c 65 6e 64 61 72 20 73 79 73 74 65 6d 20 69  alendar system i
0500: 73 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 64  s used for all d
0510: 61 74 65 73 20 61 6e 64 20 74 69 6d 65 73 2c 0a  ates and times,.
0520: 2a 2a 20 65 76 65 6e 20 74 68 6f 73 65 20 74 68  ** even those th
0530: 61 74 20 70 72 65 64 61 74 65 20 74 68 65 20 47  at predate the G
0540: 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
0550: 72 2e 20 20 48 69 73 74 6f 72 69 61 6e 73 20 75  r.  Historians u
0560: 73 75 61 6c 6c 79 0a 2a 2a 20 75 73 65 20 74 68  sually.** use th
0570: 65 20 4a 75 6c 69 61 6e 20 63 61 6c 65 6e 64 61  e Julian calenda
0580: 72 20 66 6f 72 20 64 61 74 65 73 20 70 72 69 6f  r for dates prio
0590: 72 20 74 6f 20 31 35 38 32 2d 31 30 2d 31 35 20  r to 1582-10-15 
05a0: 61 6e 64 20 66 6f 72 20 73 6f 6d 65 0a 2a 2a 20  and for some.** 
05b0: 64 61 74 65 73 20 61 66 74 65 72 77 61 72 64 73  dates afterwards
05c0: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 6c  , depending on l
05d0: 6f 63 61 6c 65 2e 20 20 42 65 77 61 72 65 20 6f  ocale.  Beware o
05e0: 66 20 74 68 69 73 20 64 69 66 66 65 72 65 6e 63  f this differenc
05f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  e..**.** The con
0600: 76 65 72 73 69 6f 6e 20 61 6c 67 6f 72 69 74 68  version algorith
0610: 6d 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  ms are implement
0620: 65 64 20 62 61 73 65 64 20 6f 6e 20 64 65 73 63  ed based on desc
0630: 72 69 70 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74  riptions.** in t
0640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78  he following tex
0650: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 4a 65  t:.**.**      Je
0660: 61 6e 20 4d 65 65 75 73 0a 2a 2a 20 20 20 20 20  an Meeus.**     
0670: 20 41 73 74 72 6f 6e 6f 6d 69 63 61 6c 20 41 6c   Astronomical Al
0680: 67 6f 72 69 74 68 6d 73 2c 20 32 6e 64 20 45 64  gorithms, 2nd Ed
0690: 69 74 69 6f 6e 2c 20 31 39 39 38 0a 2a 2a 20 20  ition, 1998.**  
06a0: 20 20 20 20 49 53 42 4d 20 30 2d 39 34 33 33 39      ISBM 0-94339
06b0: 36 2d 36 31 2d 31 0a 2a 2a 20 20 20 20 20 20 57  6-61-1.**      W
06c0: 69 6c 6c 6d 61 6e 6e 2d 42 65 6c 6c 2c 20 49 6e  illmann-Bell, In
06d0: 63 0a 2a 2a 20 20 20 20 20 20 52 69 63 68 6d 6f  c.**      Richmo
06e0: 6e 64 2c 20 56 69 72 67 69 6e 69 61 20 28 55 53  nd, Virginia (US
06f0: 41 29 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  A).*/.#include "
0700: 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  os.h".#include "
0710: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0720: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0730: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
0740: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  .h>.#include <as
0750: 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
0760: 20 3c 74 69 6d 65 2e 68 3e 0a 0a 23 69 66 6e 64   <time.h>..#ifnd
0770: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0780: 41 54 45 54 49 4d 45 5f 46 55 4e 43 53 0a 0a 2f  ATETIME_FUNCS../
0790: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
07a0: 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 61 20 73   for holding a s
07b0: 69 6e 67 6c 65 20 64 61 74 65 20 61 6e 64 20 74  ingle date and t
07c0: 69 6d 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ime..*/.typedef 
07d0: 73 74 72 75 63 74 20 44 61 74 65 54 69 6d 65 20  struct DateTime 
07e0: 44 61 74 65 54 69 6d 65 3b 0a 73 74 72 75 63 74  DateTime;.struct
07f0: 20 44 61 74 65 54 69 6d 65 20 7b 0a 20 20 64 6f   DateTime {.  do
0800: 75 62 6c 65 20 72 4a 44 3b 20 20 20 20 20 20 2f  uble rJD;      /
0810: 2a 20 54 68 65 20 6a 75 6c 69 61 6e 20 64 61 79  * The julian day
0820: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
0830: 20 59 2c 20 4d 2c 20 44 3b 20 20 20 20 20 2f 2a   Y, M, D;     /*
0840: 20 59 65 61 72 2c 20 6d 6f 6e 74 68 2c 20 61 6e   Year, month, an
0850: 64 20 64 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68  d day */.  int h
0860: 2c 20 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20 48  , m;        /* H
0870: 6f 75 72 20 61 6e 64 20 6d 69 6e 75 74 65 73 20  our and minutes 
0880: 2a 2f 0a 20 20 69 6e 74 20 74 7a 3b 20 20 20 20  */.  int tz;    
0890: 20 20 20 20 20 20 2f 2a 20 54 69 6d 65 7a 6f 6e        /* Timezon
08a0: 65 20 6f 66 66 73 65 74 20 69 6e 20 6d 69 6e 75  e offset in minu
08b0: 74 65 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  tes */.  double 
08c0: 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63  s;        /* Sec
08d0: 6f 6e 64 73 20 2a 2f 0a 20 20 63 68 61 72 20 76  onds */.  char v
08e0: 61 6c 69 64 59 4d 44 3b 20 20 20 2f 2a 20 54 72  alidYMD;   /* Tr
08f0: 75 65 20 69 66 20 59 2c 4d 2c 44 20 61 72 65 20  ue if Y,M,D are 
0900: 76 61 6c 69 64 20 2a 2f 0a 20 20 63 68 61 72 20  valid */.  char 
0910: 76 61 6c 69 64 48 4d 53 3b 20 20 20 2f 2a 20 54  validHMS;   /* T
0920: 72 75 65 20 69 66 20 68 2c 6d 2c 73 20 61 72 65  rue if h,m,s are
0930: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 63 68 61 72   valid */.  char
0940: 20 76 61 6c 69 64 4a 44 3b 20 20 20 20 2f 2a 20   validJD;    /* 
0950: 54 72 75 65 20 69 66 20 72 4a 44 20 69 73 20 76  True if rJD is v
0960: 61 6c 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 76  alid */.  char v
0970: 61 6c 69 64 54 5a 3b 20 20 20 20 2f 2a 20 54 72  alidTZ;    /* Tr
0980: 75 65 20 69 66 20 74 7a 20 69 73 20 76 61 6c 69  ue if tz is vali
0990: 64 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  d */.};.../*.** 
09a0: 43 6f 6e 76 65 72 74 20 7a 44 61 74 65 20 69 6e  Convert zDate in
09b0: 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  to one or more i
09c0: 6e 74 65 67 65 72 73 2e 20 20 41 64 64 69 74 69  ntegers.  Additi
09d0: 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 0a 2a  onal arguments.*
09e0: 2a 20 63 6f 6d 65 20 69 6e 20 67 72 6f 75 70 73  * come in groups
09f0: 20 6f 66 20 35 20 61 73 20 66 6f 6c 6c 6f 77 73   of 5 as follows
0a00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4e 20  :.**.**       N 
0a10: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
0a20: 64 69 67 69 74 73 20 69 6e 20 74 68 65 20 69 6e  digits in the in
0a30: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 6d  teger.**       m
0a40: 69 6e 20 20 20 20 20 6d 69 6e 69 6d 75 6d 20 61  in     minimum a
0a50: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 20 6f 66 20  llowed value of 
0a60: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  the integer.**  
0a70: 20 20 20 20 20 6d 61 78 20 20 20 20 20 6d 61 78       max     max
0a80: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 76 61 6c  imum allowed val
0a90: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
0aa0: 72 0a 2a 2a 20 20 20 20 20 20 20 6e 65 78 74 43  r.**       nextC
0ab0: 20 20 20 66 69 72 73 74 20 63 68 61 72 61 63 74     first charact
0ac0: 65 72 20 61 66 74 65 72 20 74 68 65 20 69 6e 74  er after the int
0ad0: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 70 56  eger.**       pV
0ae0: 61 6c 20 20 20 20 77 68 65 72 65 20 74 6f 20 77  al    where to w
0af0: 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  rite the integer
0b00: 73 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 43  s value..**.** C
0b10: 6f 6e 76 65 72 73 69 6f 6e 73 20 63 6f 6e 74 69  onversions conti
0b20: 6e 75 65 20 75 6e 74 69 6c 20 6f 6e 65 20 77 69  nue until one wi
0b30: 74 68 20 6e 65 78 74 43 3d 3d 30 20 69 73 20 65  th nextC==0 is e
0b40: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 20 54  ncountered..** T
0b50: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
0b60: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
0b70: 66 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 6e  f successful con
0b80: 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  versions..*/.sta
0b90: 74 69 63 20 69 6e 74 20 67 65 74 44 69 67 69 74  tic int getDigit
0ba0: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  s(const char *zD
0bb0: 61 74 65 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  ate, ...){.  va_
0bc0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 76  list ap;.  int v
0bd0: 61 6c 3b 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69  al;.  int N;.  i
0be0: 6e 74 20 6d 69 6e 3b 0a 20 20 69 6e 74 20 6d 61  nt min;.  int ma
0bf0: 78 3b 0a 20 20 69 6e 74 20 6e 65 78 74 43 3b 0a  x;.  int nextC;.
0c00: 20 20 69 6e 74 20 2a 70 56 61 6c 3b 0a 20 20 69    int *pVal;.  i
0c10: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 76 61  nt cnt = 0;.  va
0c20: 5f 73 74 61 72 74 28 61 70 2c 20 7a 44 61 74 65  _start(ap, zDate
0c30: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 4e 20 3d  );.  do{.    N =
0c40: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
0c50: 3b 0a 20 20 20 20 6d 69 6e 20 3d 20 76 61 5f 61  ;.    min = va_a
0c60: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
0c70: 20 6d 61 78 20 3d 20 76 61 5f 61 72 67 28 61 70   max = va_arg(ap
0c80: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 6e 65 78 74  , int);.    next
0c90: 43 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  C = va_arg(ap, i
0ca0: 6e 74 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  nt);.    pVal = 
0cb0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
0cc0: 3b 0a 20 20 20 20 76 61 6c 20 3d 20 30 3b 0a 20  ;.    val = 0;. 
0cd0: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b     while( N-- ){
0ce0: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 64 69  .      if( !isdi
0cf0: 67 69 74 28 2a 7a 44 61 74 65 29 20 29 7b 0a 20  git(*zDate) ){. 
0d00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6e         return cn
0d10: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
0d20: 20 76 61 6c 20 3d 20 76 61 6c 2a 31 30 20 2b 20   val = val*10 + 
0d30: 2a 7a 44 61 74 65 20 2d 20 27 30 27 3b 0a 20 20  *zDate - '0';.  
0d40: 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20      zDate++;.   
0d50: 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c 3c 6d   }.    if( val<m
0d60: 69 6e 20 7c 7c 20 76 61 6c 3e 6d 61 78 20 7c 7c  in || val>max ||
0d70: 20 28 6e 65 78 74 43 21 3d 30 20 26 26 20 6e 65   (nextC!=0 && ne
0d80: 78 74 43 21 3d 2a 7a 44 61 74 65 29 20 29 7b 0a  xtC!=*zDate) ){.
0d90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 6e 74        return cnt
0da0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 56 61  ;.    }.    *pVa
0db0: 6c 20 3d 20 76 61 6c 3b 0a 20 20 20 20 7a 44 61  l = val;.    zDa
0dc0: 74 65 2b 2b 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b  te++;.    cnt++;
0dd0: 0a 20 20 7d 77 68 69 6c 65 28 20 6e 65 78 74 43  .  }while( nextC
0de0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74   );.  return cnt
0df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
0e00: 74 65 78 74 20 66 72 6f 6d 20 7a 5b 5d 20 61 6e  text from z[] an
0e10: 64 20 63 6f 6e 76 65 72 74 20 69 6e 74 6f 20 61  d convert into a
0e20: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
0e30: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
0e40: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
0e50: 20 64 69 67 69 74 73 20 63 6f 6e 76 65 72 74 65   digits converte
0e60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
0e70: 20 67 65 74 56 61 6c 75 65 28 63 6f 6e 73 74 20   getValue(const 
0e80: 63 68 61 72 20 2a 7a 2c 20 64 6f 75 62 6c 65 20  char *z, double 
0e90: 2a 70 52 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *pR){.  const ch
0ea0: 61 72 20 2a 7a 45 6e 64 3b 0a 20 20 2a 70 52 20  ar *zEnd;.  *pR 
0eb0: 3d 20 73 71 6c 69 74 65 41 74 6f 46 28 7a 2c 20  = sqliteAtoF(z, 
0ec0: 26 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e  &zEnd);.  return
0ed0: 20 7a 45 6e 64 20 2d 20 7a 3b 0a 7d 0a 0a 2f 2a   zEnd - z;.}../*
0ee0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 74 69 6d 65  .** Parse a time
0ef0: 7a 6f 6e 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f  zone extension o
0f00: 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 64  n the end of a d
0f10: 61 74 65 2d 74 69 6d 65 2e 0a 2a 2a 20 54 68 65  ate-time..** The
0f20: 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6f 66   extension is of
0f30: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
0f40: 20 20 20 20 20 20 20 20 28 2b 2f 2d 29 48 48 3a          (+/-)HH:
0f50: 4d 4d 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  MM.**.** If the 
0f60: 70 61 72 73 65 20 69 73 20 73 75 63 63 65 73 73  parse is success
0f70: 66 75 6c 2c 20 77 72 69 74 65 20 74 68 65 20 6e  ful, write the n
0f80: 75 6d 62 65 72 20 6f 66 20 6d 69 6e 75 74 65 73  umber of minutes
0f90: 0a 2a 2a 20 6f 66 20 63 68 61 6e 67 65 20 69 6e  .** of change in
0fa0: 20 2a 70 6e 4d 69 6e 20 61 6e 64 20 72 65 74 75   *pnMin and retu
0fb0: 72 6e 20 30 2e 20 20 49 66 20 61 20 70 61 72 73  rn 0.  If a pars
0fc0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
0fd0: 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  .** return 0..**
0fe0: 0a 2a 2a 20 41 20 6d 69 73 73 69 6e 67 20 73 70  .** A missing sp
0ff0: 65 63 69 66 69 65 72 20 69 73 20 6e 6f 74 20 63  ecifier is not c
1000: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
1010: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
1020: 74 20 70 61 72 73 65 54 69 6d 65 7a 6f 6e 65 28  t parseTimezone(
1030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
1040: 65 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b  e, DateTime *p){
1050: 0a 20 20 69 6e 74 20 73 67 6e 20 3d 20 30 3b 0a  .  int sgn = 0;.
1060: 20 20 69 6e 74 20 6e 48 72 2c 20 6e 4d 6e 3b 0a    int nHr, nMn;.
1070: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
1080: 28 2a 7a 44 61 74 65 29 20 29 7b 20 7a 44 61 74  (*zDate) ){ zDat
1090: 65 2b 2b 3b 20 7d 0a 20 20 70 2d 3e 74 7a 20 3d  e++; }.  p->tz =
10a0: 20 30 3b 0a 20 20 69 66 28 20 2a 7a 44 61 74 65   0;.  if( *zDate
10b0: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 73 67 6e  =='-' ){.    sgn
10c0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69   = -1;.  }else i
10d0: 66 28 20 2a 7a 44 61 74 65 3d 3d 27 2b 27 20 29  f( *zDate=='+' )
10e0: 7b 0a 20 20 20 20 73 67 6e 20 3d 20 2b 31 3b 0a  {.    sgn = +1;.
10f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1100: 75 72 6e 20 2a 7a 44 61 74 65 21 3d 30 3b 0a 20  urn *zDate!=0;. 
1110: 20 7d 0a 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20   }.  zDate++;.  
1120: 69 66 28 20 67 65 74 44 69 67 69 74 73 28 7a 44  if( getDigits(zD
1130: 61 74 65 2c 20 32 2c 20 30 2c 20 31 34 2c 20 27  ate, 2, 0, 14, '
1140: 3a 27 2c 20 26 6e 48 72 2c 20 32 2c 20 30 2c 20  :', &nHr, 2, 0, 
1150: 35 39 2c 20 30 2c 20 26 6e 4d 6e 29 21 3d 32 20  59, 0, &nMn)!=2 
1160: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1170: 0a 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b 3d 20  .  }.  zDate += 
1180: 35 3b 0a 20 20 70 2d 3e 74 7a 20 3d 20 73 67 6e  5;.  p->tz = sgn
1190: 2a 28 6e 4d 6e 20 2b 20 6e 48 72 2a 36 30 29 3b  *(nMn + nHr*60);
11a0: 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63  .  while( isspac
11b0: 65 28 2a 7a 44 61 74 65 29 20 29 7b 20 7a 44 61  e(*zDate) ){ zDa
11c0: 74 65 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e  te++; }.  return
11d0: 20 2a 7a 44 61 74 65 21 3d 30 3b 0a 7d 0a 0a 2f   *zDate!=0;.}../
11e0: 2a 0a 2a 2a 20 50 61 72 73 65 20 74 69 6d 65 73  *.** Parse times
11f0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 48 48 3a   of the form HH:
1200: 4d 4d 20 6f 72 20 48 48 3a 4d 4d 3a 53 53 20 6f  MM or HH:MM:SS o
1210: 72 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 46 2e  r HH:MM:SS.FFFF.
1220: 0a 2a 2a 20 54 68 65 20 48 48 2c 20 4d 4d 2c 20  .** The HH, MM, 
1230: 61 6e 64 20 53 53 20 6d 75 73 74 20 65 61 63 68  and SS must each
1240: 20 62 65 20 65 78 61 63 74 6c 79 20 32 20 64 69   be exactly 2 di
1250: 67 69 74 73 2e 20 20 54 68 65 0a 2a 2a 20 66 72  gits.  The.** fr
1260: 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73  actional seconds
1270: 20 46 46 46 46 20 63 61 6e 20 62 65 20 6f 6e 65   FFFF can be one
1280: 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 2e   or more digits.
1290: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
12a0: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 70 61  if there is a pa
12b0: 72 73 69 6e 67 20 65 72 72 6f 72 20 61 6e 64 20  rsing error and 
12c0: 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  0 on success..*/
12d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 73  .static int pars
12e0: 65 48 68 4d 6d 53 73 28 63 6f 6e 73 74 20 63 68  eHhMmSs(const ch
12f0: 61 72 20 2a 7a 44 61 74 65 2c 20 44 61 74 65 54  ar *zDate, DateT
1300: 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68  ime *p){.  int h
1310: 2c 20 6d 2c 20 73 3b 0a 20 20 64 6f 75 62 6c 65  , m, s;.  double
1320: 20 6d 73 20 3d 20 30 2e 30 3b 0a 20 20 69 66 28   ms = 0.0;.  if(
1330: 20 67 65 74 44 69 67 69 74 73 28 7a 44 61 74 65   getDigits(zDate
1340: 2c 20 32 2c 20 30 2c 20 32 34 2c 20 27 3a 27 2c  , 2, 0, 24, ':',
1350: 20 26 68 2c 20 32 2c 20 30 2c 20 35 39 2c 20 30   &h, 2, 0, 59, 0
1360: 2c 20 26 6d 29 21 3d 32 20 29 7b 0a 20 20 20 20  , &m)!=2 ){.    
1370: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1380: 7a 44 61 74 65 20 2b 3d 20 35 3b 0a 20 20 69 66  zDate += 5;.  if
1390: 28 20 2a 7a 44 61 74 65 3d 3d 27 3a 27 20 29 7b  ( *zDate==':' ){
13a0: 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20  .    zDate++;.  
13b0: 20 20 69 66 28 20 67 65 74 44 69 67 69 74 73 28    if( getDigits(
13c0: 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 35 39 2c  zDate, 2, 0, 59,
13d0: 20 30 2c 20 26 73 29 21 3d 31 20 29 7b 0a 20 20   0, &s)!=1 ){.  
13e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
13f0: 20 20 7d 0a 20 20 20 20 7a 44 61 74 65 20 2b 3d    }.    zDate +=
1400: 20 32 3b 0a 20 20 20 20 69 66 28 20 2a 7a 44 61   2;.    if( *zDa
1410: 74 65 3d 3d 27 2e 27 20 26 26 20 69 73 64 69 67  te=='.' && isdig
1420: 69 74 28 7a 44 61 74 65 5b 31 5d 29 20 29 7b 0a  it(zDate[1]) ){.
1430: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 53 63        double rSc
1440: 61 6c 65 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20  ale = 1.0;.     
1450: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20   zDate++;.      
1460: 77 68 69 6c 65 28 20 69 73 64 69 67 69 74 28 2a  while( isdigit(*
1470: 7a 44 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  zDate) ){.      
1480: 20 20 6d 73 20 3d 20 6d 73 2a 31 30 2e 30 20 2b    ms = ms*10.0 +
1490: 20 2a 7a 44 61 74 65 20 2d 20 27 30 27 3b 0a 20   *zDate - '0';. 
14a0: 20 20 20 20 20 20 20 72 53 63 61 6c 65 20 2a 3d         rScale *=
14b0: 20 31 30 2e 30 3b 0a 20 20 20 20 20 20 20 20 7a   10.0;.        z
14c0: 44 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Date++;.      }.
14d0: 20 20 20 20 20 20 6d 73 20 2f 3d 20 72 53 63 61        ms /= rSca
14e0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  le;.    }.  }els
14f0: 65 7b 0a 20 20 20 20 73 20 3d 20 30 3b 0a 20 20  e{.    s = 0;.  
1500: 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d  }.  p->validJD =
1510: 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 48 4d   0;.  p->validHM
1520: 53 20 3d 20 31 3b 0a 20 20 70 2d 3e 68 20 3d 20  S = 1;.  p->h = 
1530: 68 3b 0a 20 20 70 2d 3e 6d 20 3d 20 6d 3b 0a 20  h;.  p->m = m;. 
1540: 20 70 2d 3e 73 20 3d 20 73 20 2b 20 6d 73 3b 0a   p->s = s + ms;.
1550: 20 20 69 66 28 20 70 61 72 73 65 54 69 6d 65 7a    if( parseTimez
1560: 6f 6e 65 28 7a 44 61 74 65 2c 20 70 29 20 29 20  one(zDate, p) ) 
1570: 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 2d 3e 76  return 1;.  p->v
1580: 61 6c 69 64 54 5a 20 3d 20 70 2d 3e 74 7a 21 3d  alidTZ = p->tz!=
1590: 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  0;.  return 0;.}
15a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
15b0: 66 72 6f 6d 20 59 59 59 59 2d 4d 4d 2d 44 44 20  from YYYY-MM-DD 
15c0: 48 48 3a 4d 4d 3a 53 53 20 74 6f 20 6a 75 6c 69  HH:MM:SS to juli
15d0: 61 6e 20 64 61 79 2e 20 20 57 65 20 61 6c 77 61  an day.  We alwa
15e0: 79 73 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61  ys assume.** tha
15f0: 74 20 74 68 65 20 59 59 59 59 2d 4d 4d 2d 44 44  t the YYYY-MM-DD
1600: 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   is according to
1610: 20 74 68 65 20 47 72 65 67 6f 72 69 61 6e 20 63   the Gregorian c
1620: 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 52  alendar..**.** R
1630: 65 66 65 72 65 6e 63 65 3a 20 20 4d 65 65 75 73  eference:  Meeus
1640: 20 70 61 67 65 20 36 31 0a 2a 2f 0a 73 74 61 74   page 61.*/.stat
1650: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4a  ic void computeJ
1660: 44 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a  D(DateTime *p){.
1670: 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c 20 41    int Y, M, D, A
1680: 2c 20 42 2c 20 58 31 2c 20 58 32 3b 0a 0a 20 20  , B, X1, X2;..  
1690: 69 66 28 20 70 2d 3e 76 61 6c 69 64 4a 44 20 29  if( p->validJD )
16a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
16b0: 2d 3e 76 61 6c 69 64 59 4d 44 20 29 7b 0a 20 20  ->validYMD ){.  
16c0: 20 20 59 20 3d 20 70 2d 3e 59 3b 0a 20 20 20 20    Y = p->Y;.    
16d0: 4d 20 3d 20 70 2d 3e 4d 3b 0a 20 20 20 20 44 20  M = p->M;.    D 
16e0: 3d 20 70 2d 3e 44 3b 0a 20 20 7d 65 6c 73 65 7b  = p->D;.  }else{
16f0: 0a 20 20 20 20 59 20 3d 20 32 30 30 30 3b 20 20  .    Y = 2000;  
1700: 2f 2a 20 49 66 20 6e 6f 20 59 4d 44 20 73 70 65  /* If no YMD spe
1710: 63 69 66 69 65 64 2c 20 61 73 73 75 6d 65 20 32  cified, assume 2
1720: 30 30 30 2d 4a 61 6e 2d 30 31 20 2a 2f 0a 20 20  000-Jan-01 */.  
1730: 20 20 4d 20 3d 20 31 3b 0a 20 20 20 20 44 20 3d    M = 1;.    D =
1740: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 3c   1;.  }.  if( M<
1750: 3d 32 20 29 7b 0a 20 20 20 20 59 2d 2d 3b 0a 20  =2 ){.    Y--;. 
1760: 20 20 20 4d 20 2b 3d 20 31 32 3b 0a 20 20 7d 0a     M += 12;.  }.
1770: 20 20 41 20 3d 20 59 2f 31 30 30 3b 0a 20 20 42    A = Y/100;.  B
1780: 20 3d 20 32 20 2d 20 41 20 2b 20 28 41 2f 34 29   = 2 - A + (A/4)
1790: 3b 0a 20 20 58 31 20 3d 20 33 36 35 2e 32 35 2a  ;.  X1 = 365.25*
17a0: 28 59 2b 34 37 31 36 29 3b 0a 20 20 58 32 20 3d  (Y+4716);.  X2 =
17b0: 20 33 30 2e 36 30 30 31 2a 28 4d 2b 31 29 3b 0a   30.6001*(M+1);.
17c0: 20 20 70 2d 3e 72 4a 44 20 3d 20 58 31 20 2b 20    p->rJD = X1 + 
17d0: 58 32 20 2b 20 44 20 2b 20 42 20 2d 20 31 35 32  X2 + D + B - 152
17e0: 34 2e 35 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 4a  4.5;.  p->validJ
17f0: 44 20 3d 20 31 3b 0a 20 20 70 2d 3e 76 61 6c 69  D = 1;.  p->vali
1800: 64 59 4d 44 20 3d 20 30 3b 0a 20 20 69 66 28 20  dYMD = 0;.  if( 
1810: 70 2d 3e 76 61 6c 69 64 48 4d 53 20 29 7b 0a 20  p->validHMS ){. 
1820: 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 28 70 2d     p->rJD += (p-
1830: 3e 68 2a 33 36 30 30 2e 30 20 2b 20 70 2d 3e 6d  >h*3600.0 + p->m
1840: 2a 36 30 2e 30 20 2b 20 70 2d 3e 73 29 2f 38 36  *60.0 + p->s)/86
1850: 34 30 30 2e 30 3b 0a 20 20 20 20 69 66 28 20 70  400.0;.    if( p
1860: 2d 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20 20 20  ->validTZ ){.   
1870: 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 70 2d 3e     p->rJD += p->
1880: 74 7a 2a 36 30 2f 38 36 34 30 30 2e 30 3b 0a 20  tz*60/86400.0;. 
1890: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53       p->validHMS
18a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76   = 0;.      p->v
18b0: 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 20 20  alidTZ = 0;.    
18c0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  }.  }.}../*.** P
18d0: 61 72 73 65 20 64 61 74 65 73 20 6f 66 20 74 68  arse dates of th
18e0: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
18f0: 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d   YYYY-MM-DD HH:M
1900: 4d 3a 53 53 2e 46 46 46 0a 2a 2a 20 20 20 20 20  M:SS.FFF.**     
1910: 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d  YYYY-MM-DD HH:MM
1920: 3a 53 53 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d  :SS.**     YYYY-
1930: 4d 4d 2d 44 44 20 48 48 3a 4d 4d 0a 2a 2a 20 20  MM-DD HH:MM.**  
1940: 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 0a 2a 2a     YYYY-MM-DD.**
1950: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 72 65  .** Write the re
1960: 73 75 6c 74 20 69 6e 74 6f 20 74 68 65 20 44 61  sult into the Da
1970: 74 65 54 69 6d 65 20 73 74 72 75 63 74 75 72 65  teTime structure
1980: 20 61 6e 64 20 72 65 74 75 72 6e 20 30 0a 2a 2a   and return 0.**
1990: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
19a0: 31 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 73  1 if the input s
19b0: 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 61 20 77  tring is not a w
19c0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 64 61  ell-formed.** da
19d0: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
19e0: 74 20 70 61 72 73 65 59 79 79 79 4d 6d 44 64 28  t parseYyyyMmDd(
19f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
1a00: 65 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b  e, DateTime *p){
1a10: 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c 20  .  int Y, M, D, 
1a20: 6e 65 67 3b 0a 0a 20 20 69 66 28 20 7a 44 61 74  neg;..  if( zDat
1a30: 65 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  e[0]=='-' ){.   
1a40: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 6e 65   zDate++;.    ne
1a50: 67 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 1;.  }else{.
1a60: 20 20 20 20 6e 65 67 20 3d 20 30 3b 0a 20 20 7d      neg = 0;.  }
1a70: 0a 20 20 69 66 28 20 67 65 74 44 69 67 69 74 73  .  if( getDigits
1a80: 28 7a 44 61 74 65 2c 34 2c 30 2c 39 39 39 39 2c  (zDate,4,0,9999,
1a90: 27 2d 27 2c 26 59 2c 32 2c 31 2c 31 32 2c 27 2d  '-',&Y,2,1,12,'-
1aa0: 27 2c 26 4d 2c 32 2c 31 2c 33 31 2c 30 2c 26 44  ',&M,2,1,31,0,&D
1ab0: 29 21 3d 33 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=3 ){.    retu
1ac0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 7a 44 61 74  rn 1;.  }.  zDat
1ad0: 65 20 2b 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65  e += 10;.  while
1ae0: 28 20 69 73 73 70 61 63 65 28 2a 7a 44 61 74 65  ( isspace(*zDate
1af0: 29 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d 0a  ) ){ zDate++; }.
1b00: 20 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53    if( parseHhMmS
1b10: 73 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30 20 29  s(zDate, p)==0 )
1b20: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 67 6f 74 20  {.    /* We got 
1b30: 74 68 65 20 74 69 6d 65 20 2a 2f 0a 20 20 7d 65  the time */.  }e
1b40: 6c 73 65 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d  lse if( *zDate==
1b50: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 76 61 6c 69  0 ){.    p->vali
1b60: 64 48 4d 53 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  dHMS = 0;.  }els
1b70: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
1b80: 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a  .  }.  p->validJ
1b90: 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69  D = 0;.  p->vali
1ba0: 64 59 4d 44 20 3d 20 31 3b 0a 20 20 70 2d 3e 59  dYMD = 1;.  p->Y
1bb0: 20 3d 20 6e 65 67 20 3f 20 2d 59 20 3a 20 59 3b   = neg ? -Y : Y;
1bc0: 0a 20 20 70 2d 3e 4d 20 3d 20 4d 3b 0a 20 20 70  .  p->M = M;.  p
1bd0: 2d 3e 44 20 3d 20 44 3b 0a 20 20 69 66 28 20 70  ->D = D;.  if( p
1be0: 2d 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20 20 20  ->validTZ ){.   
1bf0: 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20   computeJD(p);. 
1c00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1c10: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1c20: 74 6f 20 70 61 72 73 65 20 74 68 65 20 67 69 76  to parse the giv
1c30: 65 6e 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61  en string into a
1c40: 20 4a 75 6c 69 61 6e 20 44 61 79 20 4e 75 6d 62   Julian Day Numb
1c50: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  er.  Return.** t
1c60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1c70: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ors..**.** The f
1c80: 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 61 63 63  ollowing are acc
1c90: 65 70 74 61 62 6c 65 20 66 6f 72 6d 73 20 66 6f  eptable forms fo
1ca0: 72 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  r the input stri
1cb0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59  ng:.**.**      Y
1cc0: 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a  YYY-MM-DD HH:MM:
1cd0: 53 53 2e 46 46 46 20 20 2b 2f 2d 48 48 3a 4d 4d  SS.FFF  +/-HH:MM
1ce0: 0a 2a 2a 20 20 20 20 20 20 44 44 44 44 2e 44 44  .**      DDDD.DD
1cf0: 20 0a 2a 2a 20 20 20 20 20 20 6e 6f 77 0a 2a 2a   .**      now.**
1d00: 0a 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74  .** In the first
1d10: 20 66 6f 72 6d 2c 20 74 68 65 20 2b 2f 2d 48 48   form, the +/-HH
1d20: 3a 4d 4d 20 69 73 20 61 6c 77 61 79 73 20 6f 70  :MM is always op
1d30: 74 69 6f 6e 61 6c 2e 20 20 54 68 65 20 66 72 61  tional.  The fra
1d40: 63 74 69 6f 6e 61 6c 0a 2a 2a 20 73 65 63 6f 6e  ctional.** secon
1d50: 64 73 20 65 78 74 65 6e 73 69 6f 6e 20 28 74 68  ds extension (th
1d60: 65 20 22 2e 46 46 46 22 29 20 69 73 20 6f 70 74  e ".FFF") is opt
1d70: 69 6f 6e 61 6c 2e 20 20 54 68 65 20 73 65 63 6f  ional.  The seco
1d80: 6e 64 73 20 70 6f 72 74 69 6f 6e 0a 2a 2a 20 28  nds portion.** (
1d90: 22 3a 53 53 2e 46 46 46 22 29 20 69 73 20 6f 70  ":SS.FFF") is op
1da0: 74 69 6f 6e 2e 20 20 54 68 65 20 79 65 61 72 20  tion.  The year 
1db0: 61 6e 64 20 64 61 74 65 20 63 61 6e 20 62 65 20  and date can be 
1dc0: 6f 6d 69 74 74 65 64 20 61 73 20 6c 6f 6e 67 0a  omitted as long.
1dd0: 2a 2a 20 61 73 20 74 68 65 72 65 20 69 73 20 61  ** as there is a
1de0: 20 74 69 6d 65 20 73 74 72 69 6e 67 2e 20 20 54   time string.  T
1df0: 68 65 20 74 69 6d 65 20 73 74 72 69 6e 67 20 63  he time string c
1e00: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61 73  an be omitted as
1e10: 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 74 68 65 72   long.** as ther
1e20: 65 20 69 73 20 61 20 79 65 61 72 20 61 6e 64 20  e is a year and 
1e30: 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  date..*/.static 
1e40: 69 6e 74 20 70 61 72 73 65 44 61 74 65 4f 72 54  int parseDateOrT
1e50: 69 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ime(const char *
1e60: 7a 44 61 74 65 2c 20 44 61 74 65 54 69 6d 65 20  zDate, DateTime 
1e70: 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
1e80: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
1e90: 0a 20 20 69 66 28 20 70 61 72 73 65 59 79 79 79  .  if( parseYyyy
1ea0: 4d 6d 44 64 28 7a 44 61 74 65 2c 70 29 3d 3d 30  MmDd(zDate,p)==0
1eb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1ec0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 61  ;.  }else if( pa
1ed0: 72 73 65 48 68 4d 6d 53 73 28 7a 44 61 74 65 2c  rseHhMmSs(zDate,
1ee0: 20 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   p)==0 ){.    re
1ef0: 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20  turn 0;.  }else 
1f00: 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d  if( sqliteStrICm
1f10: 70 28 7a 44 61 74 65 2c 22 6e 6f 77 22 29 3d 3d  p(zDate,"now")==
1f20: 30 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  0){.    double r
1f30: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1f40: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 26 72  OsCurrentTime(&r
1f50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
1f60: 3e 72 4a 44 20 3d 20 72 3b 0a 20 20 20 20 20 20  >rJD = r;.      
1f70: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a  p->validJD = 1;.
1f80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1f90: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1fa0: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
1fb0: 73 71 6c 69 74 65 49 73 4e 75 6d 62 65 72 28 7a  sqliteIsNumber(z
1fc0: 44 61 74 65 29 20 29 7b 0a 20 20 20 20 70 2d 3e  Date) ){.    p->
1fd0: 72 4a 44 20 3d 20 73 71 6c 69 74 65 41 74 6f 46  rJD = sqliteAtoF
1fe0: 28 7a 44 61 74 65 2c 20 30 29 3b 0a 20 20 20 20  (zDate, 0);.    
1ff0: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a  p->validJD = 1;.
2000: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2010: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2020: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
2030: 68 65 20 59 65 61 72 2c 20 4d 6f 6e 74 68 2c 20  he Year, Month, 
2040: 61 6e 64 20 44 61 79 20 66 72 6f 6d 20 74 68 65  and Day from the
2050: 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62   julian day numb
2060: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
2070: 69 64 20 63 6f 6d 70 75 74 65 59 4d 44 28 44 61  id computeYMD(Da
2080: 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  teTime *p){.  in
2090: 74 20 5a 2c 20 41 2c 20 42 2c 20 43 2c 20 44 2c  t Z, A, B, C, D,
20a0: 20 45 2c 20 58 31 3b 0a 20 20 69 66 28 20 70 2d   E, X1;.  if( p-
20b0: 3e 76 61 6c 69 64 59 4d 44 20 29 20 72 65 74 75  >validYMD ) retu
20c0: 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 76 61  rn;.  if( !p->va
20d0: 6c 69 64 4a 44 20 29 7b 0a 20 20 20 20 70 2d 3e  lidJD ){.    p->
20e0: 59 20 3d 20 32 30 30 30 3b 0a 20 20 20 20 70 2d  Y = 2000;.    p-
20f0: 3e 4d 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 44  >M = 1;.    p->D
2100: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
2110: 20 20 20 5a 20 3d 20 70 2d 3e 72 4a 44 20 2b 20     Z = p->rJD + 
2120: 30 2e 35 3b 0a 20 20 20 20 41 20 3d 20 28 5a 20  0.5;.    A = (Z 
2130: 2d 20 31 38 36 37 32 31 36 2e 32 35 29 2f 33 36  - 1867216.25)/36
2140: 35 32 34 2e 32 35 3b 0a 20 20 20 20 41 20 3d 20  524.25;.    A = 
2150: 5a 20 2b 20 31 20 2b 20 41 20 2d 20 28 41 2f 34  Z + 1 + A - (A/4
2160: 29 3b 0a 20 20 20 20 42 20 3d 20 41 20 2b 20 31  );.    B = A + 1
2170: 35 32 34 3b 0a 20 20 20 20 43 20 3d 20 28 42 20  524;.    C = (B 
2180: 2d 20 31 32 32 2e 31 29 2f 33 36 35 2e 32 35 3b  - 122.1)/365.25;
2190: 0a 20 20 20 20 44 20 3d 20 33 36 35 2e 32 35 2a  .    D = 365.25*
21a0: 43 3b 0a 20 20 20 20 45 20 3d 20 28 42 2d 44 29  C;.    E = (B-D)
21b0: 2f 33 30 2e 36 30 30 31 3b 0a 20 20 20 20 58 31  /30.6001;.    X1
21c0: 20 3d 20 33 30 2e 36 30 30 31 2a 45 3b 0a 20 20   = 30.6001*E;.  
21d0: 20 20 70 2d 3e 44 20 3d 20 42 20 2d 20 44 20 2d    p->D = B - D -
21e0: 20 58 31 3b 0a 20 20 20 20 70 2d 3e 4d 20 3d 20   X1;.    p->M = 
21f0: 45 3c 31 34 20 3f 20 45 2d 31 20 3a 20 45 2d 31  E<14 ? E-1 : E-1
2200: 33 3b 0a 20 20 20 20 70 2d 3e 59 20 3d 20 70 2d  3;.    p->Y = p-
2210: 3e 4d 3e 32 20 3f 20 43 20 2d 20 34 37 31 36 20  >M>2 ? C - 4716 
2220: 3a 20 43 20 2d 20 34 37 31 35 3b 0a 20 20 7d 0a  : C - 4715;.  }.
2230: 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d 20    p->validYMD = 
2240: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  1;.}../*.** Comp
2250: 75 74 65 20 74 68 65 20 48 6f 75 72 2c 20 4d 69  ute the Hour, Mi
2260: 6e 75 74 65 2c 20 61 6e 64 20 53 65 63 6f 6e 64  nute, and Second
2270: 73 20 66 72 6f 6d 20 74 68 65 20 6a 75 6c 69 61  s from the julia
2280: 6e 20 64 61 79 20 6e 75 6d 62 65 72 2e 0a 2a 2f  n day number..*/
2290: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
22a0: 70 75 74 65 48 4d 53 28 44 61 74 65 54 69 6d 65  puteHMS(DateTime
22b0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 5a 2c 20 73   *p){.  int Z, s
22c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64  ;.  if( p->valid
22d0: 48 4d 53 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  HMS ) return;.  
22e0: 5a 20 3d 20 70 2d 3e 72 4a 44 20 2b 20 30 2e 35  Z = p->rJD + 0.5
22f0: 3b 0a 20 20 73 20 3d 20 28 70 2d 3e 72 4a 44 20  ;.  s = (p->rJD 
2300: 2b 20 30 2e 35 20 2d 20 5a 29 2a 38 36 34 30 30  + 0.5 - Z)*86400
2310: 30 30 30 2e 30 20 2b 20 30 2e 35 3b 0a 20 20 70  000.0 + 0.5;.  p
2320: 2d 3e 73 20 3d 20 30 2e 30 30 31 2a 73 3b 0a 20  ->s = 0.001*s;. 
2330: 20 73 20 3d 20 70 2d 3e 73 3b 0a 20 20 70 2d 3e   s = p->s;.  p->
2340: 73 20 2d 3d 20 73 3b 0a 20 20 70 2d 3e 68 20 3d  s -= s;.  p->h =
2350: 20 73 2f 33 36 30 30 3b 0a 20 20 73 20 2d 3d 20   s/3600;.  s -= 
2360: 70 2d 3e 68 2a 33 36 30 30 3b 0a 20 20 70 2d 3e  p->h*3600;.  p->
2370: 6d 20 3d 20 73 2f 36 30 3b 0a 20 20 70 2d 3e 73  m = s/60;.  p->s
2380: 20 2b 3d 20 73 20 2d 20 70 2d 3e 6d 2a 36 30 3b   += s - p->m*60;
2390: 0a 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d  .  p->validHMS =
23a0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
23b0: 70 75 74 65 20 62 6f 74 68 20 59 4d 44 20 61 6e  pute both YMD an
23c0: 64 20 48 4d 53 0a 2a 2f 0a 73 74 61 74 69 63 20  d HMS.*/.static 
23d0: 76 6f 69 64 20 63 6f 6d 70 75 74 65 59 4d 44 5f  void computeYMD_
23e0: 48 4d 53 28 44 61 74 65 54 69 6d 65 20 2a 70 29  HMS(DateTime *p)
23f0: 7b 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 28 70  {.  computeYMD(p
2400: 29 3b 0a 20 20 63 6f 6d 70 75 74 65 48 4d 53 28  );.  computeHMS(
2410: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  p);.}../*.** Cle
2420: 61 72 20 74 68 65 20 59 4d 44 20 61 6e 64 20 48  ar the YMD and H
2430: 4d 53 20 61 6e 64 20 74 68 65 20 54 5a 0a 2a 2f  MS and the TZ.*/
2440: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
2450: 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 44 61 74  arYMD_HMS_TZ(Dat
2460: 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  eTime *p){.  p->
2470: 76 61 6c 69 64 59 4d 44 20 3d 20 30 3b 0a 20 20  validYMD = 0;.  
2480: 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 30 3b  p->validHMS = 0;
2490: 0a 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20  .  p->validTZ = 
24a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0;.}../*.** Comp
24b0: 75 74 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ute the differen
24c0: 63 65 20 28 69 6e 20 64 61 79 73 29 20 62 65 74  ce (in days) bet
24d0: 77 65 65 6e 20 6c 6f 63 61 6c 74 69 6d 65 20 61  ween localtime a
24e0: 6e 64 20 55 54 43 20 28 61 2e 6b 2e 61 2e 20 47  nd UTC (a.k.a. G
24f0: 4d 54 29 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74  MT).** for the t
2500: 69 6d 65 20 76 61 6c 75 65 20 70 20 77 68 65 72  ime value p wher
2510: 65 20 70 20 69 73 20 69 6e 20 55 54 43 2e 0a 2a  e p is in UTC..*
2520: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
2530: 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28  localtimeOffset(
2540: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
2550: 44 61 74 65 54 69 6d 65 20 78 2c 20 79 3b 0a 20  DateTime x, y;. 
2560: 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 73 74 72   time_t t;.  str
2570: 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20 20 78  uct tm *pTm;.  x
2580: 20 3d 20 2a 70 3b 0a 20 20 63 6f 6d 70 75 74 65   = *p;.  compute
2590: 59 4d 44 5f 48 4d 53 28 26 78 29 3b 0a 20 20 69  YMD_HMS(&x);.  i
25a0: 66 28 20 78 2e 59 3c 31 39 37 31 20 7c 7c 20 78  f( x.Y<1971 || x
25b0: 2e 59 3e 3d 32 30 33 38 20 29 7b 0a 20 20 20 20  .Y>=2038 ){.    
25c0: 78 2e 59 20 3d 20 32 30 30 30 3b 0a 20 20 20 20  x.Y = 2000;.    
25d0: 78 2e 4d 20 3d 20 31 3b 0a 20 20 20 20 78 2e 44  x.M = 1;.    x.D
25e0: 20 3d 20 31 3b 0a 20 20 20 20 78 2e 68 20 3d 20   = 1;.    x.h = 
25f0: 30 3b 0a 20 20 20 20 78 2e 6d 20 3d 20 30 3b 0a  0;.    x.m = 0;.
2600: 20 20 20 20 78 2e 73 20 3d 20 30 2e 30 3b 0a 20      x.s = 0.0;. 
2610: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 6e   } else {.    in
2620: 74 20 73 20 3d 20 78 2e 73 20 2b 20 30 2e 35 3b  t s = x.s + 0.5;
2630: 0a 20 20 20 20 78 2e 73 20 3d 20 73 3b 0a 20 20  .    x.s = s;.  
2640: 7d 0a 20 20 78 2e 74 7a 20 3d 20 30 3b 0a 20 20  }.  x.tz = 0;.  
2650: 78 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20  x.validJD = 0;. 
2660: 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 29 3b 0a   computeJD(&x);.
2670: 20 20 74 20 3d 20 28 78 2e 72 4a 44 2d 32 34 34    t = (x.rJD-244
2680: 30 35 38 37 2e 35 29 2a 38 36 34 30 30 2e 30 20  0587.5)*86400.0 
2690: 2b 20 30 2e 35 3b 0a 20 20 73 71 6c 69 74 65 4f  + 0.5;.  sqliteO
26a0: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
26b0: 20 70 54 6d 20 3d 20 6c 6f 63 61 6c 74 69 6d 65   pTm = localtime
26c0: 28 26 74 29 3b 0a 20 20 79 2e 59 20 3d 20 70 54  (&t);.  y.Y = pT
26d0: 6d 2d 3e 74 6d 5f 79 65 61 72 20 2b 20 31 39 30  m->tm_year + 190
26e0: 30 3b 0a 20 20 79 2e 4d 20 3d 20 70 54 6d 2d 3e  0;.  y.M = pTm->
26f0: 74 6d 5f 6d 6f 6e 20 2b 20 31 3b 0a 20 20 79 2e  tm_mon + 1;.  y.
2700: 44 20 3d 20 70 54 6d 2d 3e 74 6d 5f 6d 64 61 79  D = pTm->tm_mday
2710: 3b 0a 20 20 79 2e 68 20 3d 20 70 54 6d 2d 3e 74  ;.  y.h = pTm->t
2720: 6d 5f 68 6f 75 72 3b 0a 20 20 79 2e 6d 20 3d 20  m_hour;.  y.m = 
2730: 70 54 6d 2d 3e 74 6d 5f 6d 69 6e 3b 0a 20 20 79  pTm->tm_min;.  y
2740: 2e 73 20 3d 20 70 54 6d 2d 3e 74 6d 5f 73 65 63  .s = pTm->tm_sec
2750: 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76  ;.  sqliteOsLeav
2760: 65 4d 75 74 65 78 28 29 3b 0a 20 20 79 2e 76 61  eMutex();.  y.va
2770: 6c 69 64 59 4d 44 20 3d 20 31 3b 0a 20 20 79 2e  lidYMD = 1;.  y.
2780: 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 20 20  validHMS = 1;.  
2790: 79 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20  y.validJD = 0;. 
27a0: 20 79 2e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a   y.validTZ = 0;.
27b0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 79 29 3b    computeJD(&y);
27c0: 0a 20 20 72 65 74 75 72 6e 20 79 2e 72 4a 44 20  .  return y.rJD 
27d0: 2d 20 78 2e 72 4a 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  - x.rJD;.}../*.*
27e0: 2a 20 50 72 6f 63 65 73 73 20 61 20 6d 6f 64 69  * Process a modi
27f0: 66 69 65 72 20 74 6f 20 61 20 64 61 74 65 2d 74  fier to a date-t
2800: 69 6d 65 20 73 74 61 6d 70 2e 20 20 54 68 65 20  ime stamp.  The 
2810: 6d 6f 64 69 66 69 65 72 73 20 61 72 65 0a 2a 2a  modifiers are.**
2820: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2830: 2a 2a 20 20 20 20 20 4e 4e 4e 20 64 61 79 73 0a  **     NNN days.
2840: 2a 2a 20 20 20 20 20 4e 4e 4e 20 68 6f 75 72 73  **     NNN hours
2850: 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 6d 69 6e 75  .**     NNN minu
2860: 74 65 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 2e 4e  tes.**     NNN.N
2870: 4e 4e 4e 20 73 65 63 6f 6e 64 73 0a 2a 2a 20 20  NNN seconds.**  
2880: 20 20 20 4e 4e 4e 20 6d 6f 6e 74 68 73 0a 2a 2a     NNN months.**
2890: 20 20 20 20 20 4e 4e 4e 20 79 65 61 72 73 0a 2a       NNN years.*
28a0: 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 6d  *     start of m
28b0: 6f 6e 74 68 0a 2a 2a 20 20 20 20 20 73 74 61 72  onth.**     star
28c0: 74 20 6f 66 20 79 65 61 72 0a 2a 2a 20 20 20 20  t of year.**    
28d0: 20 73 74 61 72 74 20 6f 66 20 77 65 65 6b 0a 2a   start of week.*
28e0: 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 64  *     start of d
28f0: 61 79 0a 2a 2a 20 20 20 20 20 77 65 65 6b 64 61  ay.**     weekda
2900: 79 20 4e 0a 2a 2a 20 20 20 20 20 75 6e 69 78 65  y N.**     unixe
2910: 70 6f 63 68 0a 2a 2a 20 20 20 20 20 6c 6f 63 61  poch.**     loca
2920: 6c 74 69 6d 65 0a 2a 2a 20 20 20 20 20 75 74 63  ltime.**     utc
2930: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
2940: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 31  on success and 1
2950: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
2960: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 2e 0a   kind of error..
2970: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2980: 72 73 65 4d 6f 64 69 66 69 65 72 28 63 6f 6e 73  rseModifier(cons
2990: 74 20 63 68 61 72 20 2a 7a 4d 6f 64 2c 20 44 61  t char *zMod, Da
29a0: 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  teTime *p){.  in
29b0: 74 20 72 63 20 3d 20 31 3b 0a 20 20 69 6e 74 20  t rc = 1;.  int 
29c0: 6e 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  n;.  double r;. 
29d0: 20 63 68 61 72 20 2a 7a 2c 20 7a 42 75 66 5b 33   char *z, zBuf[3
29e0: 30 5d 3b 0a 20 20 7a 20 3d 20 7a 42 75 66 3b 0a  0];.  z = zBuf;.
29f0: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 73 69 7a    for(n=0; n<siz
2a00: 65 6f 66 28 7a 42 75 66 29 2d 31 20 26 26 20 7a  eof(zBuf)-1 && z
2a10: 4d 6f 64 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20 20  Mod[n]; n++){.  
2a20: 20 20 7a 5b 6e 5d 20 3d 20 74 6f 6c 6f 77 65 72    z[n] = tolower
2a30: 28 7a 4d 6f 64 5b 6e 5d 29 3b 0a 20 20 7d 0a 20  (zMod[n]);.  }. 
2a40: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 77 69   z[n] = 0;.  swi
2a50: 74 63 68 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20  tch( z[0] ){.   
2a60: 20 63 61 73 65 20 27 6c 27 3a 20 7b 0a 20 20 20   case 'l': {.   
2a70: 20 20 20 2f 2a 20 20 20 20 6c 6f 63 61 6c 74 69     /*    localti
2a80: 6d 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  me.      **.    
2a90: 20 20 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68    ** Assuming th
2aa0: 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 76  e current time v
2ab0: 61 6c 75 65 20 69 73 20 55 54 43 20 28 61 2e 6b  alue is UTC (a.k
2ac0: 2e 61 2e 20 47 4d 54 29 2c 20 73 68 69 66 74 20  .a. GMT), shift 
2ad0: 69 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  it to.      ** s
2ae0: 68 6f 77 20 6c 6f 63 61 6c 20 74 69 6d 65 2e 0a  how local time..
2af0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2b00: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 6c 6f  f( strcmp(z, "lo
2b10: 63 61 6c 74 69 6d 65 22 29 3d 3d 30 20 29 7b 0a  caltime")==0 ){.
2b20: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
2b30: 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  D(p);.        p-
2b40: 3e 72 4a 44 20 2b 3d 20 6c 6f 63 61 6c 74 69 6d  >rJD += localtim
2b50: 65 4f 66 66 73 65 74 28 70 29 3b 0a 20 20 20 20  eOffset(p);.    
2b60: 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53      clearYMD_HMS
2b70: 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20  _TZ(p);.        
2b80: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  rc = 0;.      }.
2b90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ba0: 20 7d 0a 20 20 20 20 63 61 73 65 20 27 75 27 3a   }.    case 'u':
2bb0: 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20   {.      /*.    
2bc0: 20 20 2a 2a 20 20 20 20 75 6e 69 78 65 70 6f 63    **    unixepoc
2bd0: 68 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  h.      **.     
2be0: 20 2a 2a 20 54 72 65 61 74 20 74 68 65 20 63 75   ** Treat the cu
2bf0: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
2c00: 2d 3e 72 4a 44 20 61 73 20 74 68 65 20 6e 75 6d  ->rJD as the num
2c10: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ber of.      ** 
2c20: 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
2c30: 37 30 2e 20 20 43 6f 6e 76 65 72 74 20 74 6f 20  70.  Convert to 
2c40: 61 20 72 65 61 6c 20 6a 75 6c 69 61 6e 20 64 61  a real julian da
2c50: 79 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20  y number..      
2c60: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  */.      if( str
2c70: 63 6d 70 28 7a 2c 20 22 75 6e 69 78 65 70 6f 63  cmp(z, "unixepoc
2c80: 68 22 29 3d 3d 30 20 26 26 20 70 2d 3e 76 61 6c  h")==0 && p->val
2c90: 69 64 4a 44 20 29 7b 0a 20 20 20 20 20 20 20 20  idJD ){.        
2ca0: 70 2d 3e 72 4a 44 20 3d 20 70 2d 3e 72 4a 44 2f  p->rJD = p->rJD/
2cb0: 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38  86400.0 + 244058
2cc0: 37 2e 35 3b 0a 20 20 20 20 20 20 20 20 63 6c 65  7.5;.        cle
2cd0: 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b  arYMD_HMS_TZ(p);
2ce0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b  .        rc = 0;
2cf0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2d00: 20 73 74 72 63 6d 70 28 7a 2c 20 22 75 74 63 22   strcmp(z, "utc"
2d10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2d20: 64 6f 75 62 6c 65 20 63 31 3b 0a 20 20 20 20 20  double c1;.     
2d30: 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b     computeJD(p);
2d40: 0a 20 20 20 20 20 20 20 20 63 31 20 3d 20 6c 6f  .        c1 = lo
2d50: 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 29  caltimeOffset(p)
2d60: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 4a 44  ;.        p->rJD
2d70: 20 2d 3d 20 63 31 3b 0a 20 20 20 20 20 20 20 20   -= c1;.        
2d80: 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28  clearYMD_HMS_TZ(
2d90: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  p);.        p->r
2da0: 4a 44 20 2b 3d 20 63 31 20 2d 20 6c 6f 63 61 6c  JD += c1 - local
2db0: 74 69 6d 65 4f 66 66 73 65 74 28 70 29 3b 0a 20  timeOffset(p);. 
2dc0: 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
2dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2de0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2df0: 73 65 20 27 77 27 3a 20 7b 0a 20 20 20 20 20 20  se 'w': {.      
2e00: 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 77  /*.      **    w
2e10: 65 65 6b 64 61 79 20 4e 0a 20 20 20 20 20 20 2a  eekday N.      *
2e20: 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20  *.      ** Move 
2e30: 74 68 65 20 64 61 74 65 20 74 6f 20 74 68 65 20  the date to the 
2e40: 73 61 6d 65 20 74 69 6d 65 20 6f 6e 20 74 68 65  same time on the
2e50: 20 6e 65 78 74 20 6f 63 63 75 72 72 61 6e 63 65   next occurrance
2e60: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 65 65   of.      ** wee
2e70: 6b 64 61 79 20 4e 20 77 68 65 72 65 20 30 3d 3d  kday N where 0==
2e80: 53 75 6e 64 61 79 2c 20 31 3d 3d 4d 6f 6e 64 61  Sunday, 1==Monda
2e90: 79 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  y, and so forth.
2ea0: 20 20 49 66 20 74 68 65 0a 20 20 20 20 20 20 2a    If the.      *
2eb0: 2a 20 64 61 74 65 20 69 73 20 61 6c 72 65 61 64  * date is alread
2ec0: 79 20 6f 6e 20 74 68 65 20 61 70 70 72 6f 70 72  y on the appropr
2ed0: 69 61 74 65 20 77 65 65 6b 64 61 79 2c 20 74 68  iate weekday, th
2ee0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
2ef0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2f00: 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 77 65  ( strncmp(z, "we
2f10: 65 6b 64 61 79 20 22 2c 20 38 29 3d 3d 30 20 26  ekday ", 8)==0 &
2f20: 26 20 67 65 74 56 61 6c 75 65 28 26 7a 5b 38 5d  & getValue(&z[8]
2f30: 2c 26 72 29 3e 30 0a 20 20 20 20 20 20 20 20 20  ,&r)>0.         
2f40: 20 20 20 20 20 20 20 20 26 26 20 28 6e 3d 72 29          && (n=r)
2f50: 3d 3d 72 20 26 26 20 6e 3e 3d 30 20 26 26 20 72  ==r && n>=0 && r
2f60: 3c 37 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  <7 ){.        in
2f70: 74 20 5a 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  t Z;.        com
2f80: 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a  puteYMD_HMS(p);.
2f90: 20 20 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64          p->valid
2fa0: 54 5a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  TZ = 0;.        
2fb0: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a  p->validJD = 0;.
2fc0: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
2fd0: 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20 5a 20  D(p);.        Z 
2fe0: 3d 20 70 2d 3e 72 4a 44 20 2b 20 31 2e 35 3b 0a  = p->rJD + 1.5;.
2ff0: 20 20 20 20 20 20 20 20 5a 20 25 3d 20 37 3b 0a          Z %= 7;.
3000: 20 20 20 20 20 20 20 20 69 66 28 20 5a 3e 6e 20          if( Z>n 
3010: 29 20 5a 20 2d 3d 20 37 3b 0a 20 20 20 20 20 20  ) Z -= 7;.      
3020: 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 6e 20 2d 20    p->rJD += n - 
3030: 5a 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72  Z;.        clear
3040: 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20  YMD_HMS_TZ(p);. 
3050: 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
3060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3070: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3080: 73 65 20 27 73 27 3a 20 7b 0a 20 20 20 20 20 20  se 's': {.      
3090: 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 73  /*.      **    s
30a0: 74 61 72 74 20 6f 66 20 54 54 54 54 54 0a 20 20  tart of TTTTT.  
30b0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
30c0: 4d 6f 76 65 20 74 68 65 20 64 61 74 65 20 62 61  Move the date ba
30d0: 63 6b 77 61 72 64 73 20 74 6f 20 74 68 65 20 62  ckwards to the b
30e0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
30f0: 63 75 72 72 65 6e 74 20 64 61 79 2c 0a 20 20 20  current day,.   
3100: 20 20 20 2a 2a 20 6f 72 20 6d 6f 6e 74 68 20 6f     ** or month o
3110: 72 20 79 65 61 72 2e 0a 20 20 20 20 20 20 2a 2f  r year..      */
3120: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
3130: 6d 70 28 7a 2c 20 22 73 74 61 72 74 20 6f 66 20  mp(z, "start of 
3140: 22 2c 20 39 29 21 3d 30 20 29 20 62 72 65 61 6b  ", 9)!=0 ) break
3150: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 39 3b 0a  ;.      z += 9;.
3160: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44        computeYMD
3170: 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61  (p);.      p->va
3180: 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 20 20 20 20  lidHMS = 1;.    
3190: 20 20 70 2d 3e 68 20 3d 20 70 2d 3e 6d 20 3d 20    p->h = p->m = 
31a0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 73 20 3d 20  0;.      p->s = 
31b0: 30 2e 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61  0.0;.      p->va
31c0: 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 20 20 20  lidTZ = 0;.     
31d0: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b   p->validJD = 0;
31e0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
31f0: 70 28 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d 30 20  p(z,"month")==0 
3200: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 44 20  ){.        p->D 
3210: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
3220: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
3230: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 79   if( strcmp(z,"y
3240: 65 61 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ear")==0 ){.    
3250: 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 28 70      computeYMD(p
3260: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 4d 20  );.        p->M 
3270: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
3280: 44 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  D = 1;.        r
3290: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 0;.      }el
32a0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
32b0: 22 64 61 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "day")==0 ){.   
32c0: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
32d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
32e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
32f0: 20 27 2b 27 3a 0a 20 20 20 20 63 61 73 65 20 27   '+':.    case '
3300: 2d 27 3a 0a 20 20 20 20 63 61 73 65 20 27 30 27  -':.    case '0'
3310: 3a 0a 20 20 20 20 63 61 73 65 20 27 31 27 3a 0a  :.    case '1':.
3320: 20 20 20 20 63 61 73 65 20 27 32 27 3a 0a 20 20      case '2':.  
3330: 20 20 63 61 73 65 20 27 33 27 3a 0a 20 20 20 20    case '3':.    
3340: 63 61 73 65 20 27 34 27 3a 0a 20 20 20 20 63 61  case '4':.    ca
3350: 73 65 20 27 35 27 3a 0a 20 20 20 20 63 61 73 65  se '5':.    case
3360: 20 27 36 27 3a 0a 20 20 20 20 63 61 73 65 20 27   '6':.    case '
3370: 37 27 3a 0a 20 20 20 20 63 61 73 65 20 27 38 27  7':.    case '8'
3380: 3a 0a 20 20 20 20 63 61 73 65 20 27 39 27 3a 20  :.    case '9': 
3390: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 67 65 74 56  {.      n = getV
33a0: 61 6c 75 65 28 7a 2c 20 26 72 29 3b 0a 20 20 20  alue(z, &r);.   
33b0: 20 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 62 72     if( n<=0 ) br
33c0: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  eak;.      if( z
33d0: 5b 6e 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20  [n]==':' ){.    
33e0: 20 20 20 20 2f 2a 20 41 20 6d 6f 64 69 66 69 65      /* A modifie
33f0: 72 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 2b  r of the form (+
3400: 7c 2d 29 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 20  |-)HH:MM:SS.FFF 
3410: 61 64 64 73 20 28 6f 72 20 73 75 62 74 72 61 63  adds (or subtrac
3420: 74 73 29 20 74 68 65 0a 20 20 20 20 20 20 20 20  ts) the.        
3430: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
3440: 62 65 72 20 6f 66 20 68 6f 75 72 73 2c 20 6d 69  ber of hours, mi
3450: 6e 75 74 65 73 2c 20 73 65 63 6f 6e 64 73 2c 20  nutes, seconds, 
3460: 61 6e 64 20 66 72 61 63 74 69 6f 6e 61 6c 20 73  and fractional s
3470: 65 63 6f 6e 64 73 0a 20 20 20 20 20 20 20 20 2a  econds.        *
3480: 2a 20 74 6f 20 74 68 65 20 74 69 6d 65 2e 20 20  * to the time.  
3490: 54 68 65 20 22 2e 46 46 46 22 20 6d 61 79 20 62  The ".FFF" may b
34a0: 65 20 6f 6d 69 74 74 65 64 2e 20 20 54 68 65 20  e omitted.  The 
34b0: 22 3a 53 53 2e 46 46 46 22 20 6d 61 79 20 62 65  ":SS.FFF" may be
34c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6d 69 74  .        ** omit
34d0: 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
34e0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
34f0: 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 20 20  ar *z2 = z;.    
3500: 20 20 20 20 44 61 74 65 54 69 6d 65 20 74 78 3b      DateTime tx;
3510: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64 61 79  .        int day
3520: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 69  ;.        if( !i
3530: 73 64 69 67 69 74 28 2a 7a 32 29 20 29 20 7a 32  sdigit(*z2) ) z2
3540: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ++;.        mems
3550: 65 74 28 26 74 78 2c 20 30 2c 20 73 69 7a 65 6f  et(&tx, 0, sizeo
3560: 66 28 74 78 29 29 3b 0a 20 20 20 20 20 20 20 20  f(tx));.        
3570: 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73 28  if( parseHhMmSs(
3580: 7a 32 2c 20 26 74 78 29 20 29 20 62 72 65 61 6b  z2, &tx) ) break
3590: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
35a0: 65 4a 44 28 26 74 78 29 3b 0a 20 20 20 20 20 20  eJD(&tx);.      
35b0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a    computeJD(p);.
35c0: 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44          clearYMD
35d0: 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20  _HMS_TZ(p);.    
35e0: 20 20 20 20 64 61 79 20 3d 20 28 69 6e 74 29 74      day = (int)t
35f0: 78 2e 72 4a 44 3b 0a 20 20 20 20 20 20 20 20 74  x.rJD;.        t
3600: 78 2e 72 4a 44 20 2d 3d 20 64 61 79 3b 0a 20 20  x.rJD -= day;.  
3610: 20 20 20 20 20 20 74 78 2e 72 4a 44 20 2d 3d 20        tx.rJD -= 
3620: 30 2e 35 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0.5;.        if(
3630: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 74 78 2e   z[0]=='-' ) tx.
3640: 72 4a 44 20 3d 20 2d 74 78 2e 72 4a 44 3b 0a 20  rJD = -tx.rJD;. 
3650: 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d         p->rJD +=
3660: 20 74 78 2e 72 4a 44 3b 0a 20 20 20 20 20 20 20   tx.rJD;.       
3670: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   rc = 0;.       
3680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3690: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 3b 0a 20 20        z += n;.  
36a0: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
36b0: 63 65 28 7a 5b 30 5d 29 20 29 20 7a 2b 2b 3b 0a  ce(z[0]) ) z++;.
36c0: 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
36d0: 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  (z);.      if( n
36e0: 3e 31 30 20 7c 7c 20 6e 3c 33 20 29 20 62 72 65  >10 || n<3 ) bre
36f0: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ak;.      if( z[
3700: 6e 2d 31 5d 3d 3d 27 73 27 20 29 7b 20 7a 5b 6e  n-1]=='s' ){ z[n
3710: 2d 31 5d 20 3d 20 30 3b 20 6e 2d 2d 3b 20 7d 0a  -1] = 0; n--; }.
3720: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28        computeJD(
3730: 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  p);.      rc = 0
3740: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 33  ;.      if( n==3
3750: 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 64 61   && strcmp(z,"da
3760: 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
3770: 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 72 3b 0a 20    p->rJD += r;. 
3780: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
3790: 3d 3d 34 20 26 26 20 73 74 72 63 6d 70 28 7a 2c  ==4 && strcmp(z,
37a0: 22 68 6f 75 72 22 29 3d 3d 30 20 29 7b 0a 20 20  "hour")==0 ){.  
37b0: 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20        p->rJD += 
37c0: 72 2f 32 34 2e 30 3b 0a 20 20 20 20 20 20 7d 65  r/24.0;.      }e
37d0: 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20 26 26 20  lse if( n==6 && 
37e0: 73 74 72 63 6d 70 28 7a 2c 22 6d 69 6e 75 74 65  strcmp(z,"minute
37f0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
3800: 20 70 2d 3e 72 4a 44 20 2b 3d 20 72 2f 28 32 34   p->rJD += r/(24
3810: 2e 30 2a 36 30 2e 30 29 3b 0a 20 20 20 20 20 20  .0*60.0);.      
3820: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20 26  }else if( n==6 &
3830: 26 20 73 74 72 63 6d 70 28 7a 2c 22 73 65 63 6f  & strcmp(z,"seco
3840: 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nd")==0 ){.     
3850: 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 72 2f 28     p->rJD += r/(
3860: 32 34 2e 30 2a 36 30 2e 30 2a 36 30 2e 30 29 3b  24.0*60.0*60.0);
3870: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
3880: 20 6e 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28   n==5 && strcmp(
3890: 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d 30 20 29 7b  z,"month")==0 ){
38a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 2c 20  .        int x, 
38b0: 79 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  y;.        compu
38c0: 74 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a 20 20  teYMD_HMS(p);.  
38d0: 20 20 20 20 20 20 70 2d 3e 4d 20 2b 3d 20 72 3b        p->M += r;
38e0: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 70 2d 3e  .        x = p->
38f0: 4d 3e 30 20 3f 20 28 70 2d 3e 4d 2d 31 29 2f 31  M>0 ? (p->M-1)/1
3900: 32 20 3a 20 28 70 2d 3e 4d 2d 31 32 29 2f 31 32  2 : (p->M-12)/12
3910: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 59 20 2b  ;.        p->Y +
3920: 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = x;.        p->
3930: 4d 20 2d 3d 20 78 2a 31 32 3b 0a 20 20 20 20 20  M -= x*12;.     
3940: 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20     p->validJD = 
3950: 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  0;.        compu
3960: 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 20  teJD(p);.       
3970: 20 79 20 3d 20 72 3b 0a 20 20 20 20 20 20 20 20   y = r;.        
3980: 69 66 28 20 79 21 3d 72 20 29 7b 0a 20 20 20 20  if( y!=r ){.    
3990: 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20        p->rJD += 
39a0: 28 72 20 2d 20 79 29 2a 33 30 2e 30 3b 0a 20 20  (r - y)*30.0;.  
39b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
39c0: 6c 73 65 20 69 66 28 20 6e 3d 3d 34 20 26 26 20  lse if( n==4 && 
39d0: 73 74 72 63 6d 70 28 7a 2c 22 79 65 61 72 22 29  strcmp(z,"year")
39e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
39f0: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29  omputeYMD_HMS(p)
3a00: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 59 20 2b  ;.        p->Y +
3a10: 3d 20 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = r;.        p->
3a20: 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20  validJD = 0;.   
3a30: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
3a40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3a50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
3a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
3a70: 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29  earYMD_HMS_TZ(p)
3a80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3a90: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
3aa0: 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
3ab0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3ac0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3ad0: 20 50 72 6f 63 65 73 73 20 74 69 6d 65 20 66 75   Process time fu
3ae0: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
3af0: 2e 20 20 61 72 67 76 5b 30 5d 20 69 73 20 61 20  .  argv[0] is a 
3b00: 64 61 74 65 2d 74 69 6d 65 20 73 74 61 6d 70 2e  date-time stamp.
3b10: 0a 2a 2a 20 61 72 67 76 5b 31 5d 20 61 6e 64 20  .** argv[1] and 
3b20: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6d 6f  following are mo
3b30: 64 69 66 69 65 72 73 2e 20 20 50 61 72 73 65 20  difiers.  Parse 
3b40: 74 68 65 6d 20 61 6c 6c 20 61 6e 64 20 77 72 69  them all and wri
3b50: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
3b60: 69 6e 67 20 74 69 6d 65 20 69 6e 74 6f 20 74 68  ing time into th
3b70: 65 20 44 61 74 65 54 69 6d 65 20 73 74 72 75 63  e DateTime struc
3b80: 74 75 72 65 20 70 2e 20 20 52 65 74 75 72 6e 20  ture p.  Return 
3b90: 30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  0.** on success 
3ba0: 61 6e 64 20 31 20 69 66 20 74 68 65 72 65 20 61  and 1 if there a
3bb0: 72 65 20 61 6e 79 20 65 72 72 6f 72 73 2e 0a 2a  re any errors..*
3bc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44  /.static int isD
3bd0: 61 74 65 28 69 6e 74 20 61 72 67 63 2c 20 63 6f  ate(int argc, co
3be0: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  nst char **argv,
3bf0: 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20   DateTime *p){. 
3c00: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72   int i;.  if( ar
3c10: 67 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  gc==0 ) return 1
3c20: 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 3d  ;.  if( argv[0]=
3c30: 3d 30 20 7c 7c 20 70 61 72 73 65 44 61 74 65 4f  =0 || parseDateO
3c40: 72 54 69 6d 65 28 61 72 67 76 5b 30 5d 2c 20 70  rTime(argv[0], p
3c50: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
3c60: 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b  for(i=1; i<argc;
3c70: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
3c80: 72 67 76 5b 69 5d 3d 3d 30 20 7c 7c 20 70 61 72  rgv[i]==0 || par
3c90: 73 65 4d 6f 64 69 66 69 65 72 28 61 72 67 76 5b  seModifier(argv[
3ca0: 69 5d 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20  i], p) ) return 
3cb0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3cc0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  0;.}.../*.** The
3cd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
3ce0: 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
3cf0: 65 20 76 61 72 69 6f 75 73 20 64 61 74 65 20 61  e various date a
3d00: 6e 64 20 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e  nd time function
3d10: 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 2e 0a  s.** of SQLite..
3d20: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 6a 75 6c  */../*.**    jul
3d30: 69 61 6e 64 61 79 28 20 54 49 4d 45 53 54 52 49  ianday( TIMESTRI
3d40: 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e  NG, MOD, MOD, ..
3d50: 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .).**.** Return 
3d60: 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e  the julian day n
3d70: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 64 61 74  umber of the dat
3d80: 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
3d90: 68 65 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a  he arguments.*/.
3da0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 75 6c 69  static void juli
3db0: 61 6e 64 61 79 46 75 6e 63 28 73 71 6c 69 74 65  andayFunc(sqlite
3dc0: 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74 2c 20  _func *context, 
3dd0: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
3de0: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
3df0: 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20 69 66  DateTime x;.  if
3e00: 28 20 69 73 44 61 74 65 28 61 72 67 63 2c 20 61  ( isDate(argc, a
3e10: 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20  rgv, &x)==0 ){. 
3e20: 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 29     computeJD(&x)
3e30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 73 65 74  ;.    sqlite_set
3e40: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
3e50: 6f 6e 74 65 78 74 2c 20 78 2e 72 4a 44 29 3b 0a  ontext, x.rJD);.
3e60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20    }.}../*.**    
3e70: 64 61 74 65 74 69 6d 65 28 20 54 49 4d 45 53 54  datetime( TIMEST
3e80: 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20  RING, MOD, MOD, 
3e90: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ...).**.** Retur
3ea0: 6e 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a  n YYYY-MM-DD HH:
3eb0: 4d 4d 3a 53 53 0a 2a 2f 0a 73 74 61 74 69 63 20  MM:SS.*/.static 
3ec0: 76 6f 69 64 20 64 61 74 65 74 69 6d 65 46 75 6e  void datetimeFun
3ed0: 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a 63  c(sqlite_func *c
3ee0: 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63  ontext, int argc
3ef0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61  , const char **a
3f00: 72 67 76 29 7b 0a 20 20 44 61 74 65 54 69 6d 65  rgv){.  DateTime
3f10: 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61 74 65   x;.  if( isDate
3f20: 28 61 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29  (argc, argv, &x)
3f30: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
3f40: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63  zBuf[100];.    c
3f50: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78  omputeYMD_HMS(&x
3f60: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
3f70: 42 75 66 2c 20 22 25 30 34 64 2d 25 30 32 64 2d  Buf, "%04d-%02d-
3f80: 25 30 32 64 20 25 30 32 64 3a 25 30 32 64 3a 25  %02d %02d:%02d:%
3f90: 30 32 64 22 2c 78 2e 59 2c 20 78 2e 4d 2c 20 78  02d",x.Y, x.M, x
3fa0: 2e 44 2c 20 78 2e 68 2c 20 78 2e 6d 2c 0a 20 20  .D, x.h, x.m,.  
3fb0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 78           (int)(x
3fc0: 2e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  .s));.    sqlite
3fd0: 5f 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69  _set_result_stri
3fe0: 6e 67 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  ng(context, zBuf
3ff0: 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  , -1);.  }.}../*
4000: 0a 2a 2a 20 20 20 20 74 69 6d 65 28 20 54 49 4d  .**    time( TIM
4010: 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f  ESTRING, MOD, MO
4020: 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65  D, ...).**.** Re
4030: 74 75 72 6e 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2f  turn HH:MM:SS.*/
4040: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 69 6d  .static void tim
4050: 65 46 75 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e  eFunc(sqlite_fun
4060: 63 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20  c *context, int 
4070: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
4080: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 44 61 74 65   **argv){.  Date
4090: 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20 69 73  Time x;.  if( is
40a0: 44 61 74 65 28 61 72 67 63 2c 20 61 72 67 76 2c  Date(argc, argv,
40b0: 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63   &x)==0 ){.    c
40c0: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
40d0: 20 20 20 63 6f 6d 70 75 74 65 48 4d 53 28 26 78     computeHMS(&x
40e0: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
40f0: 42 75 66 2c 20 22 25 30 32 64 3a 25 30 32 64 3a  Buf, "%02d:%02d:
4100: 25 30 32 64 22 2c 20 78 2e 68 2c 20 78 2e 6d 2c  %02d", x.h, x.m,
4110: 20 28 69 6e 74 29 78 2e 73 29 3b 0a 20 20 20 20   (int)x.s);.    
4120: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
4130: 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65 78 74  t_string(context
4140: 2c 20 7a 42 75 66 2c 20 2d 31 29 3b 0a 20 20 7d  , zBuf, -1);.  }
4150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64 61 74  .}../*.**    dat
4160: 65 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d  e( TIMESTRING, M
4170: 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a  OD, MOD, ...).**
4180: 0a 2a 2a 20 52 65 74 75 72 6e 20 59 59 59 59 2d  .** Return YYYY-
4190: 4d 4d 2d 44 44 0a 2a 2f 0a 73 74 61 74 69 63 20  MM-DD.*/.static 
41a0: 76 6f 69 64 20 64 61 74 65 46 75 6e 63 28 73 71  void dateFunc(sq
41b0: 6c 69 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65  lite_func *conte
41c0: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  xt, int argc, co
41d0: 6e 73 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29  nst char **argv)
41e0: 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a  {.  DateTime x;.
41f0: 20 20 69 66 28 20 69 73 44 61 74 65 28 61 72 67    if( isDate(arg
4200: 63 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d 30 20  c, argv, &x)==0 
4210: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
4220: 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6d 70 75  [100];.    compu
4230: 74 65 59 4d 44 28 26 78 29 3b 0a 20 20 20 20 73  teYMD(&x);.    s
4240: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 30  printf(zBuf, "%0
4250: 34 64 2d 25 30 32 64 2d 25 30 32 64 22 2c 20 78  4d-%02d-%02d", x
4260: 2e 59 2c 20 78 2e 4d 2c 20 78 2e 44 29 3b 0a 20  .Y, x.M, x.D);. 
4270: 20 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65     sqlite_set_re
4280: 73 75 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74  sult_string(cont
4290: 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 29 3b 0a  ext, zBuf, -1);.
42a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20    }.}../*.**    
42b0: 73 74 72 66 74 69 6d 65 28 20 46 4f 52 4d 41 54  strftime( FORMAT
42c0: 2c 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f  , TIMESTRING, MO
42d0: 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a  D, MOD, ...).**.
42e0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69  ** Return a stri
42f0: 6e 67 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ng described by 
4300: 46 4f 52 4d 41 54 2e 20 20 43 6f 6e 76 65 72 73  FORMAT.  Convers
4310: 69 6f 6e 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ions as follows:
4320: 0a 2a 2a 0a 2a 2a 20 20 20 25 64 20 20 64 61 79  .**.**   %d  day
4330: 20 6f 66 20 6d 6f 6e 74 68 0a 2a 2a 20 20 20 25   of month.**   %
4340: 66 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 61 6c  f  ** fractional
4350: 20 73 65 63 6f 6e 64 73 20 20 53 53 2e 53 53 53   seconds  SS.SSS
4360: 0a 2a 2a 20 20 20 25 48 20 20 68 6f 75 72 20 30  .**   %H  hour 0
4370: 30 2d 32 34 0a 2a 2a 20 20 20 25 6a 20 20 64 61  0-24.**   %j  da
4380: 79 20 6f 66 20 79 65 61 72 20 30 30 30 2d 33 36  y of year 000-36
4390: 36 0a 2a 2a 20 20 20 25 4a 20 20 2a 2a 20 4a 75  6.**   %J  ** Ju
43a0: 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 0a  lian day number.
43b0: 2a 2a 20 20 20 25 6d 20 20 6d 6f 6e 74 68 20 30  **   %m  month 0
43c0: 31 2d 31 32 0a 2a 2a 20 20 20 25 4d 20 20 6d 69  1-12.**   %M  mi
43d0: 6e 75 74 65 20 30 30 2d 35 39 0a 2a 2a 20 20 20  nute 00-59.**   
43e0: 25 73 20 20 73 65 63 6f 6e 64 73 20 73 69 6e 63  %s  seconds sinc
43f0: 65 20 31 39 37 30 2d 30 31 2d 30 31 0a 2a 2a 20  e 1970-01-01.** 
4400: 20 20 25 53 20 20 73 65 63 6f 6e 64 73 20 30 30    %S  seconds 00
4410: 2d 35 39 0a 2a 2a 20 20 20 25 77 20 20 64 61 79  -59.**   %w  day
4420: 20 6f 66 20 77 65 65 6b 20 30 2d 36 20 20 73 75   of week 0-6  su
4430: 6e 64 61 79 3d 3d 30 0a 2a 2a 20 20 20 25 57 20  nday==0.**   %W 
4440: 20 77 65 65 6b 20 6f 66 20 79 65 61 72 20 30 30   week of year 00
4450: 2d 35 33 0a 2a 2a 20 20 20 25 59 20 20 79 65 61  -53.**   %Y  yea
4460: 72 20 30 30 30 30 2d 39 39 39 39 0a 2a 2a 20 20  r 0000-9999.**  
4470: 20 25 25 20 20 25 0a 2a 2f 0a 73 74 61 74 69 63   %%  %.*/.static
4480: 20 76 6f 69 64 20 73 74 72 66 74 69 6d 65 46 75   void strftimeFu
4490: 6e 63 28 73 71 6c 69 74 65 5f 66 75 6e 63 20 2a  nc(sqlite_func *
44a0: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
44b0: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  c, const char **
44c0: 61 72 67 76 29 7b 0a 20 20 44 61 74 65 54 69 6d  argv){.  DateTim
44d0: 65 20 78 3b 0a 20 20 69 6e 74 20 6e 2c 20 69 2c  e x;.  int n, i,
44e0: 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   j;.  char *z;. 
44f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
4500: 74 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 63  t = argv[0];.  c
4510: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
4520: 20 69 66 28 20 61 72 67 76 5b 30 5d 3d 3d 30 20   if( argv[0]==0 
4530: 7c 7c 20 69 73 44 61 74 65 28 61 72 67 63 2d 31  || isDate(argc-1
4540: 2c 20 61 72 67 76 2b 31 2c 20 26 78 29 20 29 20  , argv+1, &x) ) 
4550: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
4560: 30 2c 20 6e 3d 31 3b 20 7a 46 6d 74 5b 69 5d 3b  0, n=1; zFmt[i];
4570: 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20 20 20 20   i++, n++){.    
4580: 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27 25 27  if( zFmt[i]=='%'
4590: 20 29 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68   ){.      switch
45a0: 28 20 7a 46 6d 74 5b 69 2b 31 5d 20 29 7b 0a 20  ( zFmt[i+1] ){. 
45b0: 20 20 20 20 20 20 20 63 61 73 65 20 27 64 27 3a         case 'd':
45c0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 48  .        case 'H
45d0: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
45e0: 27 6d 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73  'm':.        cas
45f0: 65 20 27 4d 27 3a 0a 20 20 20 20 20 20 20 20 63  e 'M':.        c
4600: 61 73 65 20 27 53 27 3a 0a 20 20 20 20 20 20 20  ase 'S':.       
4610: 20 63 61 73 65 20 27 57 27 3a 0a 20 20 20 20 20   case 'W':.     
4620: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
4630: 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75      /* fall thru
4640: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65   */.        case
4650: 20 27 77 27 3a 0a 20 20 20 20 20 20 20 20 63 61   'w':.        ca
4660: 73 65 20 27 25 27 3a 0a 20 20 20 20 20 20 20 20  se '%':.        
4670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4680: 20 63 61 73 65 20 27 66 27 3a 0a 20 20 20 20 20   case 'f':.     
4690: 20 20 20 20 20 6e 20 2b 3d 20 38 3b 0a 20 20 20       n += 8;.   
46a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
46b0: 20 20 20 20 20 20 63 61 73 65 20 27 6a 27 3a 0a        case 'j':.
46c0: 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 33            n += 3
46d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
46e0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
46f0: 27 59 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e  'Y':.          n
4700: 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 20   += 8;.         
4710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4720: 63 61 73 65 20 27 73 27 3a 0a 20 20 20 20 20 20  case 's':.      
4730: 20 20 63 61 73 65 20 27 4a 27 3a 0a 20 20 20 20    case 'J':.    
4740: 20 20 20 20 20 20 6e 20 2b 3d 20 35 30 3b 0a 20        n += 50;. 
4750: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4760: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
4770: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
4780: 6e 3b 20 20 2f 2a 20 45 52 52 4f 52 2e 20 20 72  n;  /* ERROR.  r
4790: 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20 2a 2f 0a  eturn a NULL */.
47a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 2b        }.      i+
47b0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
47c0: 66 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42 75 66  f( n<sizeof(zBuf
47d0: 29 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 42 75  ) ){.    z = zBu
47e0: 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
47f0: 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  z = sqliteMalloc
4800: 28 20 6e 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ( n );.    if( z
4810: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4820: 7d 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78  }.  computeJD(&x
4830: 29 3b 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f  );.  computeYMD_
4840: 48 4d 53 28 26 78 29 3b 0a 20 20 66 6f 72 28 69  HMS(&x);.  for(i
4850: 3d 6a 3d 30 3b 20 7a 46 6d 74 5b 69 5d 3b 20 69  =j=0; zFmt[i]; i
4860: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6d  ++){.    if( zFm
4870: 74 5b 69 5d 21 3d 27 25 27 20 29 7b 0a 20 20 20  t[i]!='%' ){.   
4880: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 46 6d 74     z[j++] = zFmt
4890: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
48a0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
48b0: 20 73 77 69 74 63 68 28 20 7a 46 6d 74 5b 69 5d   switch( zFmt[i]
48c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
48d0: 20 27 64 27 3a 20 20 73 70 72 69 6e 74 66 28 26   'd':  sprintf(&
48e0: 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 44 29  z[j],"%02d",x.D)
48f0: 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20  ; j+=2; break;. 
4900: 20 20 20 20 20 20 20 63 61 73 65 20 27 66 27 3a         case 'f':
4910: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
4920: 20 73 20 3d 20 78 2e 73 3b 0a 20 20 20 20 20 20   s = x.s;.      
4930: 20 20 20 20 69 6e 74 20 6d 73 20 3d 20 28 78 2e      int ms = (x.
4940: 73 20 2d 20 73 29 2a 31 30 30 30 2e 30 3b 0a 20  s - s)*1000.0;. 
4950: 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66           sprintf
4960: 28 26 7a 5b 6a 5d 2c 22 25 30 32 64 2e 25 30 33  (&z[j],"%02d.%03
4970: 64 22 2c 73 2c 6d 73 29 3b 0a 20 20 20 20 20 20  d",s,ms);.      
4980: 20 20 20 20 6a 20 2b 3d 20 73 74 72 6c 65 6e 28      j += strlen(
4990: 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  &z[j]);.        
49a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
49b0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
49c0: 27 48 27 3a 20 20 73 70 72 69 6e 74 66 28 26 7a  'H':  sprintf(&z
49d0: 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 68 29 3b  [j],"%02d",x.h);
49e0: 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20   j+=2; break;.  
49f0: 20 20 20 20 20 20 63 61 73 65 20 27 57 27 3a 20        case 'W': 
4a00: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a  /* Fall thru */.
4a10: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 6a 27          case 'j'
4a20: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
4a30: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 44  t n;.          D
4a40: 61 74 65 54 69 6d 65 20 79 20 3d 20 78 3b 0a 20  ateTime y = x;. 
4a50: 20 20 20 20 20 20 20 20 20 79 2e 76 61 6c 69 64           y.valid
4a60: 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  JD = 0;.        
4a70: 20 20 79 2e 4d 20 3d 20 31 3b 0a 20 20 20 20 20    y.M = 1;.     
4a80: 20 20 20 20 20 79 2e 44 20 3d 20 31 3b 0a 20 20       y.D = 1;.  
4a90: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
4aa0: 44 28 26 79 29 3b 0a 20 20 20 20 20 20 20 20 20  D(&y);.         
4ab0: 20 6e 20 3d 20 78 2e 72 4a 44 20 2d 20 79 2e 72   n = x.rJD - y.r
4ac0: 4a 44 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  JD + 1;.        
4ad0: 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27    if( zFmt[i]=='
4ae0: 57 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  W' ){.          
4af0: 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c    sprintf(&z[j],
4b00: 22 25 30 32 64 22 2c 28 6e 2b 36 29 2f 37 29 3b  "%02d",(n+6)/7);
4b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 2b  .            j +
4b20: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 2;.          }
4b30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4b40: 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c    sprintf(&z[j],
4b50: 22 25 30 33 64 22 2c 6e 29 3b 0a 20 20 20 20 20  "%03d",n);.     
4b60: 20 20 20 20 20 20 20 6a 20 2b 3d 20 33 3b 0a 20         j += 3;. 
4b70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4b80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
4ba0: 73 65 20 27 4a 27 3a 20 20 73 70 72 69 6e 74 66  se 'J':  sprintf
4bb0: 28 26 7a 5b 6a 5d 2c 22 25 2e 31 36 67 22 2c 78  (&z[j],"%.16g",x
4bc0: 2e 72 4a 44 29 3b 20 6a 2b 3d 73 74 72 6c 65 6e  .rJD); j+=strlen
4bd0: 28 26 7a 5b 6a 5d 29 3b 20 62 72 65 61 6b 3b 0a  (&z[j]); break;.
4be0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 6d 27          case 'm'
4bf0: 3a 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d  :  sprintf(&z[j]
4c00: 2c 22 25 30 32 64 22 2c 78 2e 4d 29 3b 20 6a 2b  ,"%02d",x.M); j+
4c10: 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  =2; break;.     
4c20: 20 20 20 63 61 73 65 20 27 4d 27 3a 20 20 73 70     case 'M':  sp
4c30: 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 30 32  rintf(&z[j],"%02
4c40: 64 22 2c 78 2e 6d 29 3b 20 6a 2b 3d 32 3b 20 62  d",x.m); j+=2; b
4c50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
4c60: 73 65 20 27 73 27 3a 20 7b 0a 20 20 20 20 20 20  se 's': {.      
4c70: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a      sprintf(&z[j
4c80: 5d 2c 22 25 64 22 2c 28 69 6e 74 29 28 28 78 2e  ],"%d",(int)((x.
4c90: 72 4a 44 2d 32 34 34 30 35 38 37 2e 35 29 2a 38  rJD-2440587.5)*8
4ca0: 36 34 30 30 2e 30 20 2b 20 30 2e 35 29 29 3b 0a  6400.0 + 0.5));.
4cb0: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 73            j += s
4cc0: 74 72 6c 65 6e 28 26 7a 5b 6a 5d 29 3b 0a 20 20  trlen(&z[j]);.  
4cd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4ce0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4cf0: 20 63 61 73 65 20 27 53 27 3a 20 20 73 70 72 69   case 'S':  spri
4d00: 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 30 32 64 22  ntf(&z[j],"%02d"
4d10: 2c 28 69 6e 74 29 28 78 2e 73 2b 30 2e 35 29 29  ,(int)(x.s+0.5))
4d20: 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20  ; j+=2; break;. 
4d30: 20 20 20 20 20 20 20 63 61 73 65 20 27 77 27 3a         case 'w':
4d40: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 28 28 28 69 6e    z[j++] = (((in
4d50: 74 29 28 78 2e 72 4a 44 2b 31 2e 35 29 29 20 25  t)(x.rJD+1.5)) %
4d60: 20 37 29 20 2b 20 27 30 27 3b 20 62 72 65 61 6b   7) + '0'; break
4d70: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
4d80: 59 27 3a 20 20 73 70 72 69 6e 74 66 28 26 7a 5b  Y':  sprintf(&z[
4d90: 6a 5d 2c 22 25 30 34 64 22 2c 78 2e 59 29 3b 20  j],"%04d",x.Y); 
4da0: 6a 2b 3d 73 74 72 6c 65 6e 28 26 7a 5b 6a 5d 29  j+=strlen(&z[j])
4db0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
4dc0: 20 63 61 73 65 20 27 25 27 3a 20 20 7a 5b 6a 2b   case '%':  z[j+
4dd0: 2b 5d 20 3d 20 27 25 27 3b 20 62 72 65 61 6b 3b  +] = '%'; break;
4de0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4df0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
4e00: 20 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75   sqlite_set_resu
4e10: 6c 74 5f 73 74 72 69 6e 67 28 63 6f 6e 74 65 78  lt_string(contex
4e20: 74 2c 20 7a 2c 20 2d 31 29 3b 0a 20 20 69 66 28  t, z, -1);.  if(
4e30: 20 7a 21 3d 7a 42 75 66 20 29 7b 0a 20 20 20 20   z!=zBuf ){.    
4e40: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
4e50: 20 7d 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a   }.}...#endif /*
4e60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4e70: 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46  _OMIT_DATETIME_F
4e80: 55 4e 43 53 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UNCS) */../*.** 
4e90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
4ea0: 67 69 73 74 65 72 65 64 20 61 6c 6c 20 6f 66 20  gistered all of 
4eb0: 74 68 65 20 61 62 6f 76 65 20 43 20 66 75 6e 63  the above C func
4ec0: 74 69 6f 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20  tions as SQL.** 
4ed0: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73  functions.  This
4ee0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f   should be the o
4ef0: 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74  nly routine in t
4f00: 68 69 73 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a  his file with.**
4f10: 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67   external linkag
4f20: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
4f30: 65 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  eRegisterDateTim
4f40: 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  eFunctions(sqlit
4f50: 65 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  e *db){.  static
4f60: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
4f70: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
4f80: 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 20   int nArg;.     
4f90: 69 6e 74 20 64 61 74 61 54 79 70 65 3b 0a 20 20  int dataType;.  
4fa0: 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29     void (*xFunc)
4fb0: 28 73 71 6c 69 74 65 5f 66 75 6e 63 2a 2c 69 6e  (sqlite_func*,in
4fc0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b  t,const char**);
4fd0: 0a 20 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20  .  } aFuncs[] = 
4fe0: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
4ff0: 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46  _OMIT_DATETIME_F
5000: 55 4e 43 53 0a 20 20 20 20 7b 20 22 6a 75 6c 69  UNCS.    { "juli
5010: 61 6e 64 61 79 22 2c 20 2d 31 2c 20 53 51 4c 49  anday", -1, SQLI
5020: 54 45 5f 4e 55 4d 45 52 49 43 2c 20 6a 75 6c 69  TE_NUMERIC, juli
5030: 61 6e 64 61 79 46 75 6e 63 20 20 20 7d 2c 0a 20  andayFunc   },. 
5040: 20 20 20 7b 20 22 64 61 74 65 22 2c 20 20 20 20     { "date",    
5050: 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 45 58    -1, SQLITE_TEX
5060: 54 2c 20 20 20 20 64 61 74 65 46 75 6e 63 20 20  T,    dateFunc  
5070: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
5080: 74 69 6d 65 22 2c 20 20 20 20 20 20 2d 31 2c 20  time",      -1, 
5090: 53 51 4c 49 54 45 5f 54 45 58 54 2c 20 20 20 20  SQLITE_TEXT,    
50a0: 74 69 6d 65 46 75 6e 63 20 20 20 20 20 20 20 20  timeFunc        
50b0: 7d 2c 0a 20 20 20 20 7b 20 22 64 61 74 65 74 69  },.    { "dateti
50c0: 6d 65 22 2c 20 20 2d 31 2c 20 53 51 4c 49 54 45  me",  -1, SQLITE
50d0: 5f 54 45 58 54 2c 20 20 20 20 64 61 74 65 74 69  _TEXT,    dateti
50e0: 6d 65 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20  meFunc    },.   
50f0: 20 7b 20 22 73 74 72 66 74 69 6d 65 22 2c 20 20   { "strftime",  
5100: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 45 58 54 2c  -1, SQLITE_TEXT,
5110: 20 20 20 20 73 74 72 66 74 69 6d 65 46 75 6e 63      strftimeFunc
5120: 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20      },.#endif.  
5130: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  };.  int i;..  f
5140: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
5150: 28 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28  (aFuncs)/sizeof(
5160: 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29  aFuncs[0]); i++)
5170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f 63 72 65  {.    sqlite_cre
5180: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
5190: 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65   aFuncs[i].zName
51a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 46 75  ,.           aFu
51b0: 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 20 61 46 75  ncs[i].nArg, aFu
51c0: 6e 63 73 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 29  ncs[i].xFunc, 0)
51d0: 3b 0a 20 20 20 20 69 66 28 20 61 46 75 6e 63 73  ;.    if( aFuncs
51e0: 5b 69 5d 2e 78 46 75 6e 63 20 29 7b 0a 20 20 20  [i].xFunc ){.   
51f0: 20 20 20 73 71 6c 69 74 65 5f 66 75 6e 63 74 69     sqlite_functi
5200: 6f 6e 5f 74 79 70 65 28 64 62 2c 20 61 46 75 6e  on_type(db, aFun
5210: 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75  cs[i].zName, aFu
5220: 6e 63 73 5b 69 5d 2e 64 61 74 61 54 79 70 65 29  ncs[i].dataType)
5230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a        ;.    }.  }.}.