/ Hex Artifact Content
Login

Artifact 34bdb0082db7ec2a83ef00063f7b44e61ee19dad:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 4f 63 74 6f 62  /*.** 2003 Octob
0010: 65 72 20 33 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 31.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  e contains the C
0190: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
01a0: 69 6d 70 6c 65 6d 65 6e 74 20 64 61 74 65 20 61  implement date a
01b0: 6e 64 20 74 69 6d 65 0a 2a 2a 20 66 75 6e 63 74  nd time.** funct
01c0: 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 2e  ions for SQLite.
01d0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69    .**.** There i
01e0: 73 20 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72  s only one expor
01f0: 74 65 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  ted symbol in th
0200: 69 73 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75  is file - the fu
0210: 6e 63 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65  nction.** sqlite
0220: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
0230: 65 46 75 6e 63 74 69 6f 6e 73 28 29 20 66 6f 75  eFunctions() fou
0240: 6e 64 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  nd at the bottom
0250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   of the file..**
0260: 20 41 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   All other code 
0270: 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 2e 0a  has file scope..
0280: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64 61 74 65 2e  **.** $Id: date.
0290: 63 2c 76 20 31 2e 33 37 20 32 30 30 34 2f 31 30  c,v 1.37 2004/10
02a0: 2f 30 36 20 31 35 3a 34 31 3a 31 36 20 64 72 68  /06 15:41:16 drh
02b0: 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 4e 4f 54   Exp $.**.** NOT
02c0: 45 53 3a 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ES:.**.** SQLite
02d0: 20 70 72 6f 63 65 73 73 65 73 20 61 6c 6c 20 74   processes all t
02e0: 69 6d 65 73 20 61 6e 64 20 64 61 74 65 73 20 61  imes and dates a
02f0: 73 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  s Julian Day num
0300: 62 65 72 73 2e 20 20 54 68 65 0a 2a 2a 20 64 61  bers.  The.** da
0310: 74 65 73 20 61 6e 64 20 74 69 6d 65 73 20 61 72  tes and times ar
0320: 65 20 73 74 6f 72 65 64 20 61 73 20 74 68 65 20  e stored as the 
0330: 6e 75 6d 62 65 72 20 6f 66 20 64 61 79 73 20 73  number of days s
0340: 69 6e 63 65 20 6e 6f 6f 6e 0a 2a 2a 20 69 6e 20  ince noon.** in 
0350: 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
0360: 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
0370: 2e 43 2e 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  .C. according to
0380: 20 74 68 65 20 47 72 65 67 6f 72 69 61 6e 0a 2a   the Gregorian.*
0390: 2a 20 63 61 6c 65 6e 64 61 72 20 73 79 73 74 65  * calendar syste
03a0: 6d 2e 0a 2a 2a 0a 2a 2a 20 31 39 37 30 2d 30 31  m..**.** 1970-01
03b0: 2d 30 31 20 30 30 3a 30 30 3a 30 30 20 69 73 20  -01 00:00:00 is 
03c0: 4a 44 20 32 34 34 30 35 38 37 2e 35 0a 2a 2a 20  JD 2440587.5.** 
03d0: 32 30 30 30 2d 30 31 2d 30 31 20 30 30 3a 30 30  2000-01-01 00:00
03e0: 3a 30 30 20 69 73 20 4a 44 20 32 34 35 31 35 34  :00 is JD 245154
03f0: 34 2e 35 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  4.5.**.** This i
0400: 6d 70 6c 65 6d 65 6e 74 69 6f 6e 20 72 65 71 75  mplemention requ
0410: 69 72 65 73 20 79 65 61 72 73 20 74 6f 20 62 65  ires years to be
0420: 20 65 78 70 72 65 73 73 65 64 20 61 73 20 61 20   expressed as a 
0430: 34 2d 64 69 67 69 74 20 6e 75 6d 62 65 72 0a 2a  4-digit number.*
0440: 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  * which means th
0450: 61 74 20 6f 6e 6c 79 20 64 61 74 65 73 20 62 65  at only dates be
0460: 74 77 65 65 6e 20 30 30 30 30 2d 30 31 2d 30 31  tween 0000-01-01
0470: 20 61 6e 64 20 39 39 39 39 2d 31 32 2d 33 31 20   and 9999-12-31 
0480: 63 61 6e 0a 2a 2a 20 62 65 20 72 65 70 72 65 73  can.** be repres
0490: 65 6e 74 65 64 2c 20 65 76 65 6e 20 74 68 6f 75  ented, even thou
04a0: 67 68 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75  gh julian day nu
04b0: 6d 62 65 72 73 20 61 6c 6c 6f 77 20 61 20 6d 75  mbers allow a mu
04c0: 63 68 20 77 69 64 65 72 0a 2a 2a 20 72 61 6e 67  ch wider.** rang
04d0: 65 20 6f 66 20 64 61 74 65 73 2e 0a 2a 2a 0a 2a  e of dates..**.*
04e0: 2a 20 54 68 65 20 47 72 65 67 6f 72 69 61 6e 20  * The Gregorian 
04f0: 63 61 6c 65 6e 64 61 72 20 73 79 73 74 65 6d 20  calendar system 
0500: 69 73 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20  is used for all 
0510: 64 61 74 65 73 20 61 6e 64 20 74 69 6d 65 73 2c  dates and times,
0520: 0a 2a 2a 20 65 76 65 6e 20 74 68 6f 73 65 20 74  .** even those t
0530: 68 61 74 20 70 72 65 64 61 74 65 20 74 68 65 20  hat predate the 
0540: 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
0550: 61 72 2e 20 20 48 69 73 74 6f 72 69 61 6e 73 20  ar.  Historians 
0560: 75 73 75 61 6c 6c 79 0a 2a 2a 20 75 73 65 20 74  usually.** use t
0570: 68 65 20 4a 75 6c 69 61 6e 20 63 61 6c 65 6e 64  he Julian calend
0580: 61 72 20 66 6f 72 20 64 61 74 65 73 20 70 72 69  ar for dates pri
0590: 6f 72 20 74 6f 20 31 35 38 32 2d 31 30 2d 31 35  or to 1582-10-15
05a0: 20 61 6e 64 20 66 6f 72 20 73 6f 6d 65 0a 2a 2a   and for some.**
05b0: 20 64 61 74 65 73 20 61 66 74 65 72 77 61 72 64   dates afterward
05c0: 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  s, depending on 
05d0: 6c 6f 63 61 6c 65 2e 20 20 42 65 77 61 72 65 20  locale.  Beware 
05e0: 6f 66 20 74 68 69 73 20 64 69 66 66 65 72 65 6e  of this differen
05f0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
0600: 6e 76 65 72 73 69 6f 6e 20 61 6c 67 6f 72 69 74  nversion algorit
0610: 68 6d 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  hms are implemen
0620: 74 65 64 20 62 61 73 65 64 20 6f 6e 20 64 65 73  ted based on des
0630: 63 72 69 70 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  criptions.** in 
0640: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
0650: 78 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 4a  xt:.**.**      J
0660: 65 61 6e 20 4d 65 65 75 73 0a 2a 2a 20 20 20 20  ean Meeus.**    
0670: 20 20 41 73 74 72 6f 6e 6f 6d 69 63 61 6c 20 41    Astronomical A
0680: 6c 67 6f 72 69 74 68 6d 73 2c 20 32 6e 64 20 45  lgorithms, 2nd E
0690: 64 69 74 69 6f 6e 2c 20 31 39 39 38 0a 2a 2a 20  dition, 1998.** 
06a0: 20 20 20 20 20 49 53 42 4d 20 30 2d 39 34 33 33       ISBM 0-9433
06b0: 39 36 2d 36 31 2d 31 0a 2a 2a 20 20 20 20 20 20  96-61-1.**      
06c0: 57 69 6c 6c 6d 61 6e 6e 2d 42 65 6c 6c 2c 20 49  Willmann-Bell, I
06d0: 6e 63 0a 2a 2a 20 20 20 20 20 20 52 69 63 68 6d  nc.**      Richm
06e0: 6f 6e 64 2c 20 56 69 72 67 69 6e 69 61 20 28 55  ond, Virginia (U
06f0: 53 41 29 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  SA).*/.#include 
0700: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0710: 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69  nclude "os.h".#i
0720: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0730: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli
0740: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  b.h>.#include <a
0750: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
0760: 65 20 3c 74 69 6d 65 2e 68 3e 0a 0a 23 69 66 6e  e <time.h>..#ifn
0770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0780: 44 41 54 45 54 49 4d 45 5f 46 55 4e 43 53 0a 0a  DATETIME_FUNCS..
0790: 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72  /*.** A structur
07a0: 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 61 20  e for holding a 
07b0: 73 69 6e 67 6c 65 20 64 61 74 65 20 61 6e 64 20  single date and 
07c0: 74 69 6d 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  time..*/.typedef
07d0: 20 73 74 72 75 63 74 20 44 61 74 65 54 69 6d 65   struct DateTime
07e0: 20 44 61 74 65 54 69 6d 65 3b 0a 73 74 72 75 63   DateTime;.struc
07f0: 74 20 44 61 74 65 54 69 6d 65 20 7b 0a 20 20 64  t DateTime {.  d
0800: 6f 75 62 6c 65 20 72 4a 44 3b 20 20 20 20 20 20  ouble rJD;      
0810: 2f 2a 20 54 68 65 20 6a 75 6c 69 61 6e 20 64 61  /* The julian da
0820: 79 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  y number */.  in
0830: 74 20 59 2c 20 4d 2c 20 44 3b 20 20 20 20 20 2f  t Y, M, D;     /
0840: 2a 20 59 65 61 72 2c 20 6d 6f 6e 74 68 2c 20 61  * Year, month, a
0850: 6e 64 20 64 61 79 20 2a 2f 0a 20 20 69 6e 74 20  nd day */.  int 
0860: 68 2c 20 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20  h, m;        /* 
0870: 48 6f 75 72 20 61 6e 64 20 6d 69 6e 75 74 65 73  Hour and minutes
0880: 20 2a 2f 0a 20 20 69 6e 74 20 74 7a 3b 20 20 20   */.  int tz;   
0890: 20 20 20 20 20 20 20 2f 2a 20 54 69 6d 65 7a 6f         /* Timezo
08a0: 6e 65 20 6f 66 66 73 65 74 20 69 6e 20 6d 69 6e  ne offset in min
08b0: 75 74 65 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  utes */.  double
08c0: 20 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65   s;        /* Se
08d0: 63 6f 6e 64 73 20 2a 2f 0a 20 20 63 68 61 72 20  conds */.  char 
08e0: 76 61 6c 69 64 59 4d 44 3b 20 20 20 2f 2a 20 54  validYMD;   /* T
08f0: 72 75 65 20 69 66 20 59 2c 4d 2c 44 20 61 72 65  rue if Y,M,D are
0900: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 63 68 61 72   valid */.  char
0910: 20 76 61 6c 69 64 48 4d 53 3b 20 20 20 2f 2a 20   validHMS;   /* 
0920: 54 72 75 65 20 69 66 20 68 2c 6d 2c 73 20 61 72  True if h,m,s ar
0930: 65 20 76 61 6c 69 64 20 2a 2f 0a 20 20 63 68 61  e valid */.  cha
0940: 72 20 76 61 6c 69 64 4a 44 3b 20 20 20 20 2f 2a  r validJD;    /*
0950: 20 54 72 75 65 20 69 66 20 72 4a 44 20 69 73 20   True if rJD is 
0960: 76 61 6c 69 64 20 2a 2f 0a 20 20 63 68 61 72 20  valid */.  char 
0970: 76 61 6c 69 64 54 5a 3b 20 20 20 20 2f 2a 20 54  validTZ;    /* T
0980: 72 75 65 20 69 66 20 74 7a 20 69 73 20 76 61 6c  rue if tz is val
0990: 69 64 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  id */.};.../*.**
09a0: 20 43 6f 6e 76 65 72 74 20 7a 44 61 74 65 20 69   Convert zDate i
09b0: 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
09c0: 69 6e 74 65 67 65 72 73 2e 20 20 41 64 64 69 74  integers.  Addit
09d0: 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 0a  ional arguments.
09e0: 2a 2a 20 63 6f 6d 65 20 69 6e 20 67 72 6f 75 70  ** come in group
09f0: 73 20 6f 66 20 35 20 61 73 20 66 6f 6c 6c 6f 77  s of 5 as follow
0a00: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4e  s:.**.**       N
0a10: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
0a20: 20 64 69 67 69 74 73 20 69 6e 20 74 68 65 20 69   digits in the i
0a30: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  nteger.**       
0a40: 6d 69 6e 20 20 20 20 20 6d 69 6e 69 6d 75 6d 20  min     minimum 
0a50: 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 20 6f 66  allowed value of
0a60: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
0a70: 20 20 20 20 20 20 6d 61 78 20 20 20 20 20 6d 61        max     ma
0a80: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 76 61  ximum allowed va
0a90: 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
0aa0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6e 65 78 74  er.**       next
0ab0: 43 20 20 20 66 69 72 73 74 20 63 68 61 72 61 63  C   first charac
0ac0: 74 65 72 20 61 66 74 65 72 20 74 68 65 20 69 6e  ter after the in
0ad0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 70  teger.**       p
0ae0: 56 61 6c 20 20 20 20 77 68 65 72 65 20 74 6f 20  Val    where to 
0af0: 77 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65  write the intege
0b00: 72 73 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  rs value..**.** 
0b10: 43 6f 6e 76 65 72 73 69 6f 6e 73 20 63 6f 6e 74  Conversions cont
0b20: 69 6e 75 65 20 75 6e 74 69 6c 20 6f 6e 65 20 77  inue until one w
0b30: 69 74 68 20 6e 65 78 74 43 3d 3d 30 20 69 73 20  ith nextC==0 is 
0b40: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 20  encountered..** 
0b50: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  The function ret
0b60: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
0b70: 6f 66 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  of successful co
0b80: 6e 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  nversions..*/.st
0b90: 61 74 69 63 20 69 6e 74 20 67 65 74 44 69 67 69  atic int getDigi
0ba0: 74 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ts(const char *z
0bb0: 44 61 74 65 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  Date, ...){.  va
0bc0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
0bd0: 76 61 6c 3b 0a 20 20 69 6e 74 20 4e 3b 0a 20 20  val;.  int N;.  
0be0: 69 6e 74 20 6d 69 6e 3b 0a 20 20 69 6e 74 20 6d  int min;.  int m
0bf0: 61 78 3b 0a 20 20 69 6e 74 20 6e 65 78 74 43 3b  ax;.  int nextC;
0c00: 0a 20 20 69 6e 74 20 2a 70 56 61 6c 3b 0a 20 20  .  int *pVal;.  
0c10: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 76  int cnt = 0;.  v
0c20: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 44 61 74  a_start(ap, zDat
0c30: 65 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 4e 20  e);.  do{.    N 
0c40: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0c50: 29 3b 0a 20 20 20 20 6d 69 6e 20 3d 20 76 61 5f  );.    min = va_
0c60: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
0c70: 20 20 6d 61 78 20 3d 20 76 61 5f 61 72 67 28 61    max = va_arg(a
0c80: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 6e 65 78  p, int);.    nex
0c90: 74 43 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  tC = va_arg(ap, 
0ca0: 69 6e 74 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d  int);.    pVal =
0cb0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
0cc0: 29 3b 0a 20 20 20 20 76 61 6c 20 3d 20 30 3b 0a  );.    val = 0;.
0cd0: 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29      while( N-- )
0ce0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 64  {.      if( !isd
0cf0: 69 67 69 74 28 2a 28 75 38 2a 29 7a 44 61 74 65  igit(*(u8*)zDate
0d00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
0d10: 75 72 6e 20 63 6e 74 3b 0a 20 20 20 20 20 20 7d  urn cnt;.      }
0d20: 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c  .      val = val
0d30: 2a 31 30 20 2b 20 2a 7a 44 61 74 65 20 2d 20 27  *10 + *zDate - '
0d40: 30 27 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 2b  0';.      zDate+
0d50: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
0d60: 20 76 61 6c 3c 6d 69 6e 20 7c 7c 20 76 61 6c 3e   val<min || val>
0d70: 6d 61 78 20 7c 7c 20 28 6e 65 78 74 43 21 3d 30  max || (nextC!=0
0d80: 20 26 26 20 6e 65 78 74 43 21 3d 2a 7a 44 61 74   && nextC!=*zDat
0d90: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
0da0: 72 6e 20 63 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  rn cnt;.    }.  
0db0: 20 20 2a 70 56 61 6c 20 3d 20 76 61 6c 3b 0a 20    *pVal = val;. 
0dc0: 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20     zDate++;.    
0dd0: 63 6e 74 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  cnt++;.  }while(
0de0: 20 6e 65 78 74 43 20 29 3b 0a 20 20 72 65 74 75   nextC );.  retu
0df0: 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn cnt;.}../*.**
0e00: 20 52 65 61 64 20 74 65 78 74 20 66 72 6f 6d 20   Read text from 
0e10: 7a 5b 5d 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  z[] and convert 
0e20: 69 6e 74 6f 20 61 20 66 6c 6f 61 74 69 6e 67 20  into a floating 
0e30: 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 20 52  point number.  R
0e40: 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
0e50: 62 65 72 20 6f 66 20 64 69 67 69 74 73 20 63 6f  ber of digits co
0e60: 6e 76 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  nverted..*/.stat
0e70: 69 63 20 69 6e 74 20 67 65 74 56 61 6c 75 65 28  ic int getValue(
0e80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 64  const char *z, d
0e90: 6f 75 62 6c 65 20 2a 70 52 29 7b 0a 20 20 63 6f  ouble *pR){.  co
0ea0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 3b 0a  nst char *zEnd;.
0eb0: 20 20 2a 70 52 20 3d 20 73 71 6c 69 74 65 33 41    *pR = sqlite3A
0ec0: 74 6f 46 28 7a 2c 20 26 7a 45 6e 64 29 3b 0a 20  toF(z, &zEnd);. 
0ed0: 20 72 65 74 75 72 6e 20 7a 45 6e 64 20 2d 20 7a   return zEnd - z
0ee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
0ef0: 20 61 20 74 69 6d 65 7a 6f 6e 65 20 65 78 74 65   a timezone exte
0f00: 6e 73 69 6f 6e 20 6f 6e 20 74 68 65 20 65 6e 64  nsion on the end
0f10: 20 6f 66 20 61 20 64 61 74 65 2d 74 69 6d 65 2e   of a date-time.
0f20: 0a 2a 2a 20 54 68 65 20 65 78 74 65 6e 73 69 6f  .** The extensio
0f30: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
0f40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 28  :.**.**        (
0f50: 2b 2f 2d 29 48 48 3a 4d 4d 0a 2a 2a 0a 2a 2a 20  +/-)HH:MM.**.** 
0f60: 49 66 20 74 68 65 20 70 61 72 73 65 20 69 73 20  If the parse is 
0f70: 73 75 63 63 65 73 73 66 75 6c 2c 20 77 72 69 74  successful, writ
0f80: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
0f90: 6d 69 6e 75 74 65 73 0a 2a 2a 20 6f 66 20 63 68  minutes.** of ch
0fa0: 61 6e 67 65 20 69 6e 20 2a 70 6e 4d 69 6e 20 61  ange in *pnMin a
0fb0: 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 20 49 66  nd return 0.  If
0fc0: 20 61 20 70 61 72 73 65 72 20 65 72 72 6f 72 20   a parser error 
0fd0: 6f 63 63 75 72 73 2c 0a 2a 2a 20 72 65 74 75 72  occurs,.** retur
0fe0: 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d 69 73  n 0..**.** A mis
0ff0: 73 69 6e 67 20 73 70 65 63 69 66 69 65 72 20 69  sing specifier i
1000: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1010: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
1020: 61 74 69 63 20 69 6e 74 20 70 61 72 73 65 54 69  atic int parseTi
1030: 6d 65 7a 6f 6e 65 28 63 6f 6e 73 74 20 63 68 61  mezone(const cha
1040: 72 20 2a 7a 44 61 74 65 2c 20 44 61 74 65 54 69  r *zDate, DateTi
1050: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 73 67  me *p){.  int sg
1060: 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 72  n = 0;.  int nHr
1070: 2c 20 6e 4d 6e 3b 0a 20 20 77 68 69 6c 65 28 20  , nMn;.  while( 
1080: 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 44  isspace(*(u8*)zD
1090: 61 74 65 29 20 29 7b 20 7a 44 61 74 65 2b 2b 3b  ate) ){ zDate++;
10a0: 20 7d 0a 20 20 70 2d 3e 74 7a 20 3d 20 30 3b 0a   }.  p->tz = 0;.
10b0: 20 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d 27 2d    if( *zDate=='-
10c0: 27 20 29 7b 0a 20 20 20 20 73 67 6e 20 3d 20 2d  ' ){.    sgn = -
10d0: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 2a  1;.  }else if( *
10e0: 7a 44 61 74 65 3d 3d 27 2b 27 20 29 7b 0a 20 20  zDate=='+' ){.  
10f0: 20 20 73 67 6e 20 3d 20 2b 31 3b 0a 20 20 7d 65    sgn = +1;.  }e
1100: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1110: 2a 7a 44 61 74 65 21 3d 30 3b 0a 20 20 7d 0a 20  *zDate!=0;.  }. 
1120: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 69 66 28 20   zDate++;.  if( 
1130: 67 65 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c  getDigits(zDate,
1140: 20 32 2c 20 30 2c 20 31 34 2c 20 27 3a 27 2c 20   2, 0, 14, ':', 
1150: 26 6e 48 72 2c 20 32 2c 20 30 2c 20 35 39 2c 20  &nHr, 2, 0, 59, 
1160: 30 2c 20 26 6e 4d 6e 29 21 3d 32 20 29 7b 0a 20  0, &nMn)!=2 ){. 
1170: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1180: 0a 20 20 7a 44 61 74 65 20 2b 3d 20 35 3b 0a 20  .  zDate += 5;. 
1190: 20 70 2d 3e 74 7a 20 3d 20 73 67 6e 2a 28 6e 4d   p->tz = sgn*(nM
11a0: 6e 20 2b 20 6e 48 72 2a 36 30 29 3b 0a 20 20 77  n + nHr*60);.  w
11b0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
11c0: 75 38 2a 29 7a 44 61 74 65 29 20 29 7b 20 7a 44  u8*)zDate) ){ zD
11d0: 61 74 65 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72  ate++; }.  retur
11e0: 6e 20 2a 7a 44 61 74 65 21 3d 30 3b 0a 7d 0a 0a  n *zDate!=0;.}..
11f0: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74 69 6d 65  /*.** Parse time
1200: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 48 48  s of the form HH
1210: 3a 4d 4d 20 6f 72 20 48 48 3a 4d 4d 3a 53 53 20  :MM or HH:MM:SS 
1220: 6f 72 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 46  or HH:MM:SS.FFFF
1230: 2e 0a 2a 2a 20 54 68 65 20 48 48 2c 20 4d 4d 2c  ..** The HH, MM,
1240: 20 61 6e 64 20 53 53 20 6d 75 73 74 20 65 61 63   and SS must eac
1250: 68 20 62 65 20 65 78 61 63 74 6c 79 20 32 20 64  h be exactly 2 d
1260: 69 67 69 74 73 2e 20 20 54 68 65 0a 2a 2a 20 66  igits.  The.** f
1270: 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64  ractional second
1280: 73 20 46 46 46 46 20 63 61 6e 20 62 65 20 6f 6e  s FFFF can be on
1290: 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73  e or more digits
12a0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
12b0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 70   if there is a p
12c0: 61 72 73 69 6e 67 20 65 72 72 6f 72 20 61 6e 64  arsing error and
12d0: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a   0 on success..*
12e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72  /.static int par
12f0: 73 65 48 68 4d 6d 53 73 28 63 6f 6e 73 74 20 63  seHhMmSs(const c
1300: 68 61 72 20 2a 7a 44 61 74 65 2c 20 44 61 74 65  har *zDate, Date
1310: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Time *p){.  int 
1320: 68 2c 20 6d 2c 20 73 3b 0a 20 20 64 6f 75 62 6c  h, m, s;.  doubl
1330: 65 20 6d 73 20 3d 20 30 2e 30 3b 0a 20 20 69 66  e ms = 0.0;.  if
1340: 28 20 67 65 74 44 69 67 69 74 73 28 7a 44 61 74  ( getDigits(zDat
1350: 65 2c 20 32 2c 20 30 2c 20 32 34 2c 20 27 3a 27  e, 2, 0, 24, ':'
1360: 2c 20 26 68 2c 20 32 2c 20 30 2c 20 35 39 2c 20  , &h, 2, 0, 59, 
1370: 30 2c 20 26 6d 29 21 3d 32 20 29 7b 0a 20 20 20  0, &m)!=2 ){.   
1380: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1390: 20 7a 44 61 74 65 20 2b 3d 20 35 3b 0a 20 20 69   zDate += 5;.  i
13a0: 66 28 20 2a 7a 44 61 74 65 3d 3d 27 3a 27 20 29  f( *zDate==':' )
13b0: 7b 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20  {.    zDate++;. 
13c0: 20 20 20 69 66 28 20 67 65 74 44 69 67 69 74 73     if( getDigits
13d0: 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 35 39  (zDate, 2, 0, 59
13e0: 2c 20 30 2c 20 26 73 29 21 3d 31 20 29 7b 0a 20  , 0, &s)!=1 ){. 
13f0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1400: 20 20 20 7d 0a 20 20 20 20 7a 44 61 74 65 20 2b     }.    zDate +
1410: 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 2a 7a 44  = 2;.    if( *zD
1420: 61 74 65 3d 3d 27 2e 27 20 26 26 20 69 73 64 69  ate=='.' && isdi
1430: 67 69 74 28 28 75 38 29 7a 44 61 74 65 5b 31 5d  git((u8)zDate[1]
1440: 29 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  ) ){.      doubl
1450: 65 20 72 53 63 61 6c 65 20 3d 20 31 2e 30 3b 0a  e rScale = 1.0;.
1460: 20 20 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20        zDate++;. 
1470: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69       while( isdi
1480: 67 69 74 28 2a 28 75 38 2a 29 7a 44 61 74 65 29  git(*(u8*)zDate)
1490: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 73 20 3d   ){.        ms =
14a0: 20 6d 73 2a 31 30 2e 30 20 2b 20 2a 7a 44 61 74   ms*10.0 + *zDat
14b0: 65 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  e - '0';.       
14c0: 20 72 53 63 61 6c 65 20 2a 3d 20 31 30 2e 30 3b   rScale *= 10.0;
14d0: 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 2b 2b  .        zDate++
14e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14f0: 6d 73 20 2f 3d 20 72 53 63 61 6c 65 3b 0a 20 20  ms /= rScale;.  
1500: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1510: 20 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d   s = 0;.  }.  p-
1520: 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20  >validJD = 0;.  
1530: 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b  p->validHMS = 1;
1540: 0a 20 20 70 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  .  p->h = h;.  p
1550: 2d 3e 6d 20 3d 20 6d 3b 0a 20 20 70 2d 3e 73 20  ->m = m;.  p->s 
1560: 3d 20 73 20 2b 20 6d 73 3b 0a 20 20 69 66 28 20  = s + ms;.  if( 
1570: 70 61 72 73 65 54 69 6d 65 7a 6f 6e 65 28 7a 44  parseTimezone(zD
1580: 61 74 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  ate, p) ) return
1590: 20 31 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 54 5a   1;.  p->validTZ
15a0: 20 3d 20 70 2d 3e 74 7a 21 3d 30 3b 0a 20 20 72   = p->tz!=0;.  r
15b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
15c0: 2a 20 43 6f 6e 76 65 72 74 20 66 72 6f 6d 20 59  * Convert from Y
15d0: 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a  YYY-MM-DD HH:MM:
15e0: 53 53 20 74 6f 20 6a 75 6c 69 61 6e 20 64 61 79  SS to julian day
15f0: 2e 20 20 57 65 20 61 6c 77 61 79 73 20 61 73 73  .  We always ass
1600: 75 6d 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ume.** that the 
1610: 59 59 59 59 2d 4d 4d 2d 44 44 20 69 73 20 61 63  YYYY-MM-DD is ac
1620: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 47  cording to the G
1630: 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
1640: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  r..**.** Referen
1650: 63 65 3a 20 20 4d 65 65 75 73 20 70 61 67 65 20  ce:  Meeus page 
1660: 36 31 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  61.*/.static voi
1670: 64 20 63 6f 6d 70 75 74 65 4a 44 28 44 61 74 65  d computeJD(Date
1680: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Time *p){.  int 
1690: 59 2c 20 4d 2c 20 44 2c 20 41 2c 20 42 2c 20 58  Y, M, D, A, B, X
16a0: 31 2c 20 58 32 3b 0a 0a 20 20 69 66 28 20 70 2d  1, X2;..  if( p-
16b0: 3e 76 61 6c 69 64 4a 44 20 29 20 72 65 74 75 72  >validJD ) retur
16c0: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69  n;.  if( p->vali
16d0: 64 59 4d 44 20 29 7b 0a 20 20 20 20 59 20 3d 20  dYMD ){.    Y = 
16e0: 70 2d 3e 59 3b 0a 20 20 20 20 4d 20 3d 20 70 2d  p->Y;.    M = p-
16f0: 3e 4d 3b 0a 20 20 20 20 44 20 3d 20 70 2d 3e 44  >M;.    D = p->D
1700: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 59  ;.  }else{.    Y
1710: 20 3d 20 32 30 30 30 3b 20 20 2f 2a 20 49 66 20   = 2000;  /* If 
1720: 6e 6f 20 59 4d 44 20 73 70 65 63 69 66 69 65 64  no YMD specified
1730: 2c 20 61 73 73 75 6d 65 20 32 30 30 30 2d 4a 61  , assume 2000-Ja
1740: 6e 2d 30 31 20 2a 2f 0a 20 20 20 20 4d 20 3d 20  n-01 */.    M = 
1750: 31 3b 0a 20 20 20 20 44 20 3d 20 31 3b 0a 20 20  1;.    D = 1;.  
1760: 7d 0a 20 20 69 66 28 20 4d 3c 3d 32 20 29 7b 0a  }.  if( M<=2 ){.
1770: 20 20 20 20 59 2d 2d 3b 0a 20 20 20 20 4d 20 2b      Y--;.    M +
1780: 3d 20 31 32 3b 0a 20 20 7d 0a 20 20 41 20 3d 20  = 12;.  }.  A = 
1790: 59 2f 31 30 30 3b 0a 20 20 42 20 3d 20 32 20 2d  Y/100;.  B = 2 -
17a0: 20 41 20 2b 20 28 41 2f 34 29 3b 0a 20 20 58 31   A + (A/4);.  X1
17b0: 20 3d 20 33 36 35 2e 32 35 2a 28 59 2b 34 37 31   = 365.25*(Y+471
17c0: 36 29 3b 0a 20 20 58 32 20 3d 20 33 30 2e 36 30  6);.  X2 = 30.60
17d0: 30 31 2a 28 4d 2b 31 29 3b 0a 20 20 70 2d 3e 72  01*(M+1);.  p->r
17e0: 4a 44 20 3d 20 58 31 20 2b 20 58 32 20 2b 20 44  JD = X1 + X2 + D
17f0: 20 2b 20 42 20 2d 20 31 35 32 34 2e 35 3b 0a 20   + B - 1524.5;. 
1800: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b   p->validJD = 1;
1810: 0a 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d  .  p->validYMD =
1820: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c   0;.  if( p->val
1830: 69 64 48 4d 53 20 29 7b 0a 20 20 20 20 70 2d 3e  idHMS ){.    p->
1840: 72 4a 44 20 2b 3d 20 28 70 2d 3e 68 2a 33 36 30  rJD += (p->h*360
1850: 30 2e 30 20 2b 20 70 2d 3e 6d 2a 36 30 2e 30 20  0.0 + p->m*60.0 
1860: 2b 20 70 2d 3e 73 29 2f 38 36 34 30 30 2e 30 3b  + p->s)/86400.0;
1870: 0a 20 20 20 20 69 66 28 20 70 2d 3e 76 61 6c 69  .    if( p->vali
1880: 64 54 5a 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  dTZ ){.      p->
1890: 72 4a 44 20 2b 3d 20 70 2d 3e 74 7a 2a 36 30 2f  rJD += p->tz*60/
18a0: 38 36 34 30 30 2e 30 3b 0a 20 20 20 20 20 20 70  86400.0;.      p
18b0: 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 30 3b 0a  ->validHMS = 0;.
18c0: 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a        p->validTZ
18d0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
18e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 64  }../*.** Parse d
18f0: 61 74 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  ates of the form
1900: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d  .**.**     YYYY-
1910: 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 2e 46  MM-DD HH:MM:SS.F
1920: 46 46 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d  FF.**     YYYY-M
1930: 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2a  M-DD HH:MM:SS.**
1940: 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20       YYYY-MM-DD 
1950: 48 48 3a 4d 4d 0a 2a 2a 20 20 20 20 20 59 59 59  HH:MM.**     YYY
1960: 59 2d 4d 4d 2d 44 44 0a 2a 2a 0a 2a 2a 20 57 72  Y-MM-DD.**.** Wr
1970: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ite the result i
1980: 6e 74 6f 20 74 68 65 20 44 61 74 65 54 69 6d 65  nto the DateTime
1990: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
19a0: 65 74 75 72 6e 20 30 0a 2a 2a 20 6f 6e 20 73 75  eturn 0.** on su
19b0: 63 63 65 73 73 20 61 6e 64 20 31 20 69 66 20 74  ccess and 1 if t
19c0: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
19d0: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
19e0: 72 6d 65 64 0a 2a 2a 20 64 61 74 65 2e 0a 2a 2f  rmed.** date..*/
19f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 73  .static int pars
1a00: 65 59 79 79 79 4d 6d 44 64 28 63 6f 6e 73 74 20  eYyyyMmDd(const 
1a10: 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 44 61 74  char *zDate, Dat
1a20: 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  eTime *p){.  int
1a30: 20 59 2c 20 4d 2c 20 44 2c 20 6e 65 67 3b 0a 0a   Y, M, D, neg;..
1a40: 20 20 69 66 28 20 7a 44 61 74 65 5b 30 5d 3d 3d    if( zDate[0]==
1a50: 27 2d 27 20 29 7b 0a 20 20 20 20 7a 44 61 74 65  '-' ){.    zDate
1a60: 2b 2b 3b 0a 20 20 20 20 6e 65 67 20 3d 20 31 3b  ++;.    neg = 1;
1a70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65  .  }else{.    ne
1a80: 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  g = 0;.  }.  if(
1a90: 20 67 65 74 44 69 67 69 74 73 28 7a 44 61 74 65   getDigits(zDate
1aa0: 2c 34 2c 30 2c 39 39 39 39 2c 27 2d 27 2c 26 59  ,4,0,9999,'-',&Y
1ab0: 2c 32 2c 31 2c 31 32 2c 27 2d 27 2c 26 4d 2c 32  ,2,1,12,'-',&M,2
1ac0: 2c 31 2c 33 31 2c 30 2c 26 44 29 21 3d 33 20 29  ,1,31,0,&D)!=3 )
1ad0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1ae0: 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b 3d 20 31    }.  zDate += 1
1af0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70  0;.  while( issp
1b00: 61 63 65 28 2a 28 75 38 2a 29 7a 44 61 74 65 29  ace(*(u8*)zDate)
1b10: 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d 0a 20   ){ zDate++; }. 
1b20: 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73   if( parseHhMmSs
1b30: 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30 20 29 7b  (zDate, p)==0 ){
1b40: 0a 20 20 20 20 2f 2a 20 57 65 20 67 6f 74 20 74  .    /* We got t
1b50: 68 65 20 74 69 6d 65 20 2a 2f 0a 20 20 7d 65 6c  he time */.  }el
1b60: 73 65 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d 30  se if( *zDate==0
1b70: 20 29 7b 0a 20 20 20 20 70 2d 3e 76 61 6c 69 64   ){.    p->valid
1b80: 48 4d 53 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  HMS = 0;.  }else
1b90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1ba0: 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44    }.  p->validJD
1bb0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64   = 0;.  p->valid
1bc0: 59 4d 44 20 3d 20 31 3b 0a 20 20 70 2d 3e 59 20  YMD = 1;.  p->Y 
1bd0: 3d 20 6e 65 67 20 3f 20 2d 59 20 3a 20 59 3b 0a  = neg ? -Y : Y;.
1be0: 20 20 70 2d 3e 4d 20 3d 20 4d 3b 0a 20 20 70 2d    p->M = M;.  p-
1bf0: 3e 44 20 3d 20 44 3b 0a 20 20 69 66 28 20 70 2d  >D = D;.  if( p-
1c00: 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20 20 20 20  >validTZ ){.    
1c10: 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20  computeJD(p);.  
1c20: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1c30: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1c40: 6f 20 70 61 72 73 65 20 74 68 65 20 67 69 76 65  o parse the give
1c50: 6e 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  n string into a 
1c60: 4a 75 6c 69 61 6e 20 44 61 79 20 4e 75 6d 62 65  Julian Day Numbe
1c70: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  r.  Return.** th
1c80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1c90: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  rs..**.** The fo
1ca0: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 61 63 63 65  llowing are acce
1cb0: 70 74 61 62 6c 65 20 66 6f 72 6d 73 20 66 6f 72  ptable forms for
1cc0: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
1cd0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 59  g:.**.**      YY
1ce0: 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53  YY-MM-DD HH:MM:S
1cf0: 53 2e 46 46 46 20 20 2b 2f 2d 48 48 3a 4d 4d 0a  S.FFF  +/-HH:MM.
1d00: 2a 2a 20 20 20 20 20 20 44 44 44 44 2e 44 44 20  **      DDDD.DD 
1d10: 0a 2a 2a 20 20 20 20 20 20 6e 6f 77 0a 2a 2a 0a  .**      now.**.
1d20: 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74 20  ** In the first 
1d30: 66 6f 72 6d 2c 20 74 68 65 20 2b 2f 2d 48 48 3a  form, the +/-HH:
1d40: 4d 4d 20 69 73 20 61 6c 77 61 79 73 20 6f 70 74  MM is always opt
1d50: 69 6f 6e 61 6c 2e 20 20 54 68 65 20 66 72 61 63  ional.  The frac
1d60: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 65 63 6f 6e 64  tional.** second
1d70: 73 20 65 78 74 65 6e 73 69 6f 6e 20 28 74 68 65  s extension (the
1d80: 20 22 2e 46 46 46 22 29 20 69 73 20 6f 70 74 69   ".FFF") is opti
1d90: 6f 6e 61 6c 2e 20 20 54 68 65 20 73 65 63 6f 6e  onal.  The secon
1da0: 64 73 20 70 6f 72 74 69 6f 6e 0a 2a 2a 20 28 22  ds portion.** ("
1db0: 3a 53 53 2e 46 46 46 22 29 20 69 73 20 6f 70 74  :SS.FFF") is opt
1dc0: 69 6f 6e 2e 20 20 54 68 65 20 79 65 61 72 20 61  ion.  The year a
1dd0: 6e 64 20 64 61 74 65 20 63 61 6e 20 62 65 20 6f  nd date can be o
1de0: 6d 69 74 74 65 64 20 61 73 20 6c 6f 6e 67 0a 2a  mitted as long.*
1df0: 2a 20 61 73 20 74 68 65 72 65 20 69 73 20 61 20  * as there is a 
1e00: 74 69 6d 65 20 73 74 72 69 6e 67 2e 20 20 54 68  time string.  Th
1e10: 65 20 74 69 6d 65 20 73 74 72 69 6e 67 20 63 61  e time string ca
1e20: 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61 73 20  n be omitted as 
1e30: 6c 6f 6e 67 0a 2a 2a 20 61 73 20 74 68 65 72 65  long.** as there
1e40: 20 69 73 20 61 20 79 65 61 72 20 61 6e 64 20 64   is a year and d
1e50: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
1e60: 6e 74 20 70 61 72 73 65 44 61 74 65 4f 72 54 69  nt parseDateOrTi
1e70: 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
1e80: 44 61 74 65 2c 20 44 61 74 65 54 69 6d 65 20 2a  Date, DateTime *
1e90: 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
1ea0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
1eb0: 20 20 69 66 28 20 70 61 72 73 65 59 79 79 79 4d    if( parseYyyyM
1ec0: 6d 44 64 28 7a 44 61 74 65 2c 70 29 3d 3d 30 20  mDd(zDate,p)==0 
1ed0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1ee0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 61 72  .  }else if( par
1ef0: 73 65 48 68 4d 6d 53 73 28 7a 44 61 74 65 2c 20  seHhMmSs(zDate, 
1f00: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  p)==0 ){.    ret
1f10: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  urn 0;.  }else i
1f20: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1f30: 70 28 7a 44 61 74 65 2c 22 6e 6f 77 22 29 3d 3d  p(zDate,"now")==
1f40: 30 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  0){.    double r
1f50: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1f60: 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 26  3OsCurrentTime(&
1f70: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  r)==0 ){.      p
1f80: 2d 3e 72 4a 44 20 3d 20 72 3b 0a 20 20 20 20 20  ->rJD = r;.     
1f90: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b   p->validJD = 1;
1fa0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1fb0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1fc0: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 1;.  }else if(
1fd0: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 62 65 72   sqlite3IsNumber
1fe0: 28 7a 44 61 74 65 2c 20 30 2c 20 53 51 4c 49 54  (zDate, 0, SQLIT
1ff0: 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20 70  E_UTF8) ){.    p
2000: 2d 3e 72 4a 44 20 3d 20 73 71 6c 69 74 65 33 41  ->rJD = sqlite3A
2010: 74 6f 46 28 7a 44 61 74 65 2c 20 30 29 3b 0a 20  toF(zDate, 0);. 
2020: 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20     p->validJD = 
2030: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
2040: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
2060: 65 20 74 68 65 20 59 65 61 72 2c 20 4d 6f 6e 74  e the Year, Mont
2070: 68 2c 20 61 6e 64 20 44 61 79 20 66 72 6f 6d 20  h, and Day from 
2080: 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e  the julian day n
2090: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
20a0: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 59 4d 44   void computeYMD
20b0: 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20  (DateTime *p){. 
20c0: 20 69 6e 74 20 5a 2c 20 41 2c 20 42 2c 20 43 2c   int Z, A, B, C,
20d0: 20 44 2c 20 45 2c 20 58 31 3b 0a 20 20 69 66 28   D, E, X1;.  if(
20e0: 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 29 20 72   p->validYMD ) r
20f0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d  eturn;.  if( !p-
2100: 3e 76 61 6c 69 64 4a 44 20 29 7b 0a 20 20 20 20  >validJD ){.    
2110: 70 2d 3e 59 20 3d 20 32 30 30 30 3b 0a 20 20 20  p->Y = 2000;.   
2120: 20 70 2d 3e 4d 20 3d 20 31 3b 0a 20 20 20 20 70   p->M = 1;.    p
2130: 2d 3e 44 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ->D = 1;.  }else
2140: 7b 0a 20 20 20 20 5a 20 3d 20 70 2d 3e 72 4a 44  {.    Z = p->rJD
2150: 20 2b 20 30 2e 35 3b 0a 20 20 20 20 41 20 3d 20   + 0.5;.    A = 
2160: 28 5a 20 2d 20 31 38 36 37 32 31 36 2e 32 35 29  (Z - 1867216.25)
2170: 2f 33 36 35 32 34 2e 32 35 3b 0a 20 20 20 20 41  /36524.25;.    A
2180: 20 3d 20 5a 20 2b 20 31 20 2b 20 41 20 2d 20 28   = Z + 1 + A - (
2190: 41 2f 34 29 3b 0a 20 20 20 20 42 20 3d 20 41 20  A/4);.    B = A 
21a0: 2b 20 31 35 32 34 3b 0a 20 20 20 20 43 20 3d 20  + 1524;.    C = 
21b0: 28 42 20 2d 20 31 32 32 2e 31 29 2f 33 36 35 2e  (B - 122.1)/365.
21c0: 32 35 3b 0a 20 20 20 20 44 20 3d 20 33 36 35 2e  25;.    D = 365.
21d0: 32 35 2a 43 3b 0a 20 20 20 20 45 20 3d 20 28 42  25*C;.    E = (B
21e0: 2d 44 29 2f 33 30 2e 36 30 30 31 3b 0a 20 20 20  -D)/30.6001;.   
21f0: 20 58 31 20 3d 20 33 30 2e 36 30 30 31 2a 45 3b   X1 = 30.6001*E;
2200: 0a 20 20 20 20 70 2d 3e 44 20 3d 20 42 20 2d 20  .    p->D = B - 
2210: 44 20 2d 20 58 31 3b 0a 20 20 20 20 70 2d 3e 4d  D - X1;.    p->M
2220: 20 3d 20 45 3c 31 34 20 3f 20 45 2d 31 20 3a 20   = E<14 ? E-1 : 
2230: 45 2d 31 33 3b 0a 20 20 20 20 70 2d 3e 59 20 3d  E-13;.    p->Y =
2240: 20 70 2d 3e 4d 3e 32 20 3f 20 43 20 2d 20 34 37   p->M>2 ? C - 47
2250: 31 36 20 3a 20 43 20 2d 20 34 37 31 35 3b 0a 20  16 : C - 4715;. 
2260: 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44   }.  p->validYMD
2270: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 1;.}../*.** C
2280: 6f 6d 70 75 74 65 20 74 68 65 20 48 6f 75 72 2c  ompute the Hour,
2290: 20 4d 69 6e 75 74 65 2c 20 61 6e 64 20 53 65 63   Minute, and Sec
22a0: 6f 6e 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 75  onds from the ju
22b0: 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 2e  lian day number.
22c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22d0: 63 6f 6d 70 75 74 65 48 4d 53 28 44 61 74 65 54  computeHMS(DateT
22e0: 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 5a  ime *p){.  int Z
22f0: 2c 20 73 3b 0a 20 20 69 66 28 20 70 2d 3e 76 61  , s;.  if( p->va
2300: 6c 69 64 48 4d 53 20 29 20 72 65 74 75 72 6e 3b  lidHMS ) return;
2310: 0a 20 20 5a 20 3d 20 70 2d 3e 72 4a 44 20 2b 20  .  Z = p->rJD + 
2320: 30 2e 35 3b 0a 20 20 73 20 3d 20 28 70 2d 3e 72  0.5;.  s = (p->r
2330: 4a 44 20 2b 20 30 2e 35 20 2d 20 5a 29 2a 38 36  JD + 0.5 - Z)*86
2340: 34 30 30 30 30 30 2e 30 20 2b 20 30 2e 35 3b 0a  400000.0 + 0.5;.
2350: 20 20 70 2d 3e 73 20 3d 20 30 2e 30 30 31 2a 73    p->s = 0.001*s
2360: 3b 0a 20 20 73 20 3d 20 70 2d 3e 73 3b 0a 20 20  ;.  s = p->s;.  
2370: 70 2d 3e 73 20 2d 3d 20 73 3b 0a 20 20 70 2d 3e  p->s -= s;.  p->
2380: 68 20 3d 20 73 2f 33 36 30 30 3b 0a 20 20 73 20  h = s/3600;.  s 
2390: 2d 3d 20 70 2d 3e 68 2a 33 36 30 30 3b 0a 20 20  -= p->h*3600;.  
23a0: 70 2d 3e 6d 20 3d 20 73 2f 36 30 3b 0a 20 20 70  p->m = s/60;.  p
23b0: 2d 3e 73 20 2b 3d 20 73 20 2d 20 70 2d 3e 6d 2a  ->s += s - p->m*
23c0: 36 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 48 4d  60;.  p->validHM
23d0: 53 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  S = 1;.}../*.** 
23e0: 43 6f 6d 70 75 74 65 20 62 6f 74 68 20 59 4d 44  Compute both YMD
23f0: 20 61 6e 64 20 48 4d 53 0a 2a 2f 0a 73 74 61 74   and HMS.*/.stat
2400: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 59  ic void computeY
2410: 4d 44 5f 48 4d 53 28 44 61 74 65 54 69 6d 65 20  MD_HMS(DateTime 
2420: 2a 70 29 7b 0a 20 20 63 6f 6d 70 75 74 65 59 4d  *p){.  computeYM
2430: 44 28 70 29 3b 0a 20 20 63 6f 6d 70 75 74 65 48  D(p);.  computeH
2440: 4d 53 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  MS(p);.}../*.** 
2450: 43 6c 65 61 72 20 74 68 65 20 59 4d 44 20 61 6e  Clear the YMD an
2460: 64 20 48 4d 53 20 61 6e 64 20 74 68 65 20 54 5a  d HMS and the TZ
2470: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2480: 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28  clearYMD_HMS_TZ(
2490: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
24a0: 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d 20 30 3b  p->validYMD = 0;
24b0: 0a 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d  .  p->validHMS =
24c0: 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 54 5a   0;.  p->validTZ
24d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
24e0: 6f 6d 70 75 74 65 20 74 68 65 20 64 69 66 66 65  ompute the diffe
24f0: 72 65 6e 63 65 20 28 69 6e 20 64 61 79 73 29 20  rence (in days) 
2500: 62 65 74 77 65 65 6e 20 6c 6f 63 61 6c 74 69 6d  between localtim
2510: 65 20 61 6e 64 20 55 54 43 20 28 61 2e 6b 2e 61  e and UTC (a.k.a
2520: 2e 20 47 4d 54 29 0a 2a 2a 20 66 6f 72 20 74 68  . GMT).** for th
2530: 65 20 74 69 6d 65 20 76 61 6c 75 65 20 70 20 77  e time value p w
2540: 68 65 72 65 20 70 20 69 73 20 69 6e 20 55 54 43  here p is in UTC
2550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  ..*/.static doub
2560: 6c 65 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73  le localtimeOffs
2570: 65 74 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b  et(DateTime *p){
2580: 0a 20 20 44 61 74 65 54 69 6d 65 20 78 2c 20 79  .  DateTime x, y
2590: 3b 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ;.  time_t t;.  
25a0: 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a  struct tm *pTm;.
25b0: 20 20 78 20 3d 20 2a 70 3b 0a 20 20 63 6f 6d 70    x = *p;.  comp
25c0: 75 74 65 59 4d 44 5f 48 4d 53 28 26 78 29 3b 0a  uteYMD_HMS(&x);.
25d0: 20 20 69 66 28 20 78 2e 59 3c 31 39 37 31 20 7c    if( x.Y<1971 |
25e0: 7c 20 78 2e 59 3e 3d 32 30 33 38 20 29 7b 0a 20  | x.Y>=2038 ){. 
25f0: 20 20 20 78 2e 59 20 3d 20 32 30 30 30 3b 0a 20     x.Y = 2000;. 
2600: 20 20 20 78 2e 4d 20 3d 20 31 3b 0a 20 20 20 20     x.M = 1;.    
2610: 78 2e 44 20 3d 20 31 3b 0a 20 20 20 20 78 2e 68  x.D = 1;.    x.h
2620: 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6d 20 3d 20   = 0;.    x.m = 
2630: 30 3b 0a 20 20 20 20 78 2e 73 20 3d 20 30 2e 30  0;.    x.s = 0.0
2640: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
2650: 20 69 6e 74 20 73 20 3d 20 78 2e 73 20 2b 20 30   int s = x.s + 0
2660: 2e 35 3b 0a 20 20 20 20 78 2e 73 20 3d 20 73 3b  .5;.    x.s = s;
2670: 0a 20 20 7d 0a 20 20 78 2e 74 7a 20 3d 20 30 3b  .  }.  x.tz = 0;
2680: 0a 20 20 78 2e 76 61 6c 69 64 4a 44 20 3d 20 30  .  x.validJD = 0
2690: 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78  ;.  computeJD(&x
26a0: 29 3b 0a 20 20 74 20 3d 20 28 78 2e 72 4a 44 2d  );.  t = (x.rJD-
26b0: 32 34 34 30 35 38 37 2e 35 29 2a 38 36 34 30 30  2440587.5)*86400
26c0: 2e 30 20 2b 20 30 2e 35 3b 0a 20 20 73 71 6c 69  .0 + 0.5;.  sqli
26d0: 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
26e0: 29 3b 0a 20 20 70 54 6d 20 3d 20 6c 6f 63 61 6c  );.  pTm = local
26f0: 74 69 6d 65 28 26 74 29 3b 0a 20 20 79 2e 59 20  time(&t);.  y.Y 
2700: 3d 20 70 54 6d 2d 3e 74 6d 5f 79 65 61 72 20 2b  = pTm->tm_year +
2710: 20 31 39 30 30 3b 0a 20 20 79 2e 4d 20 3d 20 70   1900;.  y.M = p
2720: 54 6d 2d 3e 74 6d 5f 6d 6f 6e 20 2b 20 31 3b 0a  Tm->tm_mon + 1;.
2730: 20 20 79 2e 44 20 3d 20 70 54 6d 2d 3e 74 6d 5f    y.D = pTm->tm_
2740: 6d 64 61 79 3b 0a 20 20 79 2e 68 20 3d 20 70 54  mday;.  y.h = pT
2750: 6d 2d 3e 74 6d 5f 68 6f 75 72 3b 0a 20 20 79 2e  m->tm_hour;.  y.
2760: 6d 20 3d 20 70 54 6d 2d 3e 74 6d 5f 6d 69 6e 3b  m = pTm->tm_min;
2770: 0a 20 20 79 2e 73 20 3d 20 70 54 6d 2d 3e 74 6d  .  y.s = pTm->tm
2780: 5f 73 65 63 3b 0a 20 20 73 71 6c 69 74 65 33 4f  _sec;.  sqlite3O
2790: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
27a0: 20 79 2e 76 61 6c 69 64 59 4d 44 20 3d 20 31 3b   y.validYMD = 1;
27b0: 0a 20 20 79 2e 76 61 6c 69 64 48 4d 53 20 3d 20  .  y.validHMS = 
27c0: 31 3b 0a 20 20 79 2e 76 61 6c 69 64 4a 44 20 3d  1;.  y.validJD =
27d0: 20 30 3b 0a 20 20 79 2e 76 61 6c 69 64 54 5a 20   0;.  y.validTZ 
27e0: 3d 20 30 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44  = 0;.  computeJD
27f0: 28 26 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 79  (&y);.  return y
2800: 2e 72 4a 44 20 2d 20 78 2e 72 4a 44 3b 0a 7d 0a  .rJD - x.rJD;.}.
2810: 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61  ./*.** Process a
2820: 20 6d 6f 64 69 66 69 65 72 20 74 6f 20 61 20 64   modifier to a d
2830: 61 74 65 2d 74 69 6d 65 20 73 74 61 6d 70 2e 20  ate-time stamp. 
2840: 20 54 68 65 20 6d 6f 64 69 66 69 65 72 73 20 61   The modifiers a
2850: 72 65 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  re.** as follows
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20  :.**.**     NNN 
2870: 64 61 79 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20  days.**     NNN 
2880: 68 6f 75 72 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e  hours.**     NNN
2890: 20 6d 69 6e 75 74 65 73 0a 2a 2a 20 20 20 20 20   minutes.**     
28a0: 4e 4e 4e 2e 4e 4e 4e 4e 20 73 65 63 6f 6e 64 73  NNN.NNNN seconds
28b0: 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 6d 6f 6e 74  .**     NNN mont
28c0: 68 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 79 65  hs.**     NNN ye
28d0: 61 72 73 0a 2a 2a 20 20 20 20 20 73 74 61 72 74  ars.**     start
28e0: 20 6f 66 20 6d 6f 6e 74 68 0a 2a 2a 20 20 20 20   of month.**    
28f0: 20 73 74 61 72 74 20 6f 66 20 79 65 61 72 0a 2a   start of year.*
2900: 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 77  *     start of w
2910: 65 65 6b 0a 2a 2a 20 20 20 20 20 73 74 61 72 74  eek.**     start
2920: 20 6f 66 20 64 61 79 0a 2a 2a 20 20 20 20 20 77   of day.**     w
2930: 65 65 6b 64 61 79 20 4e 0a 2a 2a 20 20 20 20 20  eekday N.**     
2940: 75 6e 69 78 65 70 6f 63 68 0a 2a 2a 20 20 20 20  unixepoch.**    
2950: 20 6c 6f 63 61 6c 74 69 6d 65 0a 2a 2a 20 20 20   localtime.**   
2960: 20 20 75 74 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75    utc.**.** Retu
2970: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  rn 0 on success 
2980: 61 6e 64 20 31 20 69 66 20 74 68 65 72 65 20 69  and 1 if there i
2990: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 65 72  s any kind of er
29a0: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
29b0: 6e 74 20 70 61 72 73 65 4d 6f 64 69 66 69 65 72  nt parseModifier
29c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f  (const char *zMo
29d0: 64 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b  d, DateTime *p){
29e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a 20  .  int rc = 1;. 
29f0: 20 69 6e 74 20 6e 3b 0a 20 20 64 6f 75 62 6c 65   int n;.  double
2a00: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 7a   r;.  char *z, z
2a10: 42 75 66 5b 33 30 5d 3b 0a 20 20 7a 20 3d 20 7a  Buf[30];.  z = z
2a20: 42 75 66 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  Buf;.  for(n=0; 
2a30: 6e 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31  n<sizeof(zBuf)-1
2a40: 20 26 26 20 7a 4d 6f 64 5b 6e 5d 3b 20 6e 2b 2b   && zMod[n]; n++
2a50: 29 7b 0a 20 20 20 20 7a 5b 6e 5d 20 3d 20 74 6f  ){.    z[n] = to
2a60: 6c 6f 77 65 72 28 7a 4d 6f 64 5b 6e 5d 29 3b 0a  lower(zMod[n]);.
2a70: 20 20 7d 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a    }.  z[n] = 0;.
2a80: 20 20 73 77 69 74 63 68 28 20 7a 5b 30 5d 20 29    switch( z[0] )
2a90: 7b 0a 20 20 20 20 63 61 73 65 20 27 6c 27 3a 20  {.    case 'l': 
2aa0: 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 6c 6f  {.      /*    lo
2ab0: 63 61 6c 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  caltime.      **
2ac0: 0a 20 20 20 20 20 20 2a 2a 20 41 73 73 75 6d 69  .      ** Assumi
2ad0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
2ae0: 69 6d 65 20 76 61 6c 75 65 20 69 73 20 55 54 43  ime value is UTC
2af0: 20 28 61 2e 6b 2e 61 2e 20 47 4d 54 29 2c 20 73   (a.k.a. GMT), s
2b00: 68 69 66 74 20 69 74 20 74 6f 0a 20 20 20 20 20  hift it to.     
2b10: 20 2a 2a 20 73 68 6f 77 20 6c 6f 63 61 6c 20 74   ** show local t
2b20: 69 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ime..      */.  
2b30: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2b40: 2c 20 22 6c 6f 63 61 6c 74 69 6d 65 22 29 3d 3d  , "localtime")==
2b50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6d  0 ){.        com
2b60: 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20  puteJD(p);.     
2b70: 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 6c 6f 63     p->rJD += loc
2b80: 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 29 3b  altimeOffset(p);
2b90: 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d  .        clearYM
2ba0: 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20  D_HMS_TZ(p);.   
2bb0: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
2bc0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
2bd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2be0: 20 27 75 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a   'u': {.      /*
2bf0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 75 6e 69  .      **    uni
2c00: 78 65 70 6f 63 68 0a 20 20 20 20 20 20 2a 2a 0a  xepoch.      **.
2c10: 20 20 20 20 20 20 2a 2a 20 54 72 65 61 74 20 74        ** Treat t
2c20: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
2c30: 20 6f 66 20 70 2d 3e 72 4a 44 20 61 73 20 74 68   of p->rJD as th
2c40: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
2c50: 20 20 2a 2a 20 73 65 63 6f 6e 64 73 20 73 69 6e    ** seconds sin
2c60: 63 65 20 31 39 37 30 2e 20 20 43 6f 6e 76 65 72  ce 1970.  Conver
2c70: 74 20 74 6f 20 61 20 72 65 61 6c 20 6a 75 6c 69  t to a real juli
2c80: 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 2e 0a 20  an day number.. 
2c90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2ca0: 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 75 6e 69  ( strcmp(z, "uni
2cb0: 78 65 70 6f 63 68 22 29 3d 3d 30 20 26 26 20 70  xepoch")==0 && p
2cc0: 2d 3e 76 61 6c 69 64 4a 44 20 29 7b 0a 20 20 20  ->validJD ){.   
2cd0: 20 20 20 20 20 70 2d 3e 72 4a 44 20 3d 20 70 2d       p->rJD = p-
2ce0: 3e 72 4a 44 2f 38 36 34 30 30 2e 30 20 2b 20 32  >rJD/86400.0 + 2
2cf0: 34 34 30 35 38 37 2e 35 3b 0a 20 20 20 20 20 20  440587.5;.      
2d00: 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54    clearYMD_HMS_T
2d10: 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Z(p);.        rc
2d20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2d30: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
2d40: 22 75 74 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "utc")==0 ){.   
2d50: 20 20 20 20 20 64 6f 75 62 6c 65 20 63 31 3b 0a       double c1;.
2d60: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
2d70: 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20 63 31  D(p);.        c1
2d80: 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73   = localtimeOffs
2d90: 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  et(p);.        p
2da0: 2d 3e 72 4a 44 20 2d 3d 20 63 31 3b 0a 20 20 20  ->rJD -= c1;.   
2db0: 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d       clearYMD_HM
2dc0: 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20  S_TZ(p);.       
2dd0: 20 70 2d 3e 72 4a 44 20 2b 3d 20 63 31 20 2d 20   p->rJD += c1 - 
2de0: 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28  localtimeOffset(
2df0: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  p);.        rc =
2e00: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2e10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2e20: 20 20 20 63 61 73 65 20 27 77 27 3a 20 7b 0a 20     case 'w': {. 
2e30: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a       /*.      **
2e40: 20 20 20 20 77 65 65 6b 64 61 79 20 4e 0a 20 20      weekday N.  
2e50: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e60: 4d 6f 76 65 20 74 68 65 20 64 61 74 65 20 74 6f  Move the date to
2e70: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 6f   the same time o
2e80: 6e 20 74 68 65 20 6e 65 78 74 20 6f 63 63 75 72  n the next occur
2e90: 72 65 6e 63 65 20 6f 66 0a 20 20 20 20 20 20 2a  rence of.      *
2ea0: 2a 20 77 65 65 6b 64 61 79 20 4e 20 77 68 65 72  * weekday N wher
2eb0: 65 20 30 3d 3d 53 75 6e 64 61 79 2c 20 31 3d 3d  e 0==Sunday, 1==
2ec0: 4d 6f 6e 64 61 79 2c 20 61 6e 64 20 73 6f 20 66  Monday, and so f
2ed0: 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20  orth.  If the.  
2ee0: 20 20 20 20 2a 2a 20 64 61 74 65 20 69 73 20 61      ** date is a
2ef0: 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 61 70  lready on the ap
2f00: 70 72 6f 70 72 69 61 74 65 20 77 65 65 6b 64 61  propriate weekda
2f10: 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
2f20: 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  op..      */.   
2f30: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
2f40: 2c 20 22 77 65 65 6b 64 61 79 20 22 2c 20 38 29  , "weekday ", 8)
2f50: 3d 3d 30 20 26 26 20 67 65 74 56 61 6c 75 65 28  ==0 && getValue(
2f60: 26 7a 5b 38 5d 2c 26 72 29 3e 30 0a 20 20 20 20  &z[8],&r)>0.    
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2f80: 28 6e 3d 72 29 3d 3d 72 20 26 26 20 6e 3e 3d 30  (n=r)==r && n>=0
2f90: 20 26 26 20 72 3c 37 20 29 7b 0a 20 20 20 20 20   && r<7 ){.     
2fa0: 20 20 20 69 6e 74 20 5a 3b 0a 20 20 20 20 20 20     int Z;.      
2fb0: 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53    computeYMD_HMS
2fc0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
2fd0: 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 20  validTZ = 0;.   
2fe0: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20       p->validJD 
2ff0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  = 0;.        com
3000: 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20  puteJD(p);.     
3010: 20 20 20 5a 20 3d 20 70 2d 3e 72 4a 44 20 2b 20     Z = p->rJD + 
3020: 31 2e 35 3b 0a 20 20 20 20 20 20 20 20 5a 20 25  1.5;.        Z %
3030: 3d 20 37 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 7;.        if(
3040: 20 5a 3e 6e 20 29 20 5a 20 2d 3d 20 37 3b 0a 20   Z>n ) Z -= 7;. 
3050: 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d         p->rJD +=
3060: 20 6e 20 2d 20 5a 3b 0a 20 20 20 20 20 20 20 20   n - Z;.        
3070: 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28  clearYMD_HMS_TZ(
3080: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  p);.        rc =
3090: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
30a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
30b0: 20 20 20 63 61 73 65 20 27 73 27 3a 20 7b 0a 20     case 's': {. 
30c0: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a       /*.      **
30d0: 20 20 20 20 73 74 61 72 74 20 6f 66 20 54 54 54      start of TTT
30e0: 54 54 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  TT.      **.    
30f0: 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 61    ** Move the da
3100: 74 65 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20  te backwards to 
3110: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
3120: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 79   the current day
3130: 2c 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 6d 6f  ,.      ** or mo
3140: 6e 74 68 20 6f 72 20 79 65 61 72 2e 0a 20 20 20  nth or year..   
3150: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
3160: 73 74 72 6e 63 6d 70 28 7a 2c 20 22 73 74 61 72  strncmp(z, "star
3170: 74 20 6f 66 20 22 2c 20 39 29 21 3d 30 20 29 20  t of ", 9)!=0 ) 
3180: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7a 20 2b  break;.      z +
3190: 3d 20 39 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  = 9;.      compu
31a0: 74 65 59 4d 44 28 70 29 3b 0a 20 20 20 20 20 20  teYMD(p);.      
31b0: 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b  p->validHMS = 1;
31c0: 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 70 2d  .      p->h = p-
31d0: 3e 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  >m = 0;.      p-
31e0: 3e 73 20 3d 20 30 2e 30 3b 0a 20 20 20 20 20 20  >s = 0.0;.      
31f0: 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a  p->validTZ = 0;.
3200: 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44        p->validJD
3210: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
3220: 73 74 72 63 6d 70 28 7a 2c 22 6d 6f 6e 74 68 22  strcmp(z,"month"
3230: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3240: 70 2d 3e 44 20 3d 20 31 3b 0a 20 20 20 20 20 20  p->D = 1;.      
3250: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
3260: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
3270: 28 7a 2c 22 79 65 61 72 22 29 3d 3d 30 20 29 7b  (z,"year")==0 ){
3280: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
3290: 59 4d 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20  YMD(p);.        
32a0: 70 2d 3e 4d 20 3d 20 31 3b 0a 20 20 20 20 20 20  p->M = 1;.      
32b0: 20 20 70 2d 3e 44 20 3d 20 31 3b 0a 20 20 20 20    p->D = 1;.    
32c0: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
32d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
32e0: 6d 70 28 7a 2c 22 64 61 79 22 29 3d 3d 30 20 29  mp(z,"day")==0 )
32f0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30  {.        rc = 0
3300: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3310: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3320: 20 63 61 73 65 20 27 2b 27 3a 0a 20 20 20 20 63   case '+':.    c
3330: 61 73 65 20 27 2d 27 3a 0a 20 20 20 20 63 61 73  ase '-':.    cas
3340: 65 20 27 30 27 3a 0a 20 20 20 20 63 61 73 65 20  e '0':.    case 
3350: 27 31 27 3a 0a 20 20 20 20 63 61 73 65 20 27 32  '1':.    case '2
3360: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 33 27 3a  ':.    case '3':
3370: 0a 20 20 20 20 63 61 73 65 20 27 34 27 3a 0a 20  .    case '4':. 
3380: 20 20 20 63 61 73 65 20 27 35 27 3a 0a 20 20 20     case '5':.   
3390: 20 63 61 73 65 20 27 36 27 3a 0a 20 20 20 20 63   case '6':.    c
33a0: 61 73 65 20 27 37 27 3a 0a 20 20 20 20 63 61 73  ase '7':.    cas
33b0: 65 20 27 38 27 3a 0a 20 20 20 20 63 61 73 65 20  e '8':.    case 
33c0: 27 39 27 3a 20 7b 0a 20 20 20 20 20 20 6e 20 3d  '9': {.      n =
33d0: 20 67 65 74 56 61 6c 75 65 28 7a 2c 20 26 72 29   getValue(z, &r)
33e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3c 3d 30  ;.      if( n<=0
33f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3400: 69 66 28 20 7a 5b 6e 5d 3d 3d 27 3a 27 20 29 7b  if( z[n]==':' ){
3410: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6d 6f  .        /* A mo
3420: 64 69 66 69 65 72 20 6f 66 20 74 68 65 20 66 6f  difier of the fo
3430: 72 6d 20 28 2b 7c 2d 29 48 48 3a 4d 4d 3a 53 53  rm (+|-)HH:MM:SS
3440: 2e 46 46 46 20 61 64 64 73 20 28 6f 72 20 73 75  .FFF adds (or su
3450: 62 74 72 61 63 74 73 29 20 74 68 65 0a 20 20 20  btracts) the.   
3460: 20 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65       ** specifie
3470: 64 20 6e 75 6d 62 65 72 20 6f 66 20 68 6f 75 72  d number of hour
3480: 73 2c 20 6d 69 6e 75 74 65 73 2c 20 73 65 63 6f  s, minutes, seco
3490: 6e 64 73 2c 20 61 6e 64 20 66 72 61 63 74 69 6f  nds, and fractio
34a0: 6e 61 6c 20 73 65 63 6f 6e 64 73 0a 20 20 20 20  nal seconds.    
34b0: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 69      ** to the ti
34c0: 6d 65 2e 20 20 54 68 65 20 22 2e 46 46 46 22 20  me.  The ".FFF" 
34d0: 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  may be omitted. 
34e0: 20 54 68 65 20 22 3a 53 53 2e 46 46 46 22 20 6d   The ":SS.FFF" m
34f0: 61 79 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ay be.        **
3500: 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
3510: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
3520: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
3530: 0a 20 20 20 20 20 20 20 20 44 61 74 65 54 69 6d  .        DateTim
3540: 65 20 74 78 3b 0a 20 20 20 20 20 20 20 20 69 6e  e tx;.        in
3550: 74 20 64 61 79 3b 0a 20 20 20 20 20 20 20 20 69  t day;.        i
3560: 66 28 20 21 69 73 64 69 67 69 74 28 2a 28 75 38  f( !isdigit(*(u8
3570: 2a 29 7a 32 29 20 29 20 7a 32 2b 2b 3b 0a 20 20  *)z2) ) z2++;.  
3580: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 74 78        memset(&tx
3590: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 78 29 29  , 0, sizeof(tx))
35a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 61  ;.        if( pa
35b0: 72 73 65 48 68 4d 6d 53 73 28 7a 32 2c 20 26 74  rseHhMmSs(z2, &t
35c0: 78 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  x) ) break;.    
35d0: 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 74      computeJD(&t
35e0: 78 29 3b 0a 20 20 20 20 20 20 20 20 74 78 2e 72  x);.        tx.r
35f0: 4a 44 20 2d 3d 20 30 2e 35 3b 0a 20 20 20 20 20  JD -= 0.5;.     
3600: 20 20 20 64 61 79 20 3d 20 28 69 6e 74 29 74 78     day = (int)tx
3610: 2e 72 4a 44 3b 0a 20 20 20 20 20 20 20 20 74 78  .rJD;.        tx
3620: 2e 72 4a 44 20 2d 3d 20 64 61 79 3b 0a 20 20 20  .rJD -= day;.   
3630: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
3640: 2d 27 20 29 20 74 78 2e 72 4a 44 20 3d 20 2d 74  -' ) tx.rJD = -t
3650: 78 2e 72 4a 44 3b 0a 20 20 20 20 20 20 20 20 63  x.rJD;.        c
3660: 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20  omputeJD(p);.   
3670: 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d       clearYMD_HM
3680: 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20  S_TZ(p);.       
3690: 70 2d 3e 72 4a 44 20 2b 3d 20 74 78 2e 72 4a 44  p->rJD += tx.rJD
36a0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30  ;.        rc = 0
36b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
36c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
36d0: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 77 68 69   += n;.      whi
36e0: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
36f0: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
3700: 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b    n = strlen(z);
3710: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 31 30 20  .      if( n>10 
3720: 7c 7c 20 6e 3c 33 20 29 20 62 72 65 61 6b 3b 0a  || n<3 ) break;.
3730: 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 2d 31 5d        if( z[n-1]
3740: 3d 3d 27 73 27 20 29 7b 20 7a 5b 6e 2d 31 5d 20  =='s' ){ z[n-1] 
3750: 3d 20 30 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20  = 0; n--; }.    
3760: 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a    computeJD(p);.
3770: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
3780: 20 20 20 20 69 66 28 20 6e 3d 3d 33 20 26 26 20      if( n==3 && 
3790: 73 74 72 63 6d 70 28 7a 2c 22 64 61 79 22 29 3d  strcmp(z,"day")=
37a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
37b0: 3e 72 4a 44 20 2b 3d 20 72 3b 0a 20 20 20 20 20  >rJD += r;.     
37c0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 34 20   }else if( n==4 
37d0: 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 68 6f 75  && strcmp(z,"hou
37e0: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
37f0: 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 72 2f 32 34    p->rJD += r/24
3800: 2e 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  .0;.      }else 
3810: 69 66 28 20 6e 3d 3d 36 20 26 26 20 73 74 72 63  if( n==6 && strc
3820: 6d 70 28 7a 2c 22 6d 69 6e 75 74 65 22 29 3d 3d  mp(z,"minute")==
3830: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
3840: 72 4a 44 20 2b 3d 20 72 2f 28 32 34 2e 30 2a 36  rJD += r/(24.0*6
3850: 30 2e 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  0.0);.      }els
3860: 65 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 73 74  e if( n==6 && st
3870: 72 63 6d 70 28 7a 2c 22 73 65 63 6f 6e 64 22 29  rcmp(z,"second")
3880: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3890: 2d 3e 72 4a 44 20 2b 3d 20 72 2f 28 32 34 2e 30  ->rJD += r/(24.0
38a0: 2a 36 30 2e 30 2a 36 30 2e 30 29 3b 0a 20 20 20  *60.0*60.0);.   
38b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d     }else if( n==
38c0: 35 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d  5 && strcmp(z,"m
38d0: 6f 6e 74 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  onth")==0 ){.   
38e0: 20 20 20 20 20 69 6e 74 20 78 2c 20 79 3b 0a 20       int x, y;. 
38f0: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d         computeYM
3900: 44 5f 48 4d 53 28 70 29 3b 0a 20 20 20 20 20 20  D_HMS(p);.      
3910: 20 20 70 2d 3e 4d 20 2b 3d 20 72 3b 0a 20 20 20    p->M += r;.   
3920: 20 20 20 20 20 78 20 3d 20 70 2d 3e 4d 3e 30 20       x = p->M>0 
3930: 3f 20 28 70 2d 3e 4d 2d 31 29 2f 31 32 20 3a 20  ? (p->M-1)/12 : 
3940: 28 70 2d 3e 4d 2d 31 32 29 2f 31 32 3b 0a 20 20  (p->M-12)/12;.  
3950: 20 20 20 20 20 20 70 2d 3e 59 20 2b 3d 20 78 3b        p->Y += x;
3960: 0a 20 20 20 20 20 20 20 20 70 2d 3e 4d 20 2d 3d  .        p->M -=
3970: 20 78 2a 31 32 3b 0a 20 20 20 20 20 20 20 20 70   x*12;.        p
3980: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20  ->validJD = 0;. 
3990: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44         computeJD
39a0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 79 20 3d  (p);.        y =
39b0: 20 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   r;.        if( 
39c0: 79 21 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20  y!=r ){.        
39d0: 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 28 72 20 2d    p->rJD += (r -
39e0: 20 79 29 2a 33 30 2e 30 3b 0a 20 20 20 20 20 20   y)*30.0;.      
39f0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
3a00: 69 66 28 20 6e 3d 3d 34 20 26 26 20 73 74 72 63  if( n==4 && strc
3a10: 6d 70 28 7a 2c 22 79 65 61 72 22 29 3d 3d 30 20  mp(z,"year")==0 
3a20: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  ){.        compu
3a30: 74 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a 20 20  teYMD_HMS(p);.  
3a40: 20 20 20 20 20 20 70 2d 3e 59 20 2b 3d 20 72 3b        p->Y += r;
3a50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 76 61 6c 69  .        p->vali
3a60: 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dJD = 0;.       
3a70: 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20   computeJD(p);. 
3a80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3a90: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
3aa0: 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 59    }.      clearY
3ab0: 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20  MD_HMS_TZ(p);.  
3ac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3ad0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
3ae0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3af0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3b00: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  rc;.}../*.** Pro
3b10: 63 65 73 73 20 74 69 6d 65 20 66 75 6e 63 74 69  cess time functi
3b20: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 61  on arguments.  a
3b30: 72 67 76 5b 30 5d 20 69 73 20 61 20 64 61 74 65  rgv[0] is a date
3b40: 2d 74 69 6d 65 20 73 74 61 6d 70 2e 0a 2a 2a 20  -time stamp..** 
3b50: 61 72 67 76 5b 31 5d 20 61 6e 64 20 66 6f 6c 6c  argv[1] and foll
3b60: 6f 77 69 6e 67 20 61 72 65 20 6d 6f 64 69 66 69  owing are modifi
3b70: 65 72 73 2e 20 20 50 61 72 73 65 20 74 68 65 6d  ers.  Parse them
3b80: 20 61 6c 6c 20 61 6e 64 20 77 72 69 74 65 0a 2a   all and write.*
3b90: 2a 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  * the resulting 
3ba0: 74 69 6d 65 20 69 6e 74 6f 20 74 68 65 20 44 61  time into the Da
3bb0: 74 65 54 69 6d 65 20 73 74 72 75 63 74 75 72 65  teTime structure
3bc0: 20 70 2e 20 20 52 65 74 75 72 6e 20 30 0a 2a 2a   p.  Return 0.**
3bd0: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
3be0: 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  1 if there are a
3bf0: 6e 79 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74  ny errors..*/.st
3c00: 61 74 69 63 20 69 6e 74 20 69 73 44 61 74 65 28  atic int isDate(
3c10: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
3c20: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 2c 20  3_value **argv, 
3c30: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
3c40: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
3c50: 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
3c60: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55  .  if( SQLITE_NU
3c70: 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL==sqlite3_valu
3c80: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
3c90: 7c 7c 20 0a 20 20 20 20 20 20 70 61 72 73 65 44  || .      parseD
3ca0: 61 74 65 4f 72 54 69 6d 65 28 73 71 6c 69 74 65  ateOrTime(sqlite
3cb0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
3cc0: 76 5b 30 5d 29 2c 20 70 29 20 29 20 72 65 74 75  v[0]), p) ) retu
3cd0: 72 6e 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  rn 1;.  for(i=1;
3ce0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
3cf0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55     if( SQLITE_NU
3d00: 4c 4c 3d 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL==sqlite3_valu
3d10: 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20  e_type(argv[i]) 
3d20: 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 61 72 73  || .        pars
3d30: 65 4d 6f 64 69 66 69 65 72 28 73 71 6c 69 74 65  eModifier(sqlite
3d40: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
3d50: 76 5b 69 5d 29 2c 20 70 29 20 29 20 72 65 74 75  v[i]), p) ) retu
3d60: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
3d70: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
3d80: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
3d90: 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
3da0: 20 74 68 65 20 76 61 72 69 6f 75 73 20 64 61 74   the various dat
3db0: 65 20 61 6e 64 20 74 69 6d 65 20 66 75 6e 63 74  e and time funct
3dc0: 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
3dd0: 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  e..*/../*.**    
3de0: 6a 75 6c 69 61 6e 64 61 79 28 20 54 49 4d 45 53  julianday( TIMES
3df0: 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c  TRING, MOD, MOD,
3e00: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ...).**.** Retu
3e10: 72 6e 20 74 68 65 20 6a 75 6c 69 61 6e 20 64 61  rn the julian da
3e20: 79 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  y number of the 
3e30: 64 61 74 65 20 73 70 65 63 69 66 69 65 64 20 69  date specified i
3e40: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 0a  n the arguments.
3e50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
3e60: 75 6c 69 61 6e 64 61 79 46 75 6e 63 28 0a 20 20  uliandayFunc(.  
3e70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3e80: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
3e90: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
3ea0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
3eb0: 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20    DateTime x;.  
3ec0: 69 66 28 20 69 73 44 61 74 65 28 61 72 67 63 2c  if( isDate(argc,
3ed0: 20 61 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b   argv, &x)==0 ){
3ee0: 0a 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26  .    computeJD(&
3ef0: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
3f00: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
3f10: 6e 74 65 78 74 2c 20 78 2e 72 4a 44 29 3b 0a 20  ntext, x.rJD);. 
3f20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64   }.}../*.**    d
3f30: 61 74 65 74 69 6d 65 28 20 54 49 4d 45 53 54 52  atetime( TIMESTR
3f40: 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e  ING, MOD, MOD, .
3f50: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ..).**.** Return
3f60: 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d   YYYY-MM-DD HH:M
3f70: 4d 3a 53 53 0a 2a 2f 0a 73 74 61 74 69 63 20 76  M:SS.*/.static v
3f80: 6f 69 64 20 64 61 74 65 74 69 6d 65 46 75 6e 63  oid datetimeFunc
3f90: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
3fa0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
3fb0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
3fc0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
3fd0: 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78  .){.  DateTime x
3fe0: 3b 0a 20 20 69 66 28 20 69 73 44 61 74 65 28 61  ;.  if( isDate(a
3ff0: 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d  rgc, argv, &x)==
4000: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
4010: 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6d  uf[100];.    com
4020: 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78 29 3b  puteYMD_HMS(&x);
4030: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
4040: 66 2c 20 22 25 30 34 64 2d 25 30 32 64 2d 25 30  f, "%04d-%02d-%0
4050: 32 64 20 25 30 32 64 3a 25 30 32 64 3a 25 30 32  2d %02d:%02d:%02
4060: 64 22 2c 78 2e 59 2c 20 78 2e 4d 2c 20 78 2e 44  d",x.Y, x.M, x.D
4070: 2c 20 78 2e 68 2c 20 78 2e 6d 2c 0a 20 20 20 20  , x.h, x.m,.    
4080: 20 20 20 20 20 20 20 28 69 6e 74 29 28 78 2e 73         (int)(x.s
4090: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
40a0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
40b0: 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53  ext, zBuf, -1, S
40c0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
40d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  ;.  }.}../*.**  
40e0: 20 20 74 69 6d 65 28 20 54 49 4d 45 53 54 52 49    time( TIMESTRI
40f0: 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e  NG, MOD, MOD, ..
4100: 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .).**.** Return 
4110: 48 48 3a 4d 4d 3a 53 53 0a 2a 2f 0a 73 74 61 74  HH:MM:SS.*/.stat
4120: 69 63 20 76 6f 69 64 20 74 69 6d 65 46 75 6e 63  ic void timeFunc
4130: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
4140: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
4150: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
4160: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
4170: 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78  .){.  DateTime x
4180: 3b 0a 20 20 69 66 28 20 69 73 44 61 74 65 28 61  ;.  if( isDate(a
4190: 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d  rgc, argv, &x)==
41a0: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
41b0: 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6d  uf[100];.    com
41c0: 70 75 74 65 48 4d 53 28 26 78 29 3b 0a 20 20 20  puteHMS(&x);.   
41d0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
41e0: 25 30 32 64 3a 25 30 32 64 3a 25 30 32 64 22 2c  %02d:%02d:%02d",
41f0: 20 78 2e 68 2c 20 78 2e 6d 2c 20 28 69 6e 74 29   x.h, x.m, (int)
4200: 78 2e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x.s);.    sqlite
4210: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
4220: 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c  ntext, zBuf, -1,
4230: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
4240: 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  T);.  }.}../*.**
4250: 20 20 20 20 64 61 74 65 28 20 54 49 4d 45 53 54      date( TIMEST
4260: 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20  RING, MOD, MOD, 
4270: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ...).**.** Retur
4280: 6e 20 59 59 59 59 2d 4d 4d 2d 44 44 0a 2a 2f 0a  n YYYY-MM-DD.*/.
4290: 73 74 61 74 69 63 20 76 6f 69 64 20 64 61 74 65  static void date
42a0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
42b0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
42c0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
42d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
42e0: 61 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69  argv.){.  DateTi
42f0: 6d 65 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61  me x;.  if( isDa
4300: 74 65 28 61 72 67 63 2c 20 61 72 67 76 2c 20 26  te(argc, argv, &
4310: 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  x)==0 ){.    cha
4320: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20  r zBuf[100];.   
4330: 20 63 6f 6d 70 75 74 65 59 4d 44 28 26 78 29 3b   computeYMD(&x);
4340: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
4350: 66 2c 20 22 25 30 34 64 2d 25 30 32 64 2d 25 30  f, "%04d-%02d-%0
4360: 32 64 22 2c 20 78 2e 59 2c 20 78 2e 4d 2c 20 78  2d", x.Y, x.M, x
4370: 2e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  .D);.    sqlite3
4380: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
4390: 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20  text, zBuf, -1, 
43a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
43b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
43c0: 20 20 20 73 74 72 66 74 69 6d 65 28 20 46 4f 52     strftime( FOR
43d0: 4d 41 54 2c 20 54 49 4d 45 53 54 52 49 4e 47 2c  MAT, TIMESTRING,
43e0: 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a   MOD, MOD, ...).
43f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  **.** Return a s
4400: 74 72 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  tring described 
4410: 62 79 20 46 4f 52 4d 41 54 2e 20 20 43 6f 6e 76  by FORMAT.  Conv
4420: 65 72 73 69 6f 6e 73 20 61 73 20 66 6f 6c 6c 6f  ersions as follo
4430: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25 64 20 20  ws:.**.**   %d  
4440: 64 61 79 20 6f 66 20 6d 6f 6e 74 68 0a 2a 2a 20  day of month.** 
4450: 20 20 25 66 20 20 2a 2a 20 66 72 61 63 74 69 6f    %f  ** fractio
4460: 6e 61 6c 20 73 65 63 6f 6e 64 73 20 20 53 53 2e  nal seconds  SS.
4470: 53 53 53 0a 2a 2a 20 20 20 25 48 20 20 68 6f 75  SSS.**   %H  hou
4480: 72 20 30 30 2d 32 34 0a 2a 2a 20 20 20 25 6a 20  r 00-24.**   %j 
4490: 20 64 61 79 20 6f 66 20 79 65 61 72 20 30 30 30   day of year 000
44a0: 2d 33 36 36 0a 2a 2a 20 20 20 25 4a 20 20 2a 2a  -366.**   %J  **
44b0: 20 4a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62   Julian day numb
44c0: 65 72 0a 2a 2a 20 20 20 25 6d 20 20 6d 6f 6e 74  er.**   %m  mont
44d0: 68 20 30 31 2d 31 32 0a 2a 2a 20 20 20 25 4d 20  h 01-12.**   %M 
44e0: 20 6d 69 6e 75 74 65 20 30 30 2d 35 39 0a 2a 2a   minute 00-59.**
44f0: 20 20 20 25 73 20 20 73 65 63 6f 6e 64 73 20 73     %s  seconds s
4500: 69 6e 63 65 20 31 39 37 30 2d 30 31 2d 30 31 0a  ince 1970-01-01.
4510: 2a 2a 20 20 20 25 53 20 20 73 65 63 6f 6e 64 73  **   %S  seconds
4520: 20 30 30 2d 35 39 0a 2a 2a 20 20 20 25 77 20 20   00-59.**   %w  
4530: 64 61 79 20 6f 66 20 77 65 65 6b 20 30 2d 36 20  day of week 0-6 
4540: 20 73 75 6e 64 61 79 3d 3d 30 0a 2a 2a 20 20 20   sunday==0.**   
4550: 25 57 20 20 77 65 65 6b 20 6f 66 20 79 65 61 72  %W  week of year
4560: 20 30 30 2d 35 33 0a 2a 2a 20 20 20 25 59 20 20   00-53.**   %Y  
4570: 79 65 61 72 20 30 30 30 30 2d 39 39 39 39 0a 2a  year 0000-9999.*
4580: 2a 20 20 20 25 25 20 20 25 0a 2a 2f 0a 73 74 61  *   %%  %.*/.sta
4590: 74 69 63 20 76 6f 69 64 20 73 74 72 66 74 69 6d  tic void strftim
45a0: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
45b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
45c0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
45d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
45e0: 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54  *argv.){.  DateT
45f0: 69 6d 65 20 78 3b 0a 20 20 69 6e 74 20 6e 2c 20  ime x;.  int n, 
4600: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  i, j;.  char *z;
4610: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4620: 46 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Fmt = sqlite3_va
4630: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
4640: 29 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  );.  char zBuf[1
4650: 30 30 5d 3b 0a 20 20 69 66 28 20 7a 46 6d 74 3d  00];.  if( zFmt=
4660: 3d 30 20 7c 7c 20 69 73 44 61 74 65 28 61 72 67  =0 || isDate(arg
4670: 63 2d 31 2c 20 61 72 67 76 2b 31 2c 20 26 78 29  c-1, argv+1, &x)
4680: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
4690: 28 69 3d 30 2c 20 6e 3d 31 3b 20 7a 46 6d 74 5b  (i=0, n=1; zFmt[
46a0: 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20  i]; i++, n++){. 
46b0: 20 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d     if( zFmt[i]==
46c0: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 73 77 69  '%' ){.      swi
46d0: 74 63 68 28 20 7a 46 6d 74 5b 69 2b 31 5d 20 29  tch( zFmt[i+1] )
46e0: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  {.        case '
46f0: 64 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  d':.        case
4700: 20 27 48 27 3a 0a 20 20 20 20 20 20 20 20 63 61   'H':.        ca
4710: 73 65 20 27 6d 27 3a 0a 20 20 20 20 20 20 20 20  se 'm':.        
4720: 63 61 73 65 20 27 4d 27 3a 0a 20 20 20 20 20 20  case 'M':.      
4730: 20 20 63 61 73 65 20 27 53 27 3a 0a 20 20 20 20    case 'S':.    
4740: 20 20 20 20 63 61 73 65 20 27 57 27 3a 0a 20 20      case 'W':.  
4750: 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
4760: 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74         /* fall t
4770: 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hru */.        c
4780: 61 73 65 20 27 77 27 3a 0a 20 20 20 20 20 20 20  ase 'w':.       
4790: 20 63 61 73 65 20 27 25 27 3a 0a 20 20 20 20 20   case '%':.     
47a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
47b0: 20 20 20 20 63 61 73 65 20 27 66 27 3a 0a 20 20      case 'f':.  
47c0: 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 38 3b 0a          n += 8;.
47d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
47e0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 6a  .        case 'j
47f0: 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b  ':.          n +
4800: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 3;.          b
4810: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
4820: 73 65 20 27 59 27 3a 0a 20 20 20 20 20 20 20 20  se 'Y':.        
4830: 20 20 6e 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20    n += 8;.      
4840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4850: 20 20 20 63 61 73 65 20 27 73 27 3a 0a 20 20 20     case 's':.   
4860: 20 20 20 20 20 63 61 73 65 20 27 4a 27 3a 0a 20       case 'J':. 
4870: 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 35 30           n += 50
4880: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4890: 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
48a0: 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 72 65  lt:.          re
48b0: 74 75 72 6e 3b 20 20 2f 2a 20 45 52 52 4f 52 2e  turn;  /* ERROR.
48c0: 20 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20    return a NULL 
48d0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
48e0: 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i++;.    }.  }.
48f0: 20 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28 7a    if( n<sizeof(z
4900: 42 75 66 29 20 29 7b 0a 20 20 20 20 7a 20 3d 20  Buf) ){.    z = 
4910: 7a 42 75 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  zBuf;.  }else{. 
4920: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c     z = sqliteMal
4930: 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20 69 66  loc( n );.    if
4940: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( z==0 ) return;
4950: 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4a 44  .  }.  computeJD
4960: 28 26 78 29 3b 0a 20 20 63 6f 6d 70 75 74 65 59  (&x);.  computeY
4970: 4d 44 5f 48 4d 53 28 26 78 29 3b 0a 20 20 66 6f  MD_HMS(&x);.  fo
4980: 72 28 69 3d 6a 3d 30 3b 20 7a 46 6d 74 5b 69 5d  r(i=j=0; zFmt[i]
4990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
49a0: 7a 46 6d 74 5b 69 5d 21 3d 27 25 27 20 29 7b 0a  zFmt[i]!='%' ){.
49b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
49c0: 46 6d 74 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  Fmt[i];.    }els
49d0: 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  e{.      i++;.  
49e0: 20 20 20 20 73 77 69 74 63 68 28 20 7a 46 6d 74      switch( zFmt
49f0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  [i] ){.        c
4a00: 61 73 65 20 27 64 27 3a 20 20 73 70 72 69 6e 74  ase 'd':  sprint
4a10: 66 28 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78  f(&z[j],"%02d",x
4a20: 2e 44 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b  .D); j+=2; break
4a30: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
4a40: 66 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  f': {.          
4a50: 69 6e 74 20 73 20 3d 20 78 2e 73 3b 0a 20 20 20  int s = x.s;.   
4a60: 20 20 20 20 20 20 20 69 6e 74 20 6d 73 20 3d 20         int ms = 
4a70: 28 78 2e 73 20 2d 20 73 29 2a 31 30 30 30 2e 30  (x.s - s)*1000.0
4a80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 72 69  ;.          spri
4a90: 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 30 32 64 2e  ntf(&z[j],"%02d.
4aa0: 25 30 33 64 22 2c 73 2c 6d 73 29 3b 0a 20 20 20  %03d",s,ms);.   
4ab0: 20 20 20 20 20 20 20 6a 20 2b 3d 20 73 74 72 6c         j += strl
4ac0: 65 6e 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20  en(&z[j]);.     
4ad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4ae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
4af0: 73 65 20 27 48 27 3a 20 20 73 70 72 69 6e 74 66  se 'H':  sprintf
4b00: 28 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e  (&z[j],"%02d",x.
4b10: 68 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b  h); j+=2; break;
4b20: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 57  .        case 'W
4b30: 27 3a 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20  ': /* Fall thru 
4b40: 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  */.        case 
4b50: 27 6a 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  'j': {.         
4b60: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
4b70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4b80: 20 64 61 79 73 20 73 69 6e 63 65 20 31 73 74 20   days since 1st 
4b90: 64 61 79 20 6f 66 20 79 65 61 72 20 2a 2f 0a 20  day of year */. 
4ba0: 20 20 20 20 20 20 20 20 20 44 61 74 65 54 69 6d           DateTim
4bb0: 65 20 79 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  e y = x;.       
4bc0: 20 20 20 79 2e 76 61 6c 69 64 4a 44 20 3d 20 30     y.validJD = 0
4bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 79 2e 4d 20  ;.          y.M 
4be0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 79  = 1;.          y
4bf0: 2e 44 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  .D = 1;.        
4c00: 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 79 29 3b    computeJD(&y);
4c10: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 78  .          n = x
4c20: 2e 72 4a 44 20 2d 20 79 2e 72 4a 44 3b 0a 20 20  .rJD - y.rJD;.  
4c30: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 6d 74          if( zFmt
4c40: 5b 69 5d 3d 3d 27 57 27 20 29 7b 0a 20 20 20 20  [i]=='W' ){.    
4c50: 20 20 20 20 20 20 20 20 69 6e 74 20 77 64 3b 20          int wd; 
4c60: 20 20 2f 2a 20 30 3d 4d 6f 6e 64 61 79 2c 20 31    /* 0=Monday, 1
4c70: 3d 54 75 65 73 64 61 79 2c 20 2e 2e 2e 20 36 3d  =Tuesday, ... 6=
4c80: 53 75 6e 64 61 79 20 2a 2f 0a 20 20 20 20 20 20  Sunday */.      
4c90: 20 20 20 20 20 20 77 64 20 3d 20 28 28 69 6e 74        wd = ((int
4ca0: 29 28 78 2e 72 4a 44 2b 30 2e 35 29 29 20 25 20  )(x.rJD+0.5)) % 
4cb0: 37 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  7;.            s
4cc0: 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 30  printf(&z[j],"%0
4cd0: 32 64 22 2c 28 6e 2b 37 2d 77 64 29 2f 37 29 3b  2d",(n+7-wd)/7);
4ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 2b  .            j +
4cf0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 2;.          }
4d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
4d10: 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c    sprintf(&z[j],
4d20: 22 25 30 33 64 22 2c 6e 2b 31 29 3b 0a 20 20 20  "%03d",n+1);.   
4d30: 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 33 3b           j += 3;
4d40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4d50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4d70: 63 61 73 65 20 27 4a 27 3a 20 20 73 70 72 69 6e  case 'J':  sprin
4d80: 74 66 28 26 7a 5b 6a 5d 2c 22 25 2e 31 36 67 22  tf(&z[j],"%.16g"
4d90: 2c 78 2e 72 4a 44 29 3b 20 6a 2b 3d 73 74 72 6c  ,x.rJD); j+=strl
4da0: 65 6e 28 26 7a 5b 6a 5d 29 3b 20 62 72 65 61 6b  en(&z[j]); break
4db0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
4dc0: 6d 27 3a 20 20 73 70 72 69 6e 74 66 28 26 7a 5b  m':  sprintf(&z[
4dd0: 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 4d 29 3b 20  j],"%02d",x.M); 
4de0: 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20  j+=2; break;.   
4df0: 20 20 20 20 20 63 61 73 65 20 27 4d 27 3a 20 20       case 'M':  
4e00: 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25  sprintf(&z[j],"%
4e10: 30 32 64 22 2c 78 2e 6d 29 3b 20 6a 2b 3d 32 3b  02d",x.m); j+=2;
4e20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4e30: 63 61 73 65 20 27 73 27 3a 20 7b 0a 20 20 20 20  case 's': {.    
4e40: 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a        sprintf(&z
4e50: 5b 6a 5d 2c 22 25 64 22 2c 28 69 6e 74 29 28 28  [j],"%d",(int)((
4e60: 78 2e 72 4a 44 2d 32 34 34 30 35 38 37 2e 35 29  x.rJD-2440587.5)
4e70: 2a 38 36 34 30 30 2e 30 20 2b 20 30 2e 35 29 29  *86400.0 + 0.5))
4e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d  ;.          j +=
4e90: 20 73 74 72 6c 65 6e 28 26 7a 5b 6a 5d 29 3b 0a   strlen(&z[j]);.
4ea0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4eb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4ec0: 20 20 20 63 61 73 65 20 27 53 27 3a 20 20 73 70     case 'S':  sp
4ed0: 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 30 32  rintf(&z[j],"%02
4ee0: 64 22 2c 28 69 6e 74 29 28 78 2e 73 2b 30 2e 35  d",(int)(x.s+0.5
4ef0: 29 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b  )); j+=2; break;
4f00: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 77  .        case 'w
4f10: 27 3a 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 28 28 28  ':  z[j++] = (((
4f20: 69 6e 74 29 28 78 2e 72 4a 44 2b 31 2e 35 29 29  int)(x.rJD+1.5))
4f30: 20 25 20 37 29 20 2b 20 27 30 27 3b 20 62 72 65   % 7) + '0'; bre
4f40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
4f50: 20 27 59 27 3a 20 20 73 70 72 69 6e 74 66 28 26   'Y':  sprintf(&
4f60: 7a 5b 6a 5d 2c 22 25 30 34 64 22 2c 78 2e 59 29  z[j],"%04d",x.Y)
4f70: 3b 20 6a 2b 3d 73 74 72 6c 65 6e 28 26 7a 5b 6a  ; j+=strlen(&z[j
4f80: 5d 29 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ]); break;.     
4f90: 20 20 20 63 61 73 65 20 27 25 27 3a 20 20 7a 5b     case '%':  z[
4fa0: 6a 2b 2b 5d 20 3d 20 27 25 27 3b 20 62 72 65 61  j++] = '%'; brea
4fb0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4fc0: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
4fd0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
4fe0: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
4ff0: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  z, -1, SQLITE_TR
5000: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20  ANSIENT);.  if( 
5010: 7a 21 3d 7a 42 75 66 20 29 7b 0a 20 20 20 20 73  z!=zBuf ){.    s
5020: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
5030: 7d 0a 7d 0a 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  }.}...#endif /* 
5040: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5050: 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55  OMIT_DATETIME_FU
5060: 4e 43 53 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  NCS) */../*.** T
5070: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67  his function reg
5080: 69 73 74 65 72 65 64 20 61 6c 6c 20 6f 66 20 74  istered all of t
5090: 68 65 20 61 62 6f 76 65 20 43 20 66 75 6e 63 74  he above C funct
50a0: 69 6f 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66  ions as SQL.** f
50b0: 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  unctions.  This 
50c0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e  should be the on
50d0: 6c 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68  ly routine in th
50e0: 69 73 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20  is file with.** 
50f0: 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65  external linkage
5100: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5110: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
5120: 65 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  eFunctions(sqlit
5130: 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66  e3 *db){.#ifndef
5140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54   SQLITE_OMIT_DAT
5150: 45 54 49 4d 45 5f 46 55 4e 43 53 0a 20 20 73 74  ETIME_FUNCS.  st
5160: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
5170: 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
5180: 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e  Name;.     int n
5190: 41 72 67 3b 0a 20 20 20 20 20 76 6f 69 64 20 28  Arg;.     void (
51a0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
51b0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
51c0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20  ite3_value**);. 
51d0: 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a   } aFuncs[] = {.
51e0: 20 20 20 20 7b 20 22 6a 75 6c 69 61 6e 64 61 79      { "julianday
51f0: 22 2c 20 2d 31 2c 20 6a 75 6c 69 61 6e 64 61 79  ", -1, julianday
5200: 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Func   },.    { 
5210: 22 64 61 74 65 22 2c 20 20 20 20 20 20 2d 31 2c  "date",      -1,
5220: 20 64 61 74 65 46 75 6e 63 20 20 20 20 20 20 20   dateFunc       
5230: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 6d 65 22   },.    { "time"
5240: 2c 20 20 20 20 20 20 2d 31 2c 20 74 69 6d 65 46  ,      -1, timeF
5250: 75 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  unc        },.  
5260: 20 20 7b 20 22 64 61 74 65 74 69 6d 65 22 2c 20    { "datetime", 
5270: 20 2d 31 2c 20 64 61 74 65 74 69 6d 65 46 75 6e   -1, datetimeFun
5280: 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73  c    },.    { "s
5290: 74 72 66 74 69 6d 65 22 2c 20 20 2d 31 2c 20 73  trftime",  -1, s
52a0: 74 72 66 74 69 6d 65 46 75 6e 63 20 20 20 20 7d  trftimeFunc    }
52b0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
52c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
52d0: 7a 65 6f 66 28 61 46 75 6e 63 73 29 2f 73 69 7a  zeof(aFuncs)/siz
52e0: 65 6f 66 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20  eof(aFuncs[0]); 
52f0: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
5300: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
5310: 6e 28 64 62 2c 20 61 46 75 6e 63 73 5b 69 5d 2e  n(db, aFuncs[i].
5320: 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 73 5b 69 5d  zName, aFuncs[i]
5330: 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20 53  .nArg,.        S
5340: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 61  QLITE_UTF8, 0, a
5350: 46 75 6e 63 73 5b 69 5d 2e 78 46 75 6e 63 2c 20  Funcs[i].xFunc, 
5360: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
5370: 66 0a 7d 0a                                      f.}.