/ Hex Artifact Content
Login

Artifact 8bc8d084a17d19c44d9cbf357b5f656db6706ce1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 4f 63 74 6f 62  /*.** 2003 Octob
0010: 65 72 20 33 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 31.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  e contains the C
0190: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
01a0: 69 6d 70 6c 65 6d 65 6e 74 20 64 61 74 65 20 61  implement date a
01b0: 6e 64 20 74 69 6d 65 0a 2a 2a 20 66 75 6e 63 74  nd time.** funct
01c0: 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 2e  ions for SQLite.
01d0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69    .**.** There i
01e0: 73 20 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72  s only one expor
01f0: 74 65 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  ted symbol in th
0200: 69 73 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75  is file - the fu
0210: 6e 63 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65  nction.** sqlite
0220: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
0230: 65 46 75 6e 63 74 69 6f 6e 73 28 29 20 66 6f 75  eFunctions() fou
0240: 6e 64 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  nd at the bottom
0250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   of the file..**
0260: 20 41 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   All other code 
0270: 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 2e 0a  has file scope..
0280: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64 61 74 65 2e  **.** $Id: date.
0290: 63 2c 76 20 31 2e 34 36 20 32 30 30 35 2f 31 31  c,v 1.46 2005/11
02a0: 2f 33 30 20 30 33 3a 32 30 3a 33 31 20 64 72 68  /30 03:20:31 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 23 64 65 66  nverted..*/.#def
0e70: 69 6e 65 20 67 65 74 56 61 6c 75 65 20 73 71 6c  ine getValue sql
0e80: 69 74 65 33 41 74 6f 46 0a 0a 2f 2a 0a 2a 2a 20  ite3AtoF../*.** 
0e90: 50 61 72 73 65 20 61 20 74 69 6d 65 7a 6f 6e 65  Parse a timezone
0ea0: 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 20 74 68   extension on th
0eb0: 65 20 65 6e 64 20 6f 66 20 61 20 64 61 74 65 2d  e end of a date-
0ec0: 74 69 6d 65 2e 0a 2a 2a 20 54 68 65 20 65 78 74  time..** The ext
0ed0: 65 6e 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  ension is of the
0ee0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0ef0: 20 20 20 20 28 2b 2f 2d 29 48 48 3a 4d 4d 0a 2a      (+/-)HH:MM.*
0f00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 73  *.** If the pars
0f10: 65 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  e is successful,
0f20: 20 77 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   write the numbe
0f30: 72 20 6f 66 20 6d 69 6e 75 74 65 73 0a 2a 2a 20  r of minutes.** 
0f40: 6f 66 20 63 68 61 6e 67 65 20 69 6e 20 2a 70 6e  of change in *pn
0f50: 4d 69 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 30  Min and return 0
0f60: 2e 20 20 49 66 20 61 20 70 61 72 73 65 72 20 65  .  If a parser e
0f70: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
0f80: 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20  return 0..**.** 
0f90: 41 20 6d 69 73 73 69 6e 67 20 73 70 65 63 69 66  A missing specif
0fa0: 69 65 72 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  ier is not consi
0fb0: 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2e 0a  dered an error..
0fc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
0fd0: 72 73 65 54 69 6d 65 7a 6f 6e 65 28 63 6f 6e 73  rseTimezone(cons
0fe0: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 44  t char *zDate, D
0ff0: 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69  ateTime *p){.  i
1000: 6e 74 20 73 67 6e 20 3d 20 30 3b 0a 20 20 69 6e  nt sgn = 0;.  in
1010: 74 20 6e 48 72 2c 20 6e 4d 6e 3b 0a 20 20 77 68  t nHr, nMn;.  wh
1020: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75  ile( isspace(*(u
1030: 38 2a 29 7a 44 61 74 65 29 20 29 7b 20 7a 44 61  8*)zDate) ){ zDa
1040: 74 65 2b 2b 3b 20 7d 0a 20 20 70 2d 3e 74 7a 20  te++; }.  p->tz 
1050: 3d 20 30 3b 0a 20 20 69 66 28 20 2a 7a 44 61 74  = 0;.  if( *zDat
1060: 65 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 73 67  e=='-' ){.    sg
1070: 6e 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20  n = -1;.  }else 
1080: 69 66 28 20 2a 7a 44 61 74 65 3d 3d 27 2b 27 20  if( *zDate=='+' 
1090: 29 7b 0a 20 20 20 20 73 67 6e 20 3d 20 2b 31 3b  ){.    sgn = +1;
10a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
10b0: 74 75 72 6e 20 2a 7a 44 61 74 65 21 3d 30 3b 0a  turn *zDate!=0;.
10c0: 20 20 7d 0a 20 20 7a 44 61 74 65 2b 2b 3b 0a 20    }.  zDate++;. 
10d0: 20 69 66 28 20 67 65 74 44 69 67 69 74 73 28 7a   if( getDigits(z
10e0: 44 61 74 65 2c 20 32 2c 20 30 2c 20 31 34 2c 20  Date, 2, 0, 14, 
10f0: 27 3a 27 2c 20 26 6e 48 72 2c 20 32 2c 20 30 2c  ':', &nHr, 2, 0,
1100: 20 35 39 2c 20 30 2c 20 26 6e 4d 6e 29 21 3d 32   59, 0, &nMn)!=2
1110: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1120: 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b 3d  ;.  }.  zDate +=
1130: 20 35 3b 0a 20 20 70 2d 3e 74 7a 20 3d 20 73 67   5;.  p->tz = sg
1140: 6e 2a 28 6e 4d 6e 20 2b 20 6e 48 72 2a 36 30 29  n*(nMn + nHr*60)
1150: 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61  ;.  while( isspa
1160: 63 65 28 2a 28 75 38 2a 29 7a 44 61 74 65 29 20  ce(*(u8*)zDate) 
1170: 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d 0a 20 20  ){ zDate++; }.  
1180: 72 65 74 75 72 6e 20 2a 7a 44 61 74 65 21 3d 30  return *zDate!=0
1190: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
11a0: 20 74 69 6d 65 73 20 6f 66 20 74 68 65 20 66 6f   times of the fo
11b0: 72 6d 20 48 48 3a 4d 4d 20 6f 72 20 48 48 3a 4d  rm HH:MM or HH:M
11c0: 4d 3a 53 53 20 6f 72 20 48 48 3a 4d 4d 3a 53 53  M:SS or HH:MM:SS
11d0: 2e 46 46 46 46 2e 0a 2a 2a 20 54 68 65 20 48 48  .FFFF..** The HH
11e0: 2c 20 4d 4d 2c 20 61 6e 64 20 53 53 20 6d 75 73  , MM, and SS mus
11f0: 74 20 65 61 63 68 20 62 65 20 65 78 61 63 74 6c  t each be exactl
1200: 79 20 32 20 64 69 67 69 74 73 2e 20 20 54 68 65  y 2 digits.  The
1210: 0a 2a 2a 20 66 72 61 63 74 69 6f 6e 61 6c 20 73  .** fractional s
1220: 65 63 6f 6e 64 73 20 46 46 46 46 20 63 61 6e 20  econds FFFF can 
1230: 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64  be one or more d
1240: 69 67 69 74 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  igits..**.** Ret
1250: 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 69  urn 1 if there i
1260: 73 20 61 20 70 61 72 73 69 6e 67 20 65 72 72 6f  s a parsing erro
1270: 72 20 61 6e 64 20 30 20 6f 6e 20 73 75 63 63 65  r and 0 on succe
1280: 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
1290: 74 20 70 61 72 73 65 48 68 4d 6d 53 73 28 63 6f  t parseHhMmSs(co
12a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c  nst char *zDate,
12b0: 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20   DateTime *p){. 
12c0: 20 69 6e 74 20 68 2c 20 6d 2c 20 73 3b 0a 20 20   int h, m, s;.  
12d0: 64 6f 75 62 6c 65 20 6d 73 20 3d 20 30 2e 30 3b  double ms = 0.0;
12e0: 0a 20 20 69 66 28 20 67 65 74 44 69 67 69 74 73  .  if( getDigits
12f0: 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 32 34  (zDate, 2, 0, 24
1300: 2c 20 27 3a 27 2c 20 26 68 2c 20 32 2c 20 30 2c  , ':', &h, 2, 0,
1310: 20 35 39 2c 20 30 2c 20 26 6d 29 21 3d 32 20 29   59, 0, &m)!=2 )
1320: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1330: 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b 3d 20 35    }.  zDate += 5
1340: 3b 0a 20 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d  ;.  if( *zDate==
1350: 27 3a 27 20 29 7b 0a 20 20 20 20 7a 44 61 74 65  ':' ){.    zDate
1360: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 67 65 74 44  ++;.    if( getD
1370: 69 67 69 74 73 28 7a 44 61 74 65 2c 20 32 2c 20  igits(zDate, 2, 
1380: 30 2c 20 35 39 2c 20 30 2c 20 26 73 29 21 3d 31  0, 59, 0, &s)!=1
1390: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13a0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44   1;.    }.    zD
13b0: 61 74 65 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66  ate += 2;.    if
13c0: 28 20 2a 7a 44 61 74 65 3d 3d 27 2e 27 20 26 26  ( *zDate=='.' &&
13d0: 20 69 73 64 69 67 69 74 28 28 75 38 29 7a 44 61   isdigit((u8)zDa
13e0: 74 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  te[1]) ){.      
13f0: 64 6f 75 62 6c 65 20 72 53 63 61 6c 65 20 3d 20  double rScale = 
1400: 31 2e 30 3b 0a 20 20 20 20 20 20 7a 44 61 74 65  1.0;.      zDate
1410: 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
1420: 20 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a   isdigit(*(u8*)z
1430: 44 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Date) ){.       
1440: 20 6d 73 20 3d 20 6d 73 2a 31 30 2e 30 20 2b 20   ms = ms*10.0 + 
1450: 2a 7a 44 61 74 65 20 2d 20 27 30 27 3b 0a 20 20  *zDate - '0';.  
1460: 20 20 20 20 20 20 72 53 63 61 6c 65 20 2a 3d 20        rScale *= 
1470: 31 30 2e 30 3b 0a 20 20 20 20 20 20 20 20 7a 44  10.0;.        zD
1480: 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ate++;.      }. 
1490: 20 20 20 20 20 6d 73 20 2f 3d 20 72 53 63 61 6c       ms /= rScal
14a0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  e;.    }.  }else
14b0: 7b 0a 20 20 20 20 73 20 3d 20 30 3b 0a 20 20 7d  {.    s = 0;.  }
14c0: 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20  .  p->validJD = 
14d0: 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53  0;.  p->validHMS
14e0: 20 3d 20 31 3b 0a 20 20 70 2d 3e 68 20 3d 20 68   = 1;.  p->h = h
14f0: 3b 0a 20 20 70 2d 3e 6d 20 3d 20 6d 3b 0a 20 20  ;.  p->m = m;.  
1500: 70 2d 3e 73 20 3d 20 73 20 2b 20 6d 73 3b 0a 20  p->s = s + ms;. 
1510: 20 69 66 28 20 70 61 72 73 65 54 69 6d 65 7a 6f   if( parseTimezo
1520: 6e 65 28 7a 44 61 74 65 2c 20 70 29 20 29 20 72  ne(zDate, p) ) r
1530: 65 74 75 72 6e 20 31 3b 0a 20 20 70 2d 3e 76 61  eturn 1;.  p->va
1540: 6c 69 64 54 5a 20 3d 20 70 2d 3e 74 7a 21 3d 30  lidTZ = p->tz!=0
1550: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1560: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 66  ./*.** Convert f
1570: 72 6f 6d 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48  rom YYYY-MM-DD H
1580: 48 3a 4d 4d 3a 53 53 20 74 6f 20 6a 75 6c 69 61  H:MM:SS to julia
1590: 6e 20 64 61 79 2e 20 20 57 65 20 61 6c 77 61 79  n day.  We alway
15a0: 73 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74  s assume.** that
15b0: 20 74 68 65 20 59 59 59 59 2d 4d 4d 2d 44 44 20   the YYYY-MM-DD 
15c0: 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  is according to 
15d0: 74 68 65 20 47 72 65 67 6f 72 69 61 6e 20 63 61  the Gregorian ca
15e0: 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  lendar..**.** Re
15f0: 66 65 72 65 6e 63 65 3a 20 20 4d 65 65 75 73 20  ference:  Meeus 
1600: 70 61 67 65 20 36 31 0a 2a 2f 0a 73 74 61 74 69  page 61.*/.stati
1610: 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4a 44  c void computeJD
1620: 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20  (DateTime *p){. 
1630: 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c 20 41 2c   int Y, M, D, A,
1640: 20 42 2c 20 58 31 2c 20 58 32 3b 0a 0a 20 20 69   B, X1, X2;..  i
1650: 66 28 20 70 2d 3e 76 61 6c 69 64 4a 44 20 29 20  f( p->validJD ) 
1660: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
1670: 3e 76 61 6c 69 64 59 4d 44 20 29 7b 0a 20 20 20  >validYMD ){.   
1680: 20 59 20 3d 20 70 2d 3e 59 3b 0a 20 20 20 20 4d   Y = p->Y;.    M
1690: 20 3d 20 70 2d 3e 4d 3b 0a 20 20 20 20 44 20 3d   = p->M;.    D =
16a0: 20 70 2d 3e 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a   p->D;.  }else{.
16b0: 20 20 20 20 59 20 3d 20 32 30 30 30 3b 20 20 2f      Y = 2000;  /
16c0: 2a 20 49 66 20 6e 6f 20 59 4d 44 20 73 70 65 63  * If no YMD spec
16d0: 69 66 69 65 64 2c 20 61 73 73 75 6d 65 20 32 30  ified, assume 20
16e0: 30 30 2d 4a 61 6e 2d 30 31 20 2a 2f 0a 20 20 20  00-Jan-01 */.   
16f0: 20 4d 20 3d 20 31 3b 0a 20 20 20 20 44 20 3d 20   M = 1;.    D = 
1700: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 3c 3d  1;.  }.  if( M<=
1710: 32 20 29 7b 0a 20 20 20 20 59 2d 2d 3b 0a 20 20  2 ){.    Y--;.  
1720: 20 20 4d 20 2b 3d 20 31 32 3b 0a 20 20 7d 0a 20    M += 12;.  }. 
1730: 20 41 20 3d 20 59 2f 31 30 30 3b 0a 20 20 42 20   A = Y/100;.  B 
1740: 3d 20 32 20 2d 20 41 20 2b 20 28 41 2f 34 29 3b  = 2 - A + (A/4);
1750: 0a 20 20 58 31 20 3d 20 33 36 35 2e 32 35 2a 28  .  X1 = 365.25*(
1760: 59 2b 34 37 31 36 29 3b 0a 20 20 58 32 20 3d 20  Y+4716);.  X2 = 
1770: 33 30 2e 36 30 30 31 2a 28 4d 2b 31 29 3b 0a 20  30.6001*(M+1);. 
1780: 20 70 2d 3e 72 4a 44 20 3d 20 58 31 20 2b 20 58   p->rJD = X1 + X
1790: 32 20 2b 20 44 20 2b 20 42 20 2d 20 31 35 32 34  2 + D + B - 1524
17a0: 2e 35 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44  .5;.  p->validJD
17b0: 20 3d 20 31 3b 0a 20 20 70 2d 3e 76 61 6c 69 64   = 1;.  p->valid
17c0: 59 4d 44 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  YMD = 0;.  if( p
17d0: 2d 3e 76 61 6c 69 64 48 4d 53 20 29 7b 0a 20 20  ->validHMS ){.  
17e0: 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 28 70 2d 3e    p->rJD += (p->
17f0: 68 2a 33 36 30 30 2e 30 20 2b 20 70 2d 3e 6d 2a  h*3600.0 + p->m*
1800: 36 30 2e 30 20 2b 20 70 2d 3e 73 29 2f 38 36 34  60.0 + p->s)/864
1810: 30 30 2e 30 3b 0a 20 20 20 20 69 66 28 20 70 2d  00.0;.    if( p-
1820: 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20 20 20 20  >validTZ ){.    
1830: 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 70 2d 3e 74    p->rJD += p->t
1840: 7a 2a 36 30 2f 38 36 34 30 30 2e 30 3b 0a 20 20  z*60/86400.0;.  
1850: 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20      p->validHMS 
1860: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61  = 0;.      p->va
1870: 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 20 20 7d  lidTZ = 0;.    }
1880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
1890: 72 73 65 20 64 61 74 65 73 20 6f 66 20 74 68 65  rse dates of the
18a0: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
18b0: 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d  YYYY-MM-DD HH:MM
18c0: 3a 53 53 2e 46 46 46 0a 2a 2a 20 20 20 20 20 59  :SS.FFF.**     Y
18d0: 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a  YYY-MM-DD HH:MM:
18e0: 53 53 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d  SS.**     YYYY-M
18f0: 4d 2d 44 44 20 48 48 3a 4d 4d 0a 2a 2a 20 20 20  M-DD HH:MM.**   
1900: 20 20 59 59 59 59 2d 4d 4d 2d 44 44 0a 2a 2a 0a    YYYY-MM-DD.**.
1910: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73  ** Write the res
1920: 75 6c 74 20 69 6e 74 6f 20 74 68 65 20 44 61 74  ult into the Dat
1930: 65 54 69 6d 65 20 73 74 72 75 63 74 75 72 65 20  eTime structure 
1940: 61 6e 64 20 72 65 74 75 72 6e 20 30 0a 2a 2a 20  and return 0.** 
1950: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 31  on success and 1
1960: 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 73 74   if the input st
1970: 72 69 6e 67 20 69 73 20 6e 6f 74 20 61 20 77 65  ring is not a we
1980: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 64 61 74  ll-formed.** dat
1990: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19a0: 20 70 61 72 73 65 59 79 79 79 4d 6d 44 64 28 63   parseYyyyMmDd(c
19b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
19c0: 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a  , DateTime *p){.
19d0: 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c 20 6e    int Y, M, D, n
19e0: 65 67 3b 0a 0a 20 20 69 66 28 20 7a 44 61 74 65  eg;..  if( zDate
19f0: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
1a00: 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 6e 65 67  zDate++;.    neg
1a10: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1a20: 20 20 20 6e 65 67 20 3d 20 30 3b 0a 20 20 7d 0a     neg = 0;.  }.
1a30: 20 20 69 66 28 20 67 65 74 44 69 67 69 74 73 28    if( getDigits(
1a40: 7a 44 61 74 65 2c 34 2c 30 2c 39 39 39 39 2c 27  zDate,4,0,9999,'
1a50: 2d 27 2c 26 59 2c 32 2c 31 2c 31 32 2c 27 2d 27  -',&Y,2,1,12,'-'
1a60: 2c 26 4d 2c 32 2c 31 2c 33 31 2c 30 2c 26 44 29  ,&M,2,1,31,0,&D)
1a70: 21 3d 33 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=3 ){.    retur
1a80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65  n 1;.  }.  zDate
1a90: 20 2b 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28   += 10;.  while(
1aa0: 20 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a   isspace(*(u8*)z
1ab0: 44 61 74 65 29 20 7c 7c 20 27 54 27 3d 3d 2a 28  Date) || 'T'==*(
1ac0: 75 38 2a 29 7a 44 61 74 65 20 29 7b 20 7a 44 61  u8*)zDate ){ zDa
1ad0: 74 65 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 70 61  te++; }.  if( pa
1ae0: 72 73 65 48 68 4d 6d 53 73 28 7a 44 61 74 65 2c  rseHhMmSs(zDate,
1af0: 20 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a   p)==0 ){.    /*
1b00: 20 57 65 20 67 6f 74 20 74 68 65 20 74 69 6d 65   We got the time
1b10: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
1b20: 2a 7a 44 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20  *zDate==0 ){.   
1b30: 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 30   p->validHMS = 0
1b40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1b50: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70  eturn 1;.  }.  p
1b60: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20  ->validJD = 0;. 
1b70: 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d 20 31   p->validYMD = 1
1b80: 3b 0a 20 20 70 2d 3e 59 20 3d 20 6e 65 67 20 3f  ;.  p->Y = neg ?
1b90: 20 2d 59 20 3a 20 59 3b 0a 20 20 70 2d 3e 4d 20   -Y : Y;.  p->M 
1ba0: 3d 20 4d 3b 0a 20 20 70 2d 3e 44 20 3d 20 44 3b  = M;.  p->D = D;
1bb0: 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 54  .  if( p->validT
1bc0: 5a 20 29 7b 0a 20 20 20 20 63 6f 6d 70 75 74 65  Z ){.    compute
1bd0: 4a 44 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  JD(p);.  }.  ret
1be0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1bf0: 41 74 74 65 6d 70 74 20 74 6f 20 70 61 72 73 65  Attempt to parse
1c00: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
1c10: 67 20 69 6e 74 6f 20 61 20 4a 75 6c 69 61 6e 20  g into a Julian 
1c20: 44 61 79 20 4e 75 6d 62 65 72 2e 20 20 52 65 74  Day Number.  Ret
1c30: 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
1c40: 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  r of errors..**.
1c50: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1c60: 20 61 72 65 20 61 63 63 65 70 74 61 62 6c 65 20   are acceptable 
1c70: 66 6f 72 6d 73 20 66 6f 72 20 74 68 65 20 69 6e  forms for the in
1c80: 70 75 74 20 73 74 72 69 6e 67 3a 0a 2a 2a 0a 2a  put string:.**.*
1c90: 2a 20 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44  *      YYYY-MM-D
1ca0: 44 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 20 20  D HH:MM:SS.FFF  
1cb0: 2b 2f 2d 48 48 3a 4d 4d 0a 2a 2a 20 20 20 20 20  +/-HH:MM.**     
1cc0: 20 44 44 44 44 2e 44 44 20 0a 2a 2a 20 20 20 20   DDDD.DD .**    
1cd0: 20 20 6e 6f 77 0a 2a 2a 0a 2a 2a 20 49 6e 20 74    now.**.** In t
1ce0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 2c 20 74  he first form, t
1cf0: 68 65 20 2b 2f 2d 48 48 3a 4d 4d 20 69 73 20 61  he +/-HH:MM is a
1d00: 6c 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c 2e 20  lways optional. 
1d10: 20 54 68 65 20 66 72 61 63 74 69 6f 6e 61 6c 0a   The fractional.
1d20: 2a 2a 20 73 65 63 6f 6e 64 73 20 65 78 74 65 6e  ** seconds exten
1d30: 73 69 6f 6e 20 28 74 68 65 20 22 2e 46 46 46 22  sion (the ".FFF"
1d40: 29 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  ) is optional.  
1d50: 54 68 65 20 73 65 63 6f 6e 64 73 20 70 6f 72 74  The seconds port
1d60: 69 6f 6e 0a 2a 2a 20 28 22 3a 53 53 2e 46 46 46  ion.** (":SS.FFF
1d70: 22 29 20 69 73 20 6f 70 74 69 6f 6e 2e 20 20 54  ") is option.  T
1d80: 68 65 20 79 65 61 72 20 61 6e 64 20 64 61 74 65  he year and date
1d90: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20   can be omitted 
1da0: 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 74 68  as long.** as th
1db0: 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 73 74  ere is a time st
1dc0: 72 69 6e 67 2e 20 20 54 68 65 20 74 69 6d 65 20  ring.  The time 
1dd0: 73 74 72 69 6e 67 20 63 61 6e 20 62 65 20 6f 6d  string can be om
1de0: 69 74 74 65 64 20 61 73 20 6c 6f 6e 67 0a 2a 2a  itted as long.**
1df0: 20 61 73 20 74 68 65 72 65 20 69 73 20 61 20 79   as there is a y
1e00: 65 61 72 20 61 6e 64 20 64 61 74 65 2e 0a 2a 2f  ear and date..*/
1e10: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 73  .static int pars
1e20: 65 44 61 74 65 4f 72 54 69 6d 65 28 63 6f 6e 73  eDateOrTime(cons
1e30: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 44  t char *zDate, D
1e40: 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 6d  ateTime *p){.  m
1e50: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
1e60: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
1e70: 61 72 73 65 59 79 79 79 4d 6d 44 64 28 7a 44 61  arseYyyyMmDd(zDa
1e80: 74 65 2c 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20  te,p)==0 ){.    
1e90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1ea0: 65 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53  e if( parseHhMmS
1eb0: 73 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30 20 29  s(zDate, p)==0 )
1ec0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1ed0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1ee0: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 65  te3StrICmp(zDate
1ef0: 2c 22 6e 6f 77 22 29 3d 3d 30 29 7b 0a 20 20 20  ,"now")==0){.   
1f00: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 73   double r;.    s
1f10: 71 6c 69 74 65 33 4f 73 2e 78 43 75 72 72 65 6e  qlite3Os.xCurren
1f20: 74 54 69 6d 65 28 26 72 29 3b 0a 20 20 20 20 70  tTime(&r);.    p
1f30: 2d 3e 72 4a 44 20 3d 20 72 3b 0a 20 20 20 20 70  ->rJD = r;.    p
1f40: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 20  ->validJD = 1;. 
1f50: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1f60: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1f70: 49 73 4e 75 6d 62 65 72 28 7a 44 61 74 65 2c 20  IsNumber(zDate, 
1f80: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 20  0, SQLITE_UTF8) 
1f90: 29 7b 0a 20 20 20 20 67 65 74 56 61 6c 75 65 28  ){.    getValue(
1fa0: 7a 44 61 74 65 2c 20 26 70 2d 3e 72 4a 44 29 3b  zDate, &p->rJD);
1fb0: 0a 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20  .    p->validJD 
1fc0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1fd0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1fe0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  1;.}../*.** Comp
1ff0: 75 74 65 20 74 68 65 20 59 65 61 72 2c 20 4d 6f  ute the Year, Mo
2000: 6e 74 68 2c 20 61 6e 64 20 44 61 79 20 66 72 6f  nth, and Day fro
2010: 6d 20 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79  m the julian day
2020: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
2030: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 59  ic void computeY
2040: 4d 44 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b  MD(DateTime *p){
2050: 0a 20 20 69 6e 74 20 5a 2c 20 41 2c 20 42 2c 20  .  int Z, A, B, 
2060: 43 2c 20 44 2c 20 45 2c 20 58 31 3b 0a 20 20 69  C, D, E, X1;.  i
2070: 66 28 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 29  f( p->validYMD )
2080: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
2090: 70 2d 3e 76 61 6c 69 64 4a 44 20 29 7b 0a 20 20  p->validJD ){.  
20a0: 20 20 70 2d 3e 59 20 3d 20 32 30 30 30 3b 0a 20    p->Y = 2000;. 
20b0: 20 20 20 70 2d 3e 4d 20 3d 20 31 3b 0a 20 20 20     p->M = 1;.   
20c0: 20 70 2d 3e 44 20 3d 20 31 3b 0a 20 20 7d 65 6c   p->D = 1;.  }el
20d0: 73 65 7b 0a 20 20 20 20 5a 20 3d 20 70 2d 3e 72  se{.    Z = p->r
20e0: 4a 44 20 2b 20 30 2e 35 3b 0a 20 20 20 20 41 20  JD + 0.5;.    A 
20f0: 3d 20 28 5a 20 2d 20 31 38 36 37 32 31 36 2e 32  = (Z - 1867216.2
2100: 35 29 2f 33 36 35 32 34 2e 32 35 3b 0a 20 20 20  5)/36524.25;.   
2110: 20 41 20 3d 20 5a 20 2b 20 31 20 2b 20 41 20 2d   A = Z + 1 + A -
2120: 20 28 41 2f 34 29 3b 0a 20 20 20 20 42 20 3d 20   (A/4);.    B = 
2130: 41 20 2b 20 31 35 32 34 3b 0a 20 20 20 20 43 20  A + 1524;.    C 
2140: 3d 20 28 42 20 2d 20 31 32 32 2e 31 29 2f 33 36  = (B - 122.1)/36
2150: 35 2e 32 35 3b 0a 20 20 20 20 44 20 3d 20 33 36  5.25;.    D = 36
2160: 35 2e 32 35 2a 43 3b 0a 20 20 20 20 45 20 3d 20  5.25*C;.    E = 
2170: 28 42 2d 44 29 2f 33 30 2e 36 30 30 31 3b 0a 20  (B-D)/30.6001;. 
2180: 20 20 20 58 31 20 3d 20 33 30 2e 36 30 30 31 2a     X1 = 30.6001*
2190: 45 3b 0a 20 20 20 20 70 2d 3e 44 20 3d 20 42 20  E;.    p->D = B 
21a0: 2d 20 44 20 2d 20 58 31 3b 0a 20 20 20 20 70 2d  - D - X1;.    p-
21b0: 3e 4d 20 3d 20 45 3c 31 34 20 3f 20 45 2d 31 20  >M = E<14 ? E-1 
21c0: 3a 20 45 2d 31 33 3b 0a 20 20 20 20 70 2d 3e 59  : E-13;.    p->Y
21d0: 20 3d 20 70 2d 3e 4d 3e 32 20 3f 20 43 20 2d 20   = p->M>2 ? C - 
21e0: 34 37 31 36 20 3a 20 43 20 2d 20 34 37 31 35 3b  4716 : C - 4715;
21f0: 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 59  .  }.  p->validY
2200: 4d 44 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  MD = 1;.}../*.**
2210: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 48 6f 75   Compute the Hou
2220: 72 2c 20 4d 69 6e 75 74 65 2c 20 61 6e 64 20 53  r, Minute, and S
2230: 65 63 6f 6e 64 73 20 66 72 6f 6d 20 74 68 65 20  econds from the 
2240: 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65  julian day numbe
2250: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2260: 64 20 63 6f 6d 70 75 74 65 48 4d 53 28 44 61 74  d computeHMS(Dat
2270: 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  eTime *p){.  int
2280: 20 5a 2c 20 73 3b 0a 20 20 69 66 28 20 70 2d 3e   Z, s;.  if( p->
2290: 76 61 6c 69 64 48 4d 53 20 29 20 72 65 74 75 72  validHMS ) retur
22a0: 6e 3b 0a 20 20 5a 20 3d 20 70 2d 3e 72 4a 44 20  n;.  Z = p->rJD 
22b0: 2b 20 30 2e 35 3b 0a 20 20 73 20 3d 20 28 70 2d  + 0.5;.  s = (p-
22c0: 3e 72 4a 44 20 2b 20 30 2e 35 20 2d 20 5a 29 2a  >rJD + 0.5 - Z)*
22d0: 38 36 34 30 30 30 30 30 2e 30 20 2b 20 30 2e 35  86400000.0 + 0.5
22e0: 3b 0a 20 20 70 2d 3e 73 20 3d 20 30 2e 30 30 31  ;.  p->s = 0.001
22f0: 2a 73 3b 0a 20 20 73 20 3d 20 70 2d 3e 73 3b 0a  *s;.  s = p->s;.
2300: 20 20 70 2d 3e 73 20 2d 3d 20 73 3b 0a 20 20 70    p->s -= s;.  p
2310: 2d 3e 68 20 3d 20 73 2f 33 36 30 30 3b 0a 20 20  ->h = s/3600;.  
2320: 73 20 2d 3d 20 70 2d 3e 68 2a 33 36 30 30 3b 0a  s -= p->h*3600;.
2330: 20 20 70 2d 3e 6d 20 3d 20 73 2f 36 30 3b 0a 20    p->m = s/60;. 
2340: 20 70 2d 3e 73 20 2b 3d 20 73 20 2d 20 70 2d 3e   p->s += s - p->
2350: 6d 2a 36 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64  m*60;.  p->valid
2360: 48 4d 53 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  HMS = 1;.}../*.*
2370: 2a 20 43 6f 6d 70 75 74 65 20 62 6f 74 68 20 59  * Compute both Y
2380: 4d 44 20 61 6e 64 20 48 4d 53 0a 2a 2f 0a 73 74  MD and HMS.*/.st
2390: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
23a0: 65 59 4d 44 5f 48 4d 53 28 44 61 74 65 54 69 6d  eYMD_HMS(DateTim
23b0: 65 20 2a 70 29 7b 0a 20 20 63 6f 6d 70 75 74 65  e *p){.  compute
23c0: 59 4d 44 28 70 29 3b 0a 20 20 63 6f 6d 70 75 74  YMD(p);.  comput
23d0: 65 48 4d 53 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eHMS(p);.}../*.*
23e0: 2a 20 43 6c 65 61 72 20 74 68 65 20 59 4d 44 20  * Clear the YMD 
23f0: 61 6e 64 20 48 4d 53 20 61 6e 64 20 74 68 65 20  and HMS and the 
2400: 54 5a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  TZ.*/.static voi
2410: 64 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54  d clearYMD_HMS_T
2420: 5a 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a  Z(DateTime *p){.
2430: 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d 20    p->validYMD = 
2440: 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53  0;.  p->validHMS
2450: 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64   = 0;.  p->valid
2460: 54 5a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TZ = 0;.}../*.**
2470: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 64 69 66   Compute the dif
2480: 66 65 72 65 6e 63 65 20 28 69 6e 20 64 61 79 73  ference (in days
2490: 29 20 62 65 74 77 65 65 6e 20 6c 6f 63 61 6c 74  ) between localt
24a0: 69 6d 65 20 61 6e 64 20 55 54 43 20 28 61 2e 6b  ime and UTC (a.k
24b0: 2e 61 2e 20 47 4d 54 29 0a 2a 2a 20 66 6f 72 20  .a. GMT).** for 
24c0: 74 68 65 20 74 69 6d 65 20 76 61 6c 75 65 20 70  the time value p
24d0: 20 77 68 65 72 65 20 70 20 69 73 20 69 6e 20 55   where p is in U
24e0: 54 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f  TC..*/.static do
24f0: 75 62 6c 65 20 6c 6f 63 61 6c 74 69 6d 65 4f 66  uble localtimeOf
2500: 66 73 65 74 28 44 61 74 65 54 69 6d 65 20 2a 70  fset(DateTime *p
2510: 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78 2c  ){.  DateTime x,
2520: 20 79 3b 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a   y;.  time_t t;.
2530: 20 20 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d    struct tm *pTm
2540: 3b 0a 20 20 78 20 3d 20 2a 70 3b 0a 20 20 63 6f  ;.  x = *p;.  co
2550: 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78 29  mputeYMD_HMS(&x)
2560: 3b 0a 20 20 69 66 28 20 78 2e 59 3c 31 39 37 31  ;.  if( x.Y<1971
2570: 20 7c 7c 20 78 2e 59 3e 3d 32 30 33 38 20 29 7b   || x.Y>=2038 ){
2580: 0a 20 20 20 20 78 2e 59 20 3d 20 32 30 30 30 3b  .    x.Y = 2000;
2590: 0a 20 20 20 20 78 2e 4d 20 3d 20 31 3b 0a 20 20  .    x.M = 1;.  
25a0: 20 20 78 2e 44 20 3d 20 31 3b 0a 20 20 20 20 78    x.D = 1;.    x
25b0: 2e 68 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6d 20  .h = 0;.    x.m 
25c0: 3d 20 30 3b 0a 20 20 20 20 78 2e 73 20 3d 20 30  = 0;.    x.s = 0
25d0: 2e 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  .0;.  } else {. 
25e0: 20 20 20 69 6e 74 20 73 20 3d 20 78 2e 73 20 2b     int s = x.s +
25f0: 20 30 2e 35 3b 0a 20 20 20 20 78 2e 73 20 3d 20   0.5;.    x.s = 
2600: 73 3b 0a 20 20 7d 0a 20 20 78 2e 74 7a 20 3d 20  s;.  }.  x.tz = 
2610: 30 3b 0a 20 20 78 2e 76 61 6c 69 64 4a 44 20 3d  0;.  x.validJD =
2620: 20 30 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28   0;.  computeJD(
2630: 26 78 29 3b 0a 20 20 74 20 3d 20 28 78 2e 72 4a  &x);.  t = (x.rJ
2640: 44 2d 32 34 34 30 35 38 37 2e 35 29 2a 38 36 34  D-2440587.5)*864
2650: 30 30 2e 30 20 2b 20 30 2e 35 3b 0a 20 20 73 71  00.0 + 0.5;.  sq
2660: 6c 69 74 65 33 4f 73 2e 78 45 6e 74 65 72 4d 75  lite3Os.xEnterMu
2670: 74 65 78 28 29 3b 0a 20 20 70 54 6d 20 3d 20 6c  tex();.  pTm = l
2680: 6f 63 61 6c 74 69 6d 65 28 26 74 29 3b 0a 20 20  ocaltime(&t);.  
2690: 79 2e 59 20 3d 20 70 54 6d 2d 3e 74 6d 5f 79 65  y.Y = pTm->tm_ye
26a0: 61 72 20 2b 20 31 39 30 30 3b 0a 20 20 79 2e 4d  ar + 1900;.  y.M
26b0: 20 3d 20 70 54 6d 2d 3e 74 6d 5f 6d 6f 6e 20 2b   = pTm->tm_mon +
26c0: 20 31 3b 0a 20 20 79 2e 44 20 3d 20 70 54 6d 2d   1;.  y.D = pTm-
26d0: 3e 74 6d 5f 6d 64 61 79 3b 0a 20 20 79 2e 68 20  >tm_mday;.  y.h 
26e0: 3d 20 70 54 6d 2d 3e 74 6d 5f 68 6f 75 72 3b 0a  = pTm->tm_hour;.
26f0: 20 20 79 2e 6d 20 3d 20 70 54 6d 2d 3e 74 6d 5f    y.m = pTm->tm_
2700: 6d 69 6e 3b 0a 20 20 79 2e 73 20 3d 20 70 54 6d  min;.  y.s = pTm
2710: 2d 3e 74 6d 5f 73 65 63 3b 0a 20 20 73 71 6c 69  ->tm_sec;.  sqli
2720: 74 65 33 4f 73 2e 78 4c 65 61 76 65 4d 75 74 65  te3Os.xLeaveMute
2730: 78 28 29 3b 0a 20 20 79 2e 76 61 6c 69 64 59 4d  x();.  y.validYM
2740: 44 20 3d 20 31 3b 0a 20 20 79 2e 76 61 6c 69 64  D = 1;.  y.valid
2750: 48 4d 53 20 3d 20 31 3b 0a 20 20 79 2e 76 61 6c  HMS = 1;.  y.val
2760: 69 64 4a 44 20 3d 20 30 3b 0a 20 20 79 2e 76 61  idJD = 0;.  y.va
2770: 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 63 6f 6d  lidTZ = 0;.  com
2780: 70 75 74 65 4a 44 28 26 79 29 3b 0a 20 20 72 65  puteJD(&y);.  re
2790: 74 75 72 6e 20 79 2e 72 4a 44 20 2d 20 78 2e 72  turn y.rJD - x.r
27a0: 4a 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  JD;.}../*.** Pro
27b0: 63 65 73 73 20 61 20 6d 6f 64 69 66 69 65 72 20  cess a modifier 
27c0: 74 6f 20 61 20 64 61 74 65 2d 74 69 6d 65 20 73  to a date-time s
27d0: 74 61 6d 70 2e 20 20 54 68 65 20 6d 6f 64 69 66  tamp.  The modif
27e0: 69 65 72 73 20 61 72 65 0a 2a 2a 20 61 73 20 66  iers are.** as f
27f0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2800: 20 20 4e 4e 4e 20 64 61 79 73 0a 2a 2a 20 20 20    NNN days.**   
2810: 20 20 4e 4e 4e 20 68 6f 75 72 73 0a 2a 2a 20 20    NNN hours.**  
2820: 20 20 20 4e 4e 4e 20 6d 69 6e 75 74 65 73 0a 2a     NNN minutes.*
2830: 2a 20 20 20 20 20 4e 4e 4e 2e 4e 4e 4e 4e 20 73  *     NNN.NNNN s
2840: 65 63 6f 6e 64 73 0a 2a 2a 20 20 20 20 20 4e 4e  econds.**     NN
2850: 4e 20 6d 6f 6e 74 68 73 0a 2a 2a 20 20 20 20 20  N months.**     
2860: 4e 4e 4e 20 79 65 61 72 73 0a 2a 2a 20 20 20 20  NNN years.**    
2870: 20 73 74 61 72 74 20 6f 66 20 6d 6f 6e 74 68 0a   start of month.
2880: 2a 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66 20  **     start of 
2890: 79 65 61 72 0a 2a 2a 20 20 20 20 20 73 74 61 72  year.**     star
28a0: 74 20 6f 66 20 77 65 65 6b 0a 2a 2a 20 20 20 20  t of week.**    
28b0: 20 73 74 61 72 74 20 6f 66 20 64 61 79 0a 2a 2a   start of day.**
28c0: 20 20 20 20 20 77 65 65 6b 64 61 79 20 4e 0a 2a       weekday N.*
28d0: 2a 20 20 20 20 20 75 6e 69 78 65 70 6f 63 68 0a  *     unixepoch.
28e0: 2a 2a 20 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65  **     localtime
28f0: 0a 2a 2a 20 20 20 20 20 75 74 63 0a 2a 2a 0a 2a  .**     utc.**.*
2900: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
2910: 63 63 65 73 73 20 61 6e 64 20 31 20 69 66 20 74  ccess and 1 if t
2920: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
2930: 20 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   of error..*/.st
2940: 61 74 69 63 20 69 6e 74 20 70 61 72 73 65 4d 6f  atic int parseMo
2950: 64 69 66 69 65 72 28 63 6f 6e 73 74 20 63 68 61  difier(const cha
2960: 72 20 2a 7a 4d 6f 64 2c 20 44 61 74 65 54 69 6d  r *zMod, DateTim
2970: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
2980: 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  = 1;.  int n;.  
2990: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72  double r;.  char
29a0: 20 2a 7a 2c 20 7a 42 75 66 5b 33 30 5d 3b 0a 20   *z, zBuf[30];. 
29b0: 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 66 6f 72   z = zBuf;.  for
29c0: 28 6e 3d 30 3b 20 6e 3c 73 69 7a 65 6f 66 28 7a  (n=0; n<sizeof(z
29d0: 42 75 66 29 2d 31 20 26 26 20 7a 4d 6f 64 5b 6e  Buf)-1 && zMod[n
29e0: 5d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e  ]; n++){.    z[n
29f0: 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4d 6f 64  ] = tolower(zMod
2a00: 5b 6e 5d 29 3b 0a 20 20 7d 0a 20 20 7a 5b 6e 5d  [n]);.  }.  z[n]
2a10: 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20   = 0;.  switch( 
2a20: 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 63 61 73 65  z[0] ){.    case
2a30: 20 27 6c 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a   'l': {.      /*
2a40: 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65 0a 20 20      localtime.  
2a50: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2a60: 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63 75 72  Assuming the cur
2a70: 72 65 6e 74 20 74 69 6d 65 20 76 61 6c 75 65 20  rent time value 
2a80: 69 73 20 55 54 43 20 28 61 2e 6b 2e 61 2e 20 47  is UTC (a.k.a. G
2a90: 4d 54 29 2c 20 73 68 69 66 74 20 69 74 20 74 6f  MT), shift it to
2aa0: 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 77 20 6c  .      ** show l
2ab0: 6f 63 61 6c 20 74 69 6d 65 2e 0a 20 20 20 20 20  ocal time..     
2ac0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74   */.      if( st
2ad0: 72 63 6d 70 28 7a 2c 20 22 6c 6f 63 61 6c 74 69  rcmp(z, "localti
2ae0: 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  me")==0 ){.     
2af0: 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b     computeJD(p);
2b00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20  .        p->rJD 
2b10: 2b 3d 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73  += localtimeOffs
2b20: 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 63  et(p);.        c
2b30: 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70  learYMD_HMS_TZ(p
2b40: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2b50: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
2b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2b70: 20 20 63 61 73 65 20 27 75 27 3a 20 7b 0a 20 20    case 'u': {.  
2b80: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20      /*.      ** 
2b90: 20 20 20 75 6e 69 78 65 70 6f 63 68 0a 20 20 20     unixepoch.   
2ba0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
2bb0: 72 65 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  reat the current
2bc0: 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 72 4a 44   value of p->rJD
2bd0: 20 61 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   as the number o
2be0: 66 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  f.      ** secon
2bf0: 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 20  ds since 1970.  
2c00: 43 6f 6e 76 65 72 74 20 74 6f 20 61 20 72 65 61  Convert to a rea
2c10: 6c 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d  l julian day num
2c20: 62 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ber..      */.  
2c30: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2c40: 2c 20 22 75 6e 69 78 65 70 6f 63 68 22 29 3d 3d  , "unixepoch")==
2c50: 30 20 26 26 20 70 2d 3e 76 61 6c 69 64 4a 44 20  0 && p->validJD 
2c60: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 4a  ){.        p->rJ
2c70: 44 20 3d 20 70 2d 3e 72 4a 44 2f 38 36 34 30 30  D = p->rJD/86400
2c80: 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a  .0 + 2440587.5;.
2c90: 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44          clearYMD
2ca0: 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20  _HMS_TZ(p);.    
2cb0: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
2cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
2cd0: 6d 70 28 7a 2c 20 22 75 74 63 22 29 3d 3d 30 20  mp(z, "utc")==0 
2ce0: 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c  ){.        doubl
2cf0: 65 20 63 31 3b 0a 20 20 20 20 20 20 20 20 63 6f  e c1;.        co
2d00: 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20  mputeJD(p);.    
2d10: 20 20 20 20 63 31 20 3d 20 6c 6f 63 61 6c 74 69      c1 = localti
2d20: 6d 65 4f 66 66 73 65 74 28 70 29 3b 0a 20 20 20  meOffset(p);.   
2d30: 20 20 20 20 20 70 2d 3e 72 4a 44 20 2d 3d 20 63       p->rJD -= c
2d40: 31 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72  1;.        clear
2d50: 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20  YMD_HMS_TZ(p);. 
2d60: 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d         p->rJD +=
2d70: 20 63 31 20 2d 20 6c 6f 63 61 6c 74 69 6d 65 4f   c1 - localtimeO
2d80: 66 66 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20  ffset(p);.      
2d90: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
2da0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
2db0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27 77     }.    case 'w
2dc0: 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20  ': {.      /*.  
2dd0: 20 20 20 20 2a 2a 20 20 20 20 77 65 65 6b 64 61      **    weekda
2de0: 79 20 4e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  y N.      **.   
2df0: 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64     ** Move the d
2e00: 61 74 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ate to the same 
2e10: 74 69 6d 65 20 6f 6e 20 74 68 65 20 6e 65 78 74  time on the next
2e20: 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 0a 20   occurrence of. 
2e30: 20 20 20 20 20 2a 2a 20 77 65 65 6b 64 61 79 20       ** weekday 
2e40: 4e 20 77 68 65 72 65 20 30 3d 3d 53 75 6e 64 61  N where 0==Sunda
2e50: 79 2c 20 31 3d 3d 4d 6f 6e 64 61 79 2c 20 61 6e  y, 1==Monday, an
2e60: 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20  d so forth.  If 
2e70: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2e80: 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20  e is already on 
2e90: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2ea0: 77 65 65 6b 64 61 79 2c 20 74 68 69 73 20 69 73  weekday, this is
2eb0: 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20   a no-op..      
2ec0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  */.      if( str
2ed0: 6e 63 6d 70 28 7a 2c 20 22 77 65 65 6b 64 61 79  ncmp(z, "weekday
2ee0: 20 22 2c 20 38 29 3d 3d 30 20 26 26 20 67 65 74   ", 8)==0 && get
2ef0: 56 61 6c 75 65 28 26 7a 5b 38 5d 2c 26 72 29 3e  Value(&z[8],&r)>
2f00: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
2f10: 20 20 20 26 26 20 28 6e 3d 72 29 3d 3d 72 20 26     && (n=r)==r &
2f20: 26 20 6e 3e 3d 30 20 26 26 20 72 3c 37 20 29 7b  & n>=0 && r<7 ){
2f30: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 5a 3b 0a  .        int Z;.
2f40: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59          computeY
2f50: 4d 44 5f 48 4d 53 28 70 29 3b 0a 20 20 20 20 20  MD_HMS(p);.     
2f60: 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20     p->validTZ = 
2f70: 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 76 61  0;.        p->va
2f80: 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20  lidJD = 0;.     
2f90: 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b     computeJD(p);
2fa0: 0a 20 20 20 20 20 20 20 20 5a 20 3d 20 70 2d 3e  .        Z = p->
2fb0: 72 4a 44 20 2b 20 31 2e 35 3b 0a 20 20 20 20 20  rJD + 1.5;.     
2fc0: 20 20 20 5a 20 25 3d 20 37 3b 0a 20 20 20 20 20     Z %= 7;.     
2fd0: 20 20 20 69 66 28 20 5a 3e 6e 20 29 20 5a 20 2d     if( Z>n ) Z -
2fe0: 3d 20 37 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 7;.        p->
2ff0: 72 4a 44 20 2b 3d 20 6e 20 2d 20 5a 3b 0a 20 20  rJD += n - Z;.  
3000: 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48        clearYMD_H
3010: 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20  MS_TZ(p);.      
3020: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
3030: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3040: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27 73     }.    case 's
3050: 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20  ': {.      /*.  
3060: 20 20 20 20 2a 2a 20 20 20 20 73 74 61 72 74 20      **    start 
3070: 6f 66 20 54 54 54 54 54 0a 20 20 20 20 20 20 2a  of TTTTT.      *
3080: 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20  *.      ** Move 
3090: 74 68 65 20 64 61 74 65 20 62 61 63 6b 77 61 72  the date backwar
30a0: 64 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ds to the beginn
30b0: 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65  ing of the curre
30c0: 6e 74 20 64 61 79 2c 0a 20 20 20 20 20 20 2a 2a  nt day,.      **
30d0: 20 6f 72 20 6d 6f 6e 74 68 20 6f 72 20 79 65 61   or month or yea
30e0: 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
30f0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c    if( strncmp(z,
3100: 20 22 73 74 61 72 74 20 6f 66 20 22 2c 20 39 29   "start of ", 9)
3110: 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
3120: 20 20 20 7a 20 2b 3d 20 39 3b 0a 20 20 20 20 20     z += 9;.     
3130: 20 63 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a   computeYMD(p);.
3140: 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d        p->validHM
3150: 53 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  S = 1;.      p->
3160: 68 20 3d 20 70 2d 3e 6d 20 3d 20 30 3b 0a 20 20  h = p->m = 0;.  
3170: 20 20 20 20 70 2d 3e 73 20 3d 20 30 2e 30 3b 0a      p->s = 0.0;.
3180: 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a        p->validTZ
3190: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76   = 0;.      p->v
31a0: 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20  alidJD = 0;.    
31b0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
31c0: 6d 6f 6e 74 68 22 29 3d 3d 30 20 29 7b 0a 20 20  month")==0 ){.  
31d0: 20 20 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0a        p->D = 1;.
31e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a          rc = 0;.
31f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3200: 73 74 72 63 6d 70 28 7a 2c 22 79 65 61 72 22 29  strcmp(z,"year")
3210: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
3220: 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a 20 20  omputeYMD(p);.  
3230: 20 20 20 20 20 20 70 2d 3e 4d 20 3d 20 31 3b 0a        p->M = 1;.
3240: 20 20 20 20 20 20 20 20 70 2d 3e 44 20 3d 20 31          p->D = 1
3250: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30  ;.        rc = 0
3260: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
3270: 28 20 73 74 72 63 6d 70 28 7a 2c 22 64 61 79 22  ( strcmp(z,"day"
3280: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3290: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  rc = 0;.      }.
32a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 27 2b 27 3a   }.    case '+':
32c0: 0a 20 20 20 20 63 61 73 65 20 27 2d 27 3a 0a 20  .    case '-':. 
32d0: 20 20 20 63 61 73 65 20 27 30 27 3a 0a 20 20 20     case '0':.   
32e0: 20 63 61 73 65 20 27 31 27 3a 0a 20 20 20 20 63   case '1':.    c
32f0: 61 73 65 20 27 32 27 3a 0a 20 20 20 20 63 61 73  ase '2':.    cas
3300: 65 20 27 33 27 3a 0a 20 20 20 20 63 61 73 65 20  e '3':.    case 
3310: 27 34 27 3a 0a 20 20 20 20 63 61 73 65 20 27 35  '4':.    case '5
3320: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 36 27 3a  ':.    case '6':
3330: 0a 20 20 20 20 63 61 73 65 20 27 37 27 3a 0a 20  .    case '7':. 
3340: 20 20 20 63 61 73 65 20 27 38 27 3a 0a 20 20 20     case '8':.   
3350: 20 63 61 73 65 20 27 39 27 3a 20 7b 0a 20 20 20   case '9': {.   
3360: 20 20 20 6e 20 3d 20 67 65 74 56 61 6c 75 65 28     n = getValue(
3370: 7a 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 69 66  z, &r);.      if
3380: 28 20 6e 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ( n<=0 ) break;.
3390: 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d        if( z[n]==
33a0: 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ':' ){.        /
33b0: 2a 20 41 20 6d 6f 64 69 66 69 65 72 20 6f 66 20  * A modifier of 
33c0: 74 68 65 20 66 6f 72 6d 20 28 2b 7c 2d 29 48 48  the form (+|-)HH
33d0: 3a 4d 4d 3a 53 53 2e 46 46 46 20 61 64 64 73 20  :MM:SS.FFF adds 
33e0: 28 6f 72 20 73 75 62 74 72 61 63 74 73 29 20 74  (or subtracts) t
33f0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 70  he.        ** sp
3400: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
3410: 66 20 68 6f 75 72 73 2c 20 6d 69 6e 75 74 65 73  f hours, minutes
3420: 2c 20 73 65 63 6f 6e 64 73 2c 20 61 6e 64 20 66  , seconds, and f
3430: 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64  ractional second
3440: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  s.        ** to 
3450: 74 68 65 20 74 69 6d 65 2e 20 20 54 68 65 20 22  the time.  The "
3460: 2e 46 46 46 22 20 6d 61 79 20 62 65 20 6f 6d 69  .FFF" may be omi
3470: 74 74 65 64 2e 20 20 54 68 65 20 22 3a 53 53 2e  tted.  The ":SS.
3480: 46 46 46 22 20 6d 61 79 20 62 65 0a 20 20 20 20  FFF" may be.    
3490: 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a      ** omitted..
34a0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
34c0: 32 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 44  2 = z;.        D
34d0: 61 74 65 54 69 6d 65 20 74 78 3b 0a 20 20 20 20  ateTime tx;.    
34e0: 20 20 20 20 69 6e 74 20 64 61 79 3b 0a 20 20 20      int day;.   
34f0: 20 20 20 20 20 69 66 28 20 21 69 73 64 69 67 69       if( !isdigi
3500: 74 28 2a 28 75 38 2a 29 7a 32 29 20 29 20 7a 32  t(*(u8*)z2) ) z2
3510: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ++;.        mems
3520: 65 74 28 26 74 78 2c 20 30 2c 20 73 69 7a 65 6f  et(&tx, 0, sizeo
3530: 66 28 74 78 29 29 3b 0a 20 20 20 20 20 20 20 20  f(tx));.        
3540: 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73 28  if( parseHhMmSs(
3550: 7a 32 2c 20 26 74 78 29 20 29 20 62 72 65 61 6b  z2, &tx) ) break
3560: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
3570: 65 4a 44 28 26 74 78 29 3b 0a 20 20 20 20 20 20  eJD(&tx);.      
3580: 20 20 74 78 2e 72 4a 44 20 2d 3d 20 30 2e 35 3b    tx.rJD -= 0.5;
3590: 0a 20 20 20 20 20 20 20 20 64 61 79 20 3d 20 28  .        day = (
35a0: 69 6e 74 29 74 78 2e 72 4a 44 3b 0a 20 20 20 20  int)tx.rJD;.    
35b0: 20 20 20 20 74 78 2e 72 4a 44 20 2d 3d 20 64 61      tx.rJD -= da
35c0: 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  y;.        if( z
35d0: 5b 30 5d 3d 3d 27 2d 27 20 29 20 74 78 2e 72 4a  [0]=='-' ) tx.rJ
35e0: 44 20 3d 20 2d 74 78 2e 72 4a 44 3b 0a 20 20 20  D = -tx.rJD;.   
35f0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
3600: 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72  );.        clear
3610: 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20  YMD_HMS_TZ(p);. 
3620: 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20        p->rJD += 
3630: 74 78 2e 72 4a 44 3b 0a 20 20 20 20 20 20 20 20  tx.rJD;.        
3640: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rc = 0;.        
3650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3660: 20 20 20 20 20 7a 20 2b 3d 20 6e 3b 0a 20 20 20       z += n;.   
3670: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
3680: 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b  e(*(u8*)z) ) z++
3690: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c  ;.      n = strl
36a0: 65 6e 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  en(z);.      if(
36b0: 20 6e 3e 31 30 20 7c 7c 20 6e 3c 33 20 29 20 62   n>10 || n<3 ) b
36c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
36d0: 7a 5b 6e 2d 31 5d 3d 3d 27 73 27 20 29 7b 20 7a  z[n-1]=='s' ){ z
36e0: 5b 6e 2d 31 5d 20 3d 20 30 3b 20 6e 2d 2d 3b 20  [n-1] = 0; n--; 
36f0: 7d 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a  }.      computeJ
3700: 44 28 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  D(p);.      rc =
3710: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d   0;.      if( n=
3720: 3d 33 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22  =3 && strcmp(z,"
3730: 64 61 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  day")==0 ){.    
3740: 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 72 3b      p->rJD += r;
3750: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
3760: 20 6e 3d 3d 34 20 26 26 20 73 74 72 63 6d 70 28   n==4 && strcmp(
3770: 7a 2c 22 68 6f 75 72 22 29 3d 3d 30 20 29 7b 0a  z,"hour")==0 ){.
3780: 20 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b          p->rJD +
3790: 3d 20 72 2f 32 34 2e 30 3b 0a 20 20 20 20 20 20  = r/24.0;.      
37a0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20 26  }else if( n==6 &
37b0: 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d 69 6e 75  & strcmp(z,"minu
37c0: 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  te")==0 ){.     
37d0: 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 72 2f 28     p->rJD += r/(
37e0: 32 34 2e 30 2a 36 30 2e 30 29 3b 0a 20 20 20 20  24.0*60.0);.    
37f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36    }else if( n==6
3800: 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 73 65   && strcmp(z,"se
3810: 63 6f 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  cond")==0 ){.   
3820: 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 72       p->rJD += r
3830: 2f 28 32 34 2e 30 2a 36 30 2e 30 2a 36 30 2e 30  /(24.0*60.0*60.0
3840: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
3850: 66 28 20 6e 3d 3d 35 20 26 26 20 73 74 72 63 6d  f( n==5 && strcm
3860: 70 28 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d 30 20  p(z,"month")==0 
3870: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
3880: 2c 20 79 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  , y;.        com
3890: 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a  puteYMD_HMS(p);.
38a0: 20 20 20 20 20 20 20 20 70 2d 3e 4d 20 2b 3d 20          p->M += 
38b0: 72 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 70  r;.        x = p
38c0: 2d 3e 4d 3e 30 20 3f 20 28 70 2d 3e 4d 2d 31 29  ->M>0 ? (p->M-1)
38d0: 2f 31 32 20 3a 20 28 70 2d 3e 4d 2d 31 32 29 2f  /12 : (p->M-12)/
38e0: 31 32 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 59  12;.        p->Y
38f0: 20 2b 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70   += x;.        p
3900: 2d 3e 4d 20 2d 3d 20 78 2a 31 32 3b 0a 20 20 20  ->M -= x*12;.   
3910: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20       p->validJD 
3920: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  = 0;.        com
3930: 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20  puteJD(p);.     
3940: 20 20 20 79 20 3d 20 72 3b 0a 20 20 20 20 20 20     y = r;.      
3950: 20 20 69 66 28 20 79 21 3d 72 20 29 7b 0a 20 20    if( y!=r ){.  
3960: 20 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b          p->rJD +
3970: 3d 20 28 72 20 2d 20 79 29 2a 33 30 2e 30 3b 0a  = (r - y)*30.0;.
3980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3990: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 34 20 26  }else if( n==4 &
39a0: 26 20 73 74 72 63 6d 70 28 7a 2c 22 79 65 61 72  & strcmp(z,"year
39b0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
39c0: 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28   computeYMD_HMS(
39d0: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 59  p);.        p->Y
39e0: 20 2b 3d 20 72 3b 0a 20 20 20 20 20 20 20 20 70   += r;.        p
39f0: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20  ->validJD = 0;. 
3a00: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44         computeJD
3a10: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
3a20: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  {.        rc = 1
3a30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3a40: 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28  clearYMD_HMS_TZ(
3a50: 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  p);.      break;
3a60: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
3a70: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
3a80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
3a90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3aa0: 2a 2a 20 50 72 6f 63 65 73 73 20 74 69 6d 65 20  ** Process time 
3ab0: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
3ac0: 74 73 2e 20 20 61 72 67 76 5b 30 5d 20 69 73 20  ts.  argv[0] is 
3ad0: 61 20 64 61 74 65 2d 74 69 6d 65 20 73 74 61 6d  a date-time stam
3ae0: 70 2e 0a 2a 2a 20 61 72 67 76 5b 31 5d 20 61 6e  p..** argv[1] an
3af0: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  d following are 
3b00: 6d 6f 64 69 66 69 65 72 73 2e 20 20 50 61 72 73  modifiers.  Pars
3b10: 65 20 74 68 65 6d 20 61 6c 6c 20 61 6e 64 20 77  e them all and w
3b20: 72 69 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75  rite.** the resu
3b30: 6c 74 69 6e 67 20 74 69 6d 65 20 69 6e 74 6f 20  lting time into 
3b40: 74 68 65 20 44 61 74 65 54 69 6d 65 20 73 74 72  the DateTime str
3b50: 75 63 74 75 72 65 20 70 2e 20 20 52 65 74 75 72  ucture p.  Retur
3b60: 6e 20 30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  n 0.** on succes
3b70: 73 20 61 6e 64 20 31 20 69 66 20 74 68 65 72 65  s and 1 if there
3b80: 20 61 72 65 20 61 6e 79 20 65 72 72 6f 72 73 2e   are any errors.
3b90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3ba0: 73 44 61 74 65 28 69 6e 74 20 61 72 67 63 2c 20  sDate(int argc, 
3bb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3bc0: 61 72 67 76 2c 20 44 61 74 65 54 69 6d 65 20 2a  argv, DateTime *
3bd0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
3be0: 66 28 20 61 72 67 63 3d 3d 30 20 29 20 72 65 74  f( argc==0 ) ret
3bf0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 53 51 4c  urn 1;.  if( SQL
3c00: 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65  ITE_NULL==sqlite
3c10: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
3c20: 76 5b 30 5d 29 20 7c 7c 20 0a 20 20 20 20 20 20  v[0]) || .      
3c30: 70 61 72 73 65 44 61 74 65 4f 72 54 69 6d 65 28  parseDateOrTime(
3c40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
3c50: 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 70 29 20  xt(argv[0]), p) 
3c60: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
3c70: 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=1; i<argc; i
3c80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
3c90: 49 54 45 5f 4e 55 4c 4c 3d 3d 73 71 6c 69 74 65  ITE_NULL==sqlite
3ca0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
3cb0: 76 5b 69 5d 29 20 7c 7c 20 0a 20 20 20 20 20 20  v[i]) || .      
3cc0: 20 20 70 61 72 73 65 4d 6f 64 69 66 69 65 72 28    parseModifier(
3cd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
3ce0: 78 74 28 61 72 67 76 5b 69 5d 29 2c 20 70 29 20  xt(argv[i]), p) 
3cf0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
3d00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
3d10: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
3d20: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70  ing routines imp
3d30: 6c 65 6d 65 6e 74 20 74 68 65 20 76 61 72 69 6f  lement the vario
3d40: 75 73 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65  us date and time
3d50: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 6f 66   functions.** of
3d60: 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 0a 2f 2a 0a   SQLite..*/../*.
3d70: 2a 2a 20 20 20 20 6a 75 6c 69 61 6e 64 61 79 28  **    julianday(
3d80: 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44   TIMESTRING, MOD
3d90: 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  , MOD, ...).**.*
3da0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6a 75 6c  * Return the jul
3db0: 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 20 6f  ian day number o
3dc0: 66 20 74 68 65 20 64 61 74 65 20 73 70 65 63 69  f the date speci
3dd0: 66 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75  fied in the argu
3de0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
3df0: 76 6f 69 64 20 6a 75 6c 69 61 6e 64 61 79 46 75  void juliandayFu
3e00: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
3e10: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
3e20: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
3e30: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
3e40: 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65  gv.){.  DateTime
3e50: 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61 74 65   x;.  if( isDate
3e60: 28 61 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29  (argc, argv, &x)
3e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6d 70 75  ==0 ){.    compu
3e80: 74 65 4a 44 28 26 78 29 3b 0a 20 20 20 20 73 71  teJD(&x);.    sq
3e90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
3ea0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 78 2e 72  ble(context, x.r
3eb0: 4a 44 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  JD);.  }.}../*.*
3ec0: 2a 20 20 20 20 64 61 74 65 74 69 6d 65 28 20 54  *    datetime( T
3ed0: 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20  IMESTRING, MOD, 
3ee0: 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  MOD, ...).**.** 
3ef0: 52 65 74 75 72 6e 20 59 59 59 59 2d 4d 4d 2d 44  Return YYYY-MM-D
3f00: 44 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2f 0a 73 74  D HH:MM:SS.*/.st
3f10: 61 74 69 63 20 76 6f 69 64 20 64 61 74 65 74 69  atic void dateti
3f20: 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  meFunc(.  sqlite
3f30: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3f40: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
3f50: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
3f60: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74 65  **argv.){.  Date
3f70: 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20 69 73  Time x;.  if( is
3f80: 44 61 74 65 28 61 72 67 63 2c 20 61 72 67 76 2c  Date(argc, argv,
3f90: 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63   &x)==0 ){.    c
3fa0: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
3fb0: 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d     computeYMD_HM
3fc0: 53 28 26 78 29 3b 0a 20 20 20 20 73 70 72 69 6e  S(&x);.    sprin
3fd0: 74 66 28 7a 42 75 66 2c 20 22 25 30 34 64 2d 25  tf(zBuf, "%04d-%
3fe0: 30 32 64 2d 25 30 32 64 20 25 30 32 64 3a 25 30  02d-%02d %02d:%0
3ff0: 32 64 3a 25 30 32 64 22 2c 78 2e 59 2c 20 78 2e  2d:%02d",x.Y, x.
4000: 4d 2c 20 78 2e 44 2c 20 78 2e 68 2c 20 78 2e 6d  M, x.D, x.h, x.m
4010: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 6e  ,.           (in
4020: 74 29 28 78 2e 73 29 29 3b 0a 20 20 20 20 73 71  t)(x.s));.    sq
4030: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4040: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c  t(context, zBuf,
4050: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
4060: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  SIENT);.  }.}../
4070: 2a 0a 2a 2a 20 20 20 20 74 69 6d 65 28 20 54 49  *.**    time( TI
4080: 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d  MESTRING, MOD, M
4090: 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52  OD, ...).**.** R
40a0: 65 74 75 72 6e 20 48 48 3a 4d 4d 3a 53 53 0a 2a  eturn HH:MM:SS.*
40b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 69  /.static void ti
40c0: 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  meFunc(.  sqlite
40d0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
40e0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
40f0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
4100: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74 65  **argv.){.  Date
4110: 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20 69 73  Time x;.  if( is
4120: 44 61 74 65 28 61 72 67 63 2c 20 61 72 67 76 2c  Date(argc, argv,
4130: 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63   &x)==0 ){.    c
4140: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
4150: 20 20 20 63 6f 6d 70 75 74 65 48 4d 53 28 26 78     computeHMS(&x
4160: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
4170: 42 75 66 2c 20 22 25 30 32 64 3a 25 30 32 64 3a  Buf, "%02d:%02d:
4180: 25 30 32 64 22 2c 20 78 2e 68 2c 20 78 2e 6d 2c  %02d", x.h, x.m,
4190: 20 28 69 6e 74 29 78 2e 73 29 3b 0a 20 20 20 20   (int)x.s);.    
41a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
41b0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
41c0: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
41d0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
41e0: 0a 2f 2a 0a 2a 2a 20 20 20 20 64 61 74 65 28 20  ./*.**    date( 
41f0: 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c  TIMESTRING, MOD,
4200: 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a   MOD, ...).**.**
4210: 20 52 65 74 75 72 6e 20 59 59 59 59 2d 4d 4d 2d   Return YYYY-MM-
4220: 44 44 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  DD.*/.static voi
4230: 64 20 64 61 74 65 46 75 6e 63 28 0a 20 20 73 71  d dateFunc(.  sq
4240: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
4250: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
4260: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
4270: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
4280: 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20 69 66  DateTime x;.  if
4290: 28 20 69 73 44 61 74 65 28 61 72 67 63 2c 20 61  ( isDate(argc, a
42a0: 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20  rgv, &x)==0 ){. 
42b0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30     char zBuf[100
42c0: 5d 3b 0a 20 20 20 20 63 6f 6d 70 75 74 65 59 4d  ];.    computeYM
42d0: 44 28 26 78 29 3b 0a 20 20 20 20 73 70 72 69 6e  D(&x);.    sprin
42e0: 74 66 28 7a 42 75 66 2c 20 22 25 30 34 64 2d 25  tf(zBuf, "%04d-%
42f0: 30 32 64 2d 25 30 32 64 22 2c 20 78 2e 59 2c 20  02d-%02d", x.Y, 
4300: 78 2e 4d 2c 20 78 2e 44 29 3b 0a 20 20 20 20 73  x.M, x.D);.    s
4310: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
4320: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  xt(context, zBuf
4330: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
4340: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a  NSIENT);.  }.}..
4350: 2f 2a 0a 2a 2a 20 20 20 20 73 74 72 66 74 69 6d  /*.**    strftim
4360: 65 28 20 46 4f 52 4d 41 54 2c 20 54 49 4d 45 53  e( FORMAT, TIMES
4370: 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c  TRING, MOD, MOD,
4380: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ...).**.** Retu
4390: 72 6e 20 61 20 73 74 72 69 6e 67 20 64 65 73 63  rn a string desc
43a0: 72 69 62 65 64 20 62 79 20 46 4f 52 4d 41 54 2e  ribed by FORMAT.
43b0: 20 20 43 6f 6e 76 65 72 73 69 6f 6e 73 20 61 73    Conversions as
43c0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
43d0: 20 20 25 64 20 20 64 61 79 20 6f 66 20 6d 6f 6e    %d  day of mon
43e0: 74 68 0a 2a 2a 20 20 20 25 66 20 20 2a 2a 20 66  th.**   %f  ** f
43f0: 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64  ractional second
4400: 73 20 20 53 53 2e 53 53 53 0a 2a 2a 20 20 20 25  s  SS.SSS.**   %
4410: 48 20 20 68 6f 75 72 20 30 30 2d 32 34 0a 2a 2a  H  hour 00-24.**
4420: 20 20 20 25 6a 20 20 64 61 79 20 6f 66 20 79 65     %j  day of ye
4430: 61 72 20 30 30 30 2d 33 36 36 0a 2a 2a 20 20 20  ar 000-366.**   
4440: 25 4a 20 20 2a 2a 20 4a 75 6c 69 61 6e 20 64 61  %J  ** Julian da
4450: 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 25 6d  y number.**   %m
4460: 20 20 6d 6f 6e 74 68 20 30 31 2d 31 32 0a 2a 2a    month 01-12.**
4470: 20 20 20 25 4d 20 20 6d 69 6e 75 74 65 20 30 30     %M  minute 00
4480: 2d 35 39 0a 2a 2a 20 20 20 25 73 20 20 73 65 63  -59.**   %s  sec
4490: 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2d  onds since 1970-
44a0: 30 31 2d 30 31 0a 2a 2a 20 20 20 25 53 20 20 73  01-01.**   %S  s
44b0: 65 63 6f 6e 64 73 20 30 30 2d 35 39 0a 2a 2a 20  econds 00-59.** 
44c0: 20 20 25 77 20 20 64 61 79 20 6f 66 20 77 65 65    %w  day of wee
44d0: 6b 20 30 2d 36 20 20 73 75 6e 64 61 79 3d 3d 30  k 0-6  sunday==0
44e0: 0a 2a 2a 20 20 20 25 57 20 20 77 65 65 6b 20 6f  .**   %W  week o
44f0: 66 20 79 65 61 72 20 30 30 2d 35 33 0a 2a 2a 20  f year 00-53.** 
4500: 20 20 25 59 20 20 79 65 61 72 20 30 30 30 30 2d    %Y  year 0000-
4510: 39 39 39 39 0a 2a 2a 20 20 20 25 25 20 20 25 0a  9999.**   %%  %.
4520: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
4530: 74 72 66 74 69 6d 65 46 75 6e 63 28 0a 20 20 73  trftimeFunc(.  s
4540: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4550: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
4560: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
4570: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
4580: 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20 69   DateTime x;.  i
4590: 6e 74 20 6e 2c 20 69 2c 20 6a 3b 0a 20 20 63 68  nt n, i, j;.  ch
45a0: 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 63  ar *z;.  const c
45b0: 68 61 72 20 2a 7a 46 6d 74 20 3d 20 73 71 6c 69  har *zFmt = sqli
45c0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
45d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 63 68 61 72 20  rgv[0]);.  char 
45e0: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28  zBuf[100];.  if(
45f0: 20 7a 46 6d 74 3d 3d 30 20 7c 7c 20 69 73 44 61   zFmt==0 || isDa
4600: 74 65 28 61 72 67 63 2d 31 2c 20 61 72 67 76 2b  te(argc-1, argv+
4610: 31 2c 20 26 78 29 20 29 20 72 65 74 75 72 6e 3b  1, &x) ) return;
4620: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 31 3b  .  for(i=0, n=1;
4630: 20 7a 46 6d 74 5b 69 5d 3b 20 69 2b 2b 2c 20 6e   zFmt[i]; i++, n
4640: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6d  ++){.    if( zFm
4650: 74 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20  t[i]=='%' ){.   
4660: 20 20 20 73 77 69 74 63 68 28 20 7a 46 6d 74 5b     switch( zFmt[
4670: 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  i+1] ){.        
4680: 63 61 73 65 20 27 64 27 3a 0a 20 20 20 20 20 20  case 'd':.      
4690: 20 20 63 61 73 65 20 27 48 27 3a 0a 20 20 20 20    case 'H':.    
46a0: 20 20 20 20 63 61 73 65 20 27 6d 27 3a 0a 20 20      case 'm':.  
46b0: 20 20 20 20 20 20 63 61 73 65 20 27 4d 27 3a 0a        case 'M':.
46c0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 53 27          case 'S'
46d0: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  :.        case '
46e0: 57 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 2b  W':.          n+
46f0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +;.          /* 
4700: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  fall thru */.   
4710: 20 20 20 20 20 63 61 73 65 20 27 77 27 3a 0a 20       case 'w':. 
4720: 20 20 20 20 20 20 20 63 61 73 65 20 27 25 27 3a         case '%':
4730: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4740: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
4750: 66 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 20  f':.          n 
4760: 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 20 20  += 8;.          
4770: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
4780: 61 73 65 20 27 6a 27 3a 0a 20 20 20 20 20 20 20  ase 'j':.       
4790: 20 20 20 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 20     n += 3;.     
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 59 27 3a 0a 20 20      case 'Y':.  
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 73  .        case 's
47f0: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
4800: 27 4a 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e  'J':.          n
4810: 20 2b 3d 20 35 30 3b 0a 20 20 20 20 20 20 20 20   += 50;.        
4820: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4830: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
4840: 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
4850: 45 52 52 4f 52 2e 20 20 72 65 74 75 72 6e 20 61  ERROR.  return a
4860: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 7d   NULL */.      }
4870: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
4880: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 73 69  }.  }.  if( n<si
4890: 7a 65 6f 66 28 7a 42 75 66 29 20 29 7b 0a 20 20  zeof(zBuf) ){.  
48a0: 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 65    z = zBuf;.  }e
48b0: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
48c0: 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a  iteMalloc( n );.
48d0: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72      if( z==0 ) r
48e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 63 6f 6d  eturn;.  }.  com
48f0: 70 75 74 65 4a 44 28 26 78 29 3b 0a 20 20 63 6f  puteJD(&x);.  co
4900: 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78 29  mputeYMD_HMS(&x)
4910: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a  ;.  for(i=j=0; z
4920: 46 6d 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  Fmt[i]; i++){.  
4930: 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 21 3d 27    if( zFmt[i]!='
4940: 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 5b 6a 2b  %' ){.      z[j+
4950: 2b 5d 20 3d 20 7a 46 6d 74 5b 69 5d 3b 0a 20 20  +] = zFmt[i];.  
4960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4970: 2b 2b 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  ++;.      switch
4980: 28 20 7a 46 6d 74 5b 69 5d 20 29 7b 0a 20 20 20  ( zFmt[i] ){.   
4990: 20 20 20 20 20 63 61 73 65 20 27 64 27 3a 20 20       case 'd':  
49a0: 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25  sprintf(&z[j],"%
49b0: 30 32 64 22 2c 78 2e 44 29 3b 20 6a 2b 3d 32 3b  02d",x.D); j+=2;
49c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
49d0: 63 61 73 65 20 27 66 27 3a 20 7b 0a 20 20 20 20  case 'f': {.    
49e0: 20 20 20 20 20 20 69 6e 74 20 73 20 3d 20 78 2e        int s = x.
49f0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  s;.          int
4a00: 20 6d 73 20 3d 20 28 78 2e 73 20 2d 20 73 29 2a   ms = (x.s - s)*
4a10: 31 30 30 30 2e 30 3b 0a 20 20 20 20 20 20 20 20  1000.0;.        
4a20: 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c    sprintf(&z[j],
4a30: 22 25 30 32 64 2e 25 30 33 64 22 2c 73 2c 6d 73  "%02d.%03d",s,ms
4a40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b  );.          j +
4a50: 3d 20 73 74 72 6c 65 6e 28 26 7a 5b 6a 5d 29 3b  = strlen(&z[j]);
4a60: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4a70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4a80: 20 20 20 20 63 61 73 65 20 27 48 27 3a 20 20 73      case 'H':  s
4a90: 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 30  printf(&z[j],"%0
4aa0: 32 64 22 2c 78 2e 68 29 3b 20 6a 2b 3d 32 3b 20  2d",x.h); j+=2; 
4ab0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
4ac0: 61 73 65 20 27 57 27 3a 20 2f 2a 20 46 61 6c 6c  ase 'W': /* Fall
4ad0: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20   thru */.       
4ae0: 20 63 61 73 65 20 27 6a 27 3a 20 7b 0a 20 20 20   case 'j': {.   
4af0: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20         int n;   
4b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4b10: 62 65 72 20 6f 66 20 64 61 79 73 20 73 69 6e 63  ber of days sinc
4b20: 65 20 31 73 74 20 64 61 79 20 6f 66 20 79 65 61  e 1st day of yea
4b30: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44  r */.          D
4b40: 61 74 65 54 69 6d 65 20 79 20 3d 20 78 3b 0a 20  ateTime y = x;. 
4b50: 20 20 20 20 20 20 20 20 20 79 2e 76 61 6c 69 64           y.valid
4b60: 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  JD = 0;.        
4b70: 20 20 79 2e 4d 20 3d 20 31 3b 0a 20 20 20 20 20    y.M = 1;.     
4b80: 20 20 20 20 20 79 2e 44 20 3d 20 31 3b 0a 20 20       y.D = 1;.  
4b90: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
4ba0: 44 28 26 79 29 3b 0a 20 20 20 20 20 20 20 20 20  D(&y);.         
4bb0: 20 6e 20 3d 20 78 2e 72 4a 44 20 2d 20 79 2e 72   n = x.rJD - y.r
4bc0: 4a 44 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  JD;.          if
4bd0: 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27 57 27 20 29  ( zFmt[i]=='W' )
4be0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
4bf0: 74 20 77 64 3b 20 20 20 2f 2a 20 30 3d 4d 6f 6e  t wd;   /* 0=Mon
4c00: 64 61 79 2c 20 31 3d 54 75 65 73 64 61 79 2c 20  day, 1=Tuesday, 
4c10: 2e 2e 2e 20 36 3d 53 75 6e 64 61 79 20 2a 2f 0a  ... 6=Sunday */.
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 77 64 20 3d              wd =
4c30: 20 28 28 69 6e 74 29 28 78 2e 72 4a 44 2b 30 2e   ((int)(x.rJD+0.
4c40: 35 29 29 20 25 20 37 3b 0a 20 20 20 20 20 20 20  5)) % 7;.       
4c50: 20 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 5b       sprintf(&z[
4c60: 6a 5d 2c 22 25 30 32 64 22 2c 28 6e 2b 37 2d 77  j],"%02d",(n+7-w
4c70: 64 29 2f 37 29 3b 0a 20 20 20 20 20 20 20 20 20  d)/7);.         
4c80: 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20 20 20 20     j += 2;.     
4c90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4ca0: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
4cb0: 26 7a 5b 6a 5d 2c 22 25 30 33 64 22 2c 6e 2b 31  &z[j],"%03d",n+1
4cc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
4cd0: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
4ce0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
4cf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4d00: 20 20 20 20 20 20 63 61 73 65 20 27 4a 27 3a 20        case 'J': 
4d10: 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22   sprintf(&z[j],"
4d20: 25 2e 31 36 67 22 2c 78 2e 72 4a 44 29 3b 20 6a  %.16g",x.rJD); j
4d30: 2b 3d 73 74 72 6c 65 6e 28 26 7a 5b 6a 5d 29 3b  +=strlen(&z[j]);
4d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4d50: 63 61 73 65 20 27 6d 27 3a 20 20 73 70 72 69 6e  case 'm':  sprin
4d60: 74 66 28 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c  tf(&z[j],"%02d",
4d70: 78 2e 4d 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61  x.M); j+=2; brea
4d80: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
4d90: 27 4d 27 3a 20 20 73 70 72 69 6e 74 66 28 26 7a  'M':  sprintf(&z
4da0: 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 6d 29 3b  [j],"%02d",x.m);
4db0: 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20   j+=2; break;.  
4dc0: 20 20 20 20 20 20 63 61 73 65 20 27 73 27 3a 20        case 's': 
4dd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 72 69  {.          spri
4de0: 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 64 22 2c 28  ntf(&z[j],"%d",(
4df0: 69 6e 74 29 28 28 78 2e 72 4a 44 2d 32 34 34 30  int)((x.rJD-2440
4e00: 35 38 37 2e 35 29 2a 38 36 34 30 30 2e 30 20 2b  587.5)*86400.0 +
4e10: 20 30 2e 35 29 29 3b 0a 20 20 20 20 20 20 20 20   0.5));.        
4e20: 20 20 6a 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a    j += strlen(&z
4e30: 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [j]);.          
4e40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4e50: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 53  .        case 'S
4e60: 27 3a 20 20 73 70 72 69 6e 74 66 28 26 7a 5b 6a  ':  sprintf(&z[j
4e70: 5d 2c 22 25 30 32 64 22 2c 28 69 6e 74 29 28 78  ],"%02d",(int)(x
4e80: 2e 73 2b 30 2e 35 29 29 3b 20 6a 2b 3d 32 3b 20  .s+0.5)); j+=2; 
4e90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
4ea0: 61 73 65 20 27 77 27 3a 20 20 7a 5b 6a 2b 2b 5d  ase 'w':  z[j++]
4eb0: 20 3d 20 28 28 28 69 6e 74 29 28 78 2e 72 4a 44   = (((int)(x.rJD
4ec0: 2b 31 2e 35 29 29 20 25 20 37 29 20 2b 20 27 30  +1.5)) % 7) + '0
4ed0: 27 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  '; break;.      
4ee0: 20 20 63 61 73 65 20 27 59 27 3a 20 20 73 70 72    case 'Y':  spr
4ef0: 69 6e 74 66 28 26 7a 5b 6a 5d 2c 22 25 30 34 64  intf(&z[j],"%04d
4f00: 22 2c 78 2e 59 29 3b 20 6a 2b 3d 73 74 72 6c 65  ",x.Y); j+=strle
4f10: 6e 28 26 7a 5b 6a 5d 29 3b 20 62 72 65 61 6b 3b  n(&z[j]); break;
4f20: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 25  .        case '%
4f30: 27 3a 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 25 27  ':  z[j++] = '%'
4f40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ; break;.      }
4f50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 6a  .    }.  }.  z[j
4f60: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
4f70: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
4f80: 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  text, z, -1, SQL
4f90: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
4fa0: 20 20 69 66 28 20 7a 21 3d 7a 42 75 66 20 29 7b    if( z!=zBuf ){
4fb0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4fc0: 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  z);.  }.}../*.**
4fd0: 20 63 75 72 72 65 6e 74 5f 74 69 6d 65 28 29 0a   current_time().
4fe0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4ff0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
5000: 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 69  same value as ti
5010: 6d 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74  me('now')..*/.st
5020: 61 74 69 63 20 76 6f 69 64 20 63 74 69 6d 65 46  atic void ctimeF
5030: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
5040: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5050: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5060: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5070: 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
5080: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 73  _value *pVal = s
5090: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29  qlite3ValueNew()
50a0: 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a  ;.  if( pVal ){.
50b0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
50c0: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
50d0: 20 22 6e 6f 77 22 2c 20 53 51 4c 49 54 45 5f 55   "now", SQLITE_U
50e0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
50f0: 49 43 29 3b 0a 20 20 20 20 74 69 6d 65 46 75 6e  IC);.    timeFun
5100: 63 28 63 6f 6e 74 65 78 74 2c 20 31 2c 20 26 70  c(context, 1, &p
5110: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
5120: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
5130: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63  ;.  }.}../*.** c
5140: 75 72 72 65 6e 74 5f 64 61 74 65 28 29 0a 2a 2a  urrent_date().**
5150: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5160: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61  n returns the sa
5170: 6d 65 20 76 61 6c 75 65 20 61 73 20 64 61 74 65  me value as date
5180: 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74 61 74  ('now')..*/.stat
5190: 69 63 20 76 6f 69 64 20 63 64 61 74 65 46 75 6e  ic void cdateFun
51a0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
51b0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
51c0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
51d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
51e0: 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  v.){.  sqlite3_v
51f0: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 73 71 6c  alue *pVal = sql
5200: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
5210: 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20    if( pVal ){.  
5220: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
5230: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22  tStr(pVal, -1, "
5240: 6e 6f 77 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  now", SQLITE_UTF
5250: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
5260: 29 3b 0a 20 20 20 20 64 61 74 65 46 75 6e 63 28  );.    dateFunc(
5270: 63 6f 6e 74 65 78 74 2c 20 31 2c 20 26 70 56 61  context, 1, &pVa
5280: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
5290: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
52a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72    }.}../*.** cur
52b0: 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70 28 29  rent_timestamp()
52c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
52d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
52e0: 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 64   same value as d
52f0: 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 2e 0a  atetime('now')..
5300: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5310: 74 69 6d 65 73 74 61 6d 70 46 75 6e 63 28 0a 20  timestampFunc(. 
5320: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
5330: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
5340: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
5350: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5360: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5370: 20 2a 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33   *pVal = sqlite3
5380: 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20 69 66  ValueNew();.  if
5390: 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ( pVal ){.    sq
53a0: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
53b0: 28 70 56 61 6c 2c 20 2d 31 2c 20 22 6e 6f 77 22  (pVal, -1, "now"
53c0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
53d0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
53e0: 20 20 20 64 61 74 65 74 69 6d 65 46 75 6e 63 28     datetimeFunc(
53f0: 63 6f 6e 74 65 78 74 2c 20 31 2c 20 26 70 56 61  context, 1, &pVa
5400: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
5410: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
5420: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
5430: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5440: 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55  OMIT_DATETIME_FU
5450: 4e 43 53 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  NCS) */..#ifdef 
5460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45  SQLITE_OMIT_DATE
5470: 54 49 4d 45 5f 46 55 4e 43 53 0a 2f 2a 0a 2a 2a  TIME_FUNCS./*.**
5480: 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   If the library 
5490: 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 6f  is compiled to o
54a0: 6d 69 74 20 74 68 65 20 66 75 6c 6c 2d 73 63 61  mit the full-sca
54b0: 6c 65 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65  le date and time
54c0: 0a 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 28 74 6f  .** handling (to
54d0: 20 67 65 74 20 61 20 73 6d 61 6c 6c 65 72 20 62   get a smaller b
54e0: 69 6e 61 72 79 29 2c 20 74 68 65 20 66 6f 6c 6c  inary), the foll
54f0: 6f 77 69 6e 67 20 6d 69 6e 69 6d 61 6c 20 76 65  owing minimal ve
5500: 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  rsion.** of the 
5510: 66 75 6e 63 74 69 6f 6e 73 20 63 75 72 72 65 6e  functions curren
5520: 74 5f 74 69 6d 65 28 29 2c 20 63 75 72 72 65 6e  t_time(), curren
5530: 74 5f 64 61 74 65 28 29 20 61 6e 64 20 63 75 72  t_date() and cur
5540: 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70 28 29  rent_timestamp()
5550: 0a 2a 2a 20 61 72 65 20 69 6e 63 6c 75 64 65 64  .** are included
5560: 20 69 6e 73 74 65 61 64 2e 20 54 68 69 73 20 69   instead. This i
5570: 73 20 74 6f 20 73 75 70 70 6f 72 74 20 63 6f 6c  s to support col
5580: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  umn declarations
5590: 20 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65   that.** include
55a0: 20 22 44 45 46 41 55 4c 54 20 43 55 52 52 45 4e   "DEFAULT CURREN
55b0: 54 5f 54 49 4d 45 22 20 65 74 63 2e 0a 2a 2a 0a  T_TIME" etc..**.
55c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
55d0: 20 75 73 65 73 20 74 68 65 20 43 2d 6c 69 62 72   uses the C-libr
55e0: 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20 74 69  ary functions ti
55f0: 6d 65 28 29 2c 20 67 6d 74 69 6d 65 28 29 0a 2a  me(), gmtime().*
5600: 2a 20 61 6e 64 20 73 74 72 66 74 69 6d 65 28 29  * and strftime()
5610: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72  . The format str
5620: 69 6e 67 20 74 6f 20 70 61 73 73 20 74 6f 20 73  ing to pass to s
5630: 74 72 66 74 69 6d 65 28 29 20 69 73 20 73 75 70  trftime() is sup
5640: 70 6c 69 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  plied.** as the 
5650: 75 73 65 72 2d 64 61 74 61 20 66 6f 72 20 74 68  user-data for th
5660: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  e function..*/.s
5670: 74 61 74 69 63 20 76 6f 69 64 20 63 75 72 72 65  tatic void curre
5680: 6e 74 54 69 6d 65 46 75 6e 63 28 0a 20 20 73 71  ntTimeFunc(.  sq
5690: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
56a0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
56b0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
56c0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
56d0: 74 69 6d 65 5f 74 20 74 3b 0a 20 20 63 68 61 72  time_t t;.  char
56e0: 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 28 63 68 61   *zFormat = (cha
56f0: 72 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  r *)sqlite3_user
5700: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a  _data(context);.
5710: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 5d 3b    char zBuf[20];
5720: 0a 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 23 69  ..  time(&t);.#i
5730: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
5740: 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  .  {.    extern 
5750: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
5760: 65 6e 74 5f 74 69 6d 65 3b 20 20 2f 2a 20 53 65  ent_time;  /* Se
5770: 65 20 6f 73 5f 58 58 58 2e 63 20 2a 2f 0a 20 20  e os_XXX.c */.  
5780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
5790: 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
57a0: 20 20 20 20 74 20 3d 20 73 71 6c 69 74 65 33 5f      t = sqlite3_
57b0: 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 20 20  current_time;.  
57c0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
57d0: 20 20 73 71 6c 69 74 65 33 4f 73 2e 78 45 6e 74    sqlite3Os.xEnt
57e0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 73 74 72  erMutex();.  str
57f0: 66 74 69 6d 65 28 7a 42 75 66 2c 20 32 30 2c 20  ftime(zBuf, 20, 
5800: 7a 46 6f 72 6d 61 74 2c 20 67 6d 74 69 6d 65 28  zFormat, gmtime(
5810: 26 74 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  &t));.  sqlite3O
5820: 73 2e 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  s.xLeaveMutex();
5830: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ..  sqlite3_resu
5840: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
5850: 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54   zBuf, -1, SQLIT
5860: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
5870: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
5880: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69  is function regi
5890: 73 74 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68  stered all of th
58a0: 65 20 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69  e above C functi
58b0: 6f 6e 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75  ons as SQL.** fu
58c0: 6e 63 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73  nctions.  This s
58d0: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c  hould be the onl
58e0: 79 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69  y routine in thi
58f0: 73 20 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65  s file with.** e
5900: 78 74 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e  xternal linkage.
5910: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5920: 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d 65  RegisterDateTime
5930: 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65  Functions(sqlite
5940: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
5950: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45  SQLITE_OMIT_DATE
5960: 54 49 4d 45 5f 46 55 4e 43 53 0a 20 20 73 74 61  TIME_FUNCS.  sta
5970: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
5980: 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
5990: 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41  ame;.     int nA
59a0: 72 67 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a  rg;.     void (*
59b0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
59c0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
59d0: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20  te3_value**);.  
59e0: 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20  } aFuncs[] = {. 
59f0: 20 20 20 7b 20 22 6a 75 6c 69 61 6e 64 61 79 22     { "julianday"
5a00: 2c 20 2d 31 2c 20 6a 75 6c 69 61 6e 64 61 79 46  , -1, juliandayF
5a10: 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  unc   },.    { "
5a20: 64 61 74 65 22 2c 20 20 20 20 20 20 2d 31 2c 20  date",      -1, 
5a30: 64 61 74 65 46 75 6e 63 20 20 20 20 20 20 20 20  dateFunc        
5a40: 7d 2c 0a 20 20 20 20 7b 20 22 74 69 6d 65 22 2c  },.    { "time",
5a50: 20 20 20 20 20 20 2d 31 2c 20 74 69 6d 65 46 75        -1, timeFu
5a60: 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  nc        },.   
5a70: 20 7b 20 22 64 61 74 65 74 69 6d 65 22 2c 20 20   { "datetime",  
5a80: 2d 31 2c 20 64 61 74 65 74 69 6d 65 46 75 6e 63  -1, datetimeFunc
5a90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74      },.    { "st
5aa0: 72 66 74 69 6d 65 22 2c 20 20 2d 31 2c 20 73 74  rftime",  -1, st
5ab0: 72 66 74 69 6d 65 46 75 6e 63 20 20 20 20 7d 2c  rftimeFunc    },
5ac0: 0a 20 20 20 20 7b 20 22 63 75 72 72 65 6e 74 5f  .    { "current_
5ad0: 74 69 6d 65 22 2c 20 20 20 20 20 20 20 30 2c 20  time",       0, 
5ae0: 63 74 69 6d 65 46 75 6e 63 20 20 20 20 20 20 7d  ctimeFunc      }
5af0: 2c 0a 20 20 20 20 7b 20 22 63 75 72 72 65 6e 74  ,.    { "current
5b00: 5f 74 69 6d 65 73 74 61 6d 70 22 2c 20 20 30 2c  _timestamp",  0,
5b10: 20 63 74 69 6d 65 73 74 61 6d 70 46 75 6e 63 20   ctimestampFunc 
5b20: 7d 2c 0a 20 20 20 20 7b 20 22 63 75 72 72 65 6e  },.    { "curren
5b30: 74 5f 64 61 74 65 22 2c 20 20 20 20 20 20 20 30  t_date",       0
5b40: 2c 20 63 64 61 74 65 46 75 6e 63 20 20 20 20 20  , cdateFunc     
5b50: 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
5b60: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
5b70: 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 29 2f 73  sizeof(aFuncs)/s
5b80: 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b 30 5d 29  izeof(aFuncs[0])
5b90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
5ba0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
5bb0: 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 73 5b 69  ion(db, aFuncs[i
5bc0: 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 73 5b  ].zName, aFuncs[
5bd0: 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20  i].nArg,.       
5be0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
5bf0: 20 61 46 75 6e 63 73 5b 69 5d 2e 78 46 75 6e 63   aFuncs[i].xFunc
5c00: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6c  , 0, 0);.  }.#el
5c10: 73 65 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  se.  static cons
5c20: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
5c30: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
5c40: 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 3b    char *zFormat;
5c50: 0a 20 20 7d 20 61 46 75 6e 63 73 5b 5d 20 3d 20  .  } aFuncs[] = 
5c60: 7b 0a 20 20 20 20 7b 20 22 63 75 72 72 65 6e 74  {.    { "current
5c70: 5f 74 69 6d 65 22 2c 20 22 25 48 3a 25 4d 3a 25  _time", "%H:%M:%
5c80: 53 22 20 7d 2c 0a 20 20 20 20 7b 20 22 63 75 72  S" },.    { "cur
5c90: 72 65 6e 74 5f 64 61 74 65 22 2c 20 22 25 59 2d  rent_date", "%Y-
5ca0: 25 6d 2d 25 64 22 20 7d 2c 0a 20 20 20 20 7b 20  %m-%d" },.    { 
5cb0: 22 63 75 72 72 65 6e 74 5f 74 69 6d 65 73 74 61  "current_timesta
5cc0: 6d 70 22 2c 20 22 25 59 2d 25 6d 2d 25 64 20 25  mp", "%Y-%m-%d %
5cd0: 48 3a 25 4d 3a 25 53 22 20 7d 0a 20 20 7d 3b 0a  H:%M:%S" }.  };.
5ce0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28    int i;..  for(
5cf0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 46  i=0; i<sizeof(aF
5d00: 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28 61 46 75  uncs)/sizeof(aFu
5d10: 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ncs[0]); i++){. 
5d20: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
5d30: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
5d40: 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  Funcs[i].zName, 
5d50: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
5d60: 0a 20 20 20 20 20 20 20 20 61 46 75 6e 63 73 5b  .        aFuncs[
5d70: 69 5d 2e 7a 46 6f 72 6d 61 74 2c 20 63 75 72 72  i].zFormat, curr
5d80: 65 6e 74 54 69 6d 65 46 75 6e 63 2c 20 30 2c 20  entTimeFunc, 0, 
5d90: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  0);.  }.#endif.}
5da0: 0a                                               .