/ Hex Artifact Content
Login

Artifact e4655393bb403fa310eef66cc4583d75d4d7fd93:


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 53 51 4c 69 74 65 20 70 72 6f  **.** SQLite pro
0290: 63 65 73 73 65 73 20 61 6c 6c 20 74 69 6d 65 73  cesses all times
02a0: 20 61 6e 64 20 64 61 74 65 73 20 61 73 20 6a 75   and dates as ju
02b0: 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 73  lian day numbers
02c0: 2e 20 20 54 68 65 0a 2a 2a 20 64 61 74 65 73 20  .  The.** dates 
02d0: 61 6e 64 20 74 69 6d 65 73 20 61 72 65 20 73 74  and times are st
02e0: 6f 72 65 64 20 61 73 20 74 68 65 20 6e 75 6d 62  ored as the numb
02f0: 65 72 20 6f 66 20 64 61 79 73 20 73 69 6e 63 65  er of days since
0300: 20 6e 6f 6f 6e 0a 2a 2a 20 69 6e 20 47 72 65 65   noon.** in Gree
0310: 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
0320: 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 2e 20  r 24, 4714 B.C. 
0330: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
0340: 20 47 72 65 67 6f 72 69 61 6e 0a 2a 2a 20 63 61   Gregorian.** ca
0350: 6c 65 6e 64 61 72 20 73 79 73 74 65 6d 2e 20 0a  lendar system. .
0360: 2a 2a 0a 2a 2a 20 31 39 37 30 2d 30 31 2d 30 31  **.** 1970-01-01
0370: 20 30 30 3a 30 30 3a 30 30 20 69 73 20 4a 44 20   00:00:00 is JD 
0380: 32 34 34 30 35 38 37 2e 35 0a 2a 2a 20 32 30 30  2440587.5.** 200
0390: 30 2d 30 31 2d 30 31 20 30 30 3a 30 30 3a 30 30  0-01-01 00:00:00
03a0: 20 69 73 20 4a 44 20 32 34 35 31 35 34 34 2e 35   is JD 2451544.5
03b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c  .**.** This impl
03c0: 65 6d 65 6e 74 61 74 69 6f 6e 20 72 65 71 75 69  ementation requi
03d0: 72 65 73 20 79 65 61 72 73 20 74 6f 20 62 65 20  res years to be 
03e0: 65 78 70 72 65 73 73 65 64 20 61 73 20 61 20 34  expressed as a 4
03f0: 2d 64 69 67 69 74 20 6e 75 6d 62 65 72 0a 2a 2a  -digit number.**
0400: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
0410: 74 20 6f 6e 6c 79 20 64 61 74 65 73 20 62 65 74  t only dates bet
0420: 77 65 65 6e 20 30 30 30 30 2d 30 31 2d 30 31 20  ween 0000-01-01 
0430: 61 6e 64 20 39 39 39 39 2d 31 32 2d 33 31 20 63  and 9999-12-31 c
0440: 61 6e 0a 2a 2a 20 62 65 20 72 65 70 72 65 73 65  an.** be represe
0450: 6e 74 65 64 2c 20 65 76 65 6e 20 74 68 6f 75 67  nted, even thoug
0460: 68 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d  h julian day num
0470: 62 65 72 73 20 61 6c 6c 6f 77 20 61 20 6d 75 63  bers allow a muc
0480: 68 20 77 69 64 65 72 0a 2a 2a 20 72 61 6e 67 65  h wider.** range
0490: 20 6f 66 20 64 61 74 65 73 2e 0a 2a 2a 0a 2a 2a   of dates..**.**
04a0: 20 54 68 65 20 47 72 65 67 6f 72 69 61 6e 20 63   The Gregorian c
04b0: 61 6c 65 6e 64 61 72 20 73 79 73 74 65 6d 20 69  alendar system i
04c0: 73 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 64  s used for all d
04d0: 61 74 65 73 20 61 6e 64 20 74 69 6d 65 73 2c 0a  ates and times,.
04e0: 2a 2a 20 65 76 65 6e 20 74 68 6f 73 65 20 74 68  ** even those th
04f0: 61 74 20 70 72 65 64 61 74 65 20 74 68 65 20 47  at predate the G
0500: 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
0510: 72 2e 20 20 48 69 73 74 6f 72 69 61 6e 73 20 75  r.  Historians u
0520: 73 75 61 6c 6c 79 0a 2a 2a 20 75 73 65 20 74 68  sually.** use th
0530: 65 20 6a 75 6c 69 61 6e 20 63 61 6c 65 6e 64 61  e julian calenda
0540: 72 20 66 6f 72 20 64 61 74 65 73 20 70 72 69 6f  r for dates prio
0550: 72 20 74 6f 20 31 35 38 32 2d 31 30 2d 31 35 20  r to 1582-10-15 
0560: 61 6e 64 20 66 6f 72 20 73 6f 6d 65 0a 2a 2a 20  and for some.** 
0570: 64 61 74 65 73 20 61 66 74 65 72 77 61 72 64 73  dates afterwards
0580: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 6c  , depending on l
0590: 6f 63 61 6c 65 2e 20 20 42 65 77 61 72 65 20 6f  ocale.  Beware o
05a0: 66 20 74 68 69 73 20 64 69 66 66 65 72 65 6e 63  f this differenc
05b0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  e..**.** The con
05c0: 76 65 72 73 69 6f 6e 20 61 6c 67 6f 72 69 74 68  version algorith
05d0: 6d 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  ms are implement
05e0: 65 64 20 62 61 73 65 64 20 6f 6e 20 64 65 73 63  ed based on desc
05f0: 72 69 70 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74  riptions.** in t
0600: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78  he following tex
0610: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 4a 65  t:.**.**      Je
0620: 61 6e 20 4d 65 65 75 73 0a 2a 2a 20 20 20 20 20  an Meeus.**     
0630: 20 41 73 74 72 6f 6e 6f 6d 69 63 61 6c 20 41 6c   Astronomical Al
0640: 67 6f 72 69 74 68 6d 73 2c 20 32 6e 64 20 45 64  gorithms, 2nd Ed
0650: 69 74 69 6f 6e 2c 20 31 39 39 38 0a 2a 2a 20 20  ition, 1998.**  
0660: 20 20 20 20 49 53 42 4d 20 30 2d 39 34 33 33 39      ISBM 0-94339
0670: 36 2d 36 31 2d 31 0a 2a 2a 20 20 20 20 20 20 57  6-61-1.**      W
0680: 69 6c 6c 6d 61 6e 6e 2d 42 65 6c 6c 2c 20 49 6e  illmann-Bell, In
0690: 63 0a 2a 2a 20 20 20 20 20 20 52 69 63 68 6d 6f  c.**      Richmo
06a0: 6e 64 2c 20 56 69 72 67 69 6e 69 61 20 28 55 53  nd, Virginia (US
06b0: 41 29 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  A).*/.#include "
06c0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
06d0: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
06e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
06f0: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  t.h>.#include <t
0700: 69 6d 65 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20  ime.h>..#ifndef 
0710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45  SQLITE_OMIT_DATE
0720: 54 49 4d 45 5f 46 55 4e 43 53 0a 0a 0a 2f 2a 0a  TIME_FUNCS.../*.
0730: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 66  ** A structure f
0740: 6f 72 20 68 6f 6c 64 69 6e 67 20 61 20 73 69 6e  or holding a sin
0750: 67 6c 65 20 64 61 74 65 20 61 6e 64 20 74 69 6d  gle date and tim
0760: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
0770: 72 75 63 74 20 44 61 74 65 54 69 6d 65 20 44 61  ruct DateTime Da
0780: 74 65 54 69 6d 65 3b 0a 73 74 72 75 63 74 20 44  teTime;.struct D
0790: 61 74 65 54 69 6d 65 20 7b 0a 20 20 73 71 6c 69  ateTime {.  sqli
07a0: 74 65 33 5f 69 6e 74 36 34 20 69 4a 44 3b 20 2f  te3_int64 iJD; /
07b0: 2a 20 54 68 65 20 6a 75 6c 69 61 6e 20 64 61 79  * The julian day
07c0: 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
07d0: 34 30 30 30 30 30 20 2a 2f 0a 20 20 69 6e 74 20  400000 */.  int 
07e0: 59 2c 20 4d 2c 20 44 3b 20 20 20 20 20 20 20 2f  Y, M, D;       /
07f0: 2a 20 59 65 61 72 2c 20 6d 6f 6e 74 68 2c 20 61  * Year, month, a
0800: 6e 64 20 64 61 79 20 2a 2f 0a 20 20 69 6e 74 20  nd day */.  int 
0810: 68 2c 20 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  h, m;          /
0820: 2a 20 48 6f 75 72 20 61 6e 64 20 6d 69 6e 75 74  * Hour and minut
0830: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 74 7a 3b 20  es */.  int tz; 
0840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 69             /* Ti
0850: 6d 65 7a 6f 6e 65 20 6f 66 66 73 65 74 20 69 6e  mezone offset in
0860: 20 6d 69 6e 75 74 65 73 20 2a 2f 0a 20 20 64 6f   minutes */.  do
0870: 75 62 6c 65 20 73 3b 20 20 20 20 20 20 20 20 20  uble s;         
0880: 20 2f 2a 20 53 65 63 6f 6e 64 73 20 2a 2f 0a 20   /* Seconds */. 
0890: 20 63 68 61 72 20 76 61 6c 69 64 59 4d 44 3b 20   char validYMD; 
08a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 28 31 29 20      /* True (1) 
08b0: 69 66 20 59 2c 4d 2c 44 20 61 72 65 20 76 61 6c  if Y,M,D are val
08c0: 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 76 61 6c  id */.  char val
08d0: 69 64 48 4d 53 3b 20 20 20 20 20 2f 2a 20 54 72  idHMS;     /* Tr
08e0: 75 65 20 28 31 29 20 69 66 20 68 2c 6d 2c 73 20  ue (1) if h,m,s 
08f0: 61 72 65 20 76 61 6c 69 64 20 2a 2f 0a 20 20 63  are valid */.  c
0900: 68 61 72 20 76 61 6c 69 64 4a 44 3b 20 20 20 20  har validJD;    
0910: 20 20 2f 2a 20 54 72 75 65 20 28 31 29 20 69 66    /* True (1) if
0920: 20 69 4a 44 20 69 73 20 76 61 6c 69 64 20 2a 2f   iJD is valid */
0930: 0a 20 20 63 68 61 72 20 76 61 6c 69 64 54 5a 3b  .  char validTZ;
0940: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 28 31        /* True (1
0950: 29 20 69 66 20 74 7a 20 69 73 20 76 61 6c 69 64  ) if tz is valid
0960: 20 2a 2f 0a 20 20 63 68 61 72 20 74 7a 53 65 74   */.  char tzSet
0970: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 69 6d 65  ;        /* Time
0980: 7a 6f 6e 65 20 77 61 73 20 73 65 74 20 65 78 70  zone was set exp
0990: 6c 69 63 69 74 6c 79 20 2a 2f 0a 7d 3b 0a 0a 0a  licitly */.};...
09a0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 7a 44  /*.** Convert zD
09b0: 61 74 65 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20  ate into one or 
09c0: 6d 6f 72 65 20 69 6e 74 65 67 65 72 73 2e 20 20  more integers.  
09d0: 41 64 64 69 74 69 6f 6e 61 6c 20 61 72 67 75 6d  Additional argum
09e0: 65 6e 74 73 0a 2a 2a 20 63 6f 6d 65 20 69 6e 20  ents.** come in 
09f0: 67 72 6f 75 70 73 20 6f 66 20 35 20 61 73 20 66  groups of 5 as f
0a00: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
0a10: 20 20 20 20 4e 20 20 20 20 20 20 20 6e 75 6d 62      N       numb
0a20: 65 72 20 6f 66 20 64 69 67 69 74 73 20 69 6e 20  er of digits in 
0a30: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  the integer.**  
0a40: 20 20 20 20 20 6d 69 6e 20 20 20 20 20 6d 69 6e       min     min
0a50: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 76 61 6c  imum allowed val
0a60: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
0a70: 72 0a 2a 2a 20 20 20 20 20 20 20 6d 61 78 20 20  r.**       max  
0a80: 20 20 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77     maximum allow
0a90: 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ed value of the 
0aa0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
0ab0: 20 6e 65 78 74 43 20 20 20 66 69 72 73 74 20 63   nextC   first c
0ac0: 68 61 72 61 63 74 65 72 20 61 66 74 65 72 20 74  haracter after t
0ad0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  he integer.**   
0ae0: 20 20 20 20 70 56 61 6c 20 20 20 20 77 68 65 72      pVal    wher
0af0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 69  e to write the i
0b00: 6e 74 65 67 65 72 73 20 76 61 6c 75 65 2e 0a 2a  ntegers value..*
0b10: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 73 69 6f 6e 73  *.** Conversions
0b20: 20 63 6f 6e 74 69 6e 75 65 20 75 6e 74 69 6c 20   continue until 
0b30: 6f 6e 65 20 77 69 74 68 20 6e 65 78 74 43 3d 3d  one with nextC==
0b40: 30 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  0 is encountered
0b50: 2e 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f  ..** The functio
0b60: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  n returns the nu
0b70: 6d 62 65 72 20 6f 66 20 73 75 63 63 65 73 73 66  mber of successf
0b80: 75 6c 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 0a  ul conversions..
0b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
0ba0: 74 44 69 67 69 74 73 28 63 6f 6e 73 74 20 63 68  tDigits(const ch
0bb0: 61 72 20 2a 7a 44 61 74 65 2c 20 2e 2e 2e 29 7b  ar *zDate, ...){
0bc0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
0bd0: 20 69 6e 74 20 76 61 6c 3b 0a 20 20 69 6e 74 20   int val;.  int 
0be0: 4e 3b 0a 20 20 69 6e 74 20 6d 69 6e 3b 0a 20 20  N;.  int min;.  
0bf0: 69 6e 74 20 6d 61 78 3b 0a 20 20 69 6e 74 20 6e  int max;.  int n
0c00: 65 78 74 43 3b 0a 20 20 69 6e 74 20 2a 70 56 61  extC;.  int *pVa
0c10: 6c 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  l;.  int cnt = 0
0c20: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
0c30: 20 7a 44 61 74 65 29 3b 0a 20 20 64 6f 7b 0a 20   zDate);.  do{. 
0c40: 20 20 20 4e 20 3d 20 76 61 5f 61 72 67 28 61 70     N = va_arg(ap
0c50: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 6d 69 6e 20  , int);.    min 
0c60: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0c70: 29 3b 0a 20 20 20 20 6d 61 78 20 3d 20 76 61 5f  );.    max = va_
0c80: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
0c90: 20 20 6e 65 78 74 43 20 3d 20 76 61 5f 61 72 67    nextC = va_arg
0ca0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 70  (ap, int);.    p
0cb0: 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Val = va_arg(ap,
0cc0: 20 69 6e 74 2a 29 3b 0a 20 20 20 20 76 61 6c 20   int*);.    val 
0cd0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
0ce0: 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  N-- ){.      if(
0cf0: 20 21 73 71 6c 69 74 65 33 49 73 64 69 67 69 74   !sqlite3Isdigit
0d00: 28 2a 7a 44 61 74 65 29 20 29 7b 0a 20 20 20 20  (*zDate) ){.    
0d10: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 67 65 74      goto end_get
0d20: 44 69 67 69 74 73 3b 0a 20 20 20 20 20 20 7d 0a  Digits;.      }.
0d30: 20 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c 2a        val = val*
0d40: 31 30 20 2b 20 2a 7a 44 61 74 65 20 2d 20 27 30  10 + *zDate - '0
0d50: 27 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 2b 2b  ';.      zDate++
0d60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
0d70: 76 61 6c 3c 6d 69 6e 20 7c 7c 20 76 61 6c 3e 6d  val<min || val>m
0d80: 61 78 20 7c 7c 20 28 6e 65 78 74 43 21 3d 30 20  ax || (nextC!=0 
0d90: 26 26 20 6e 65 78 74 43 21 3d 2a 7a 44 61 74 65  && nextC!=*zDate
0da0: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
0db0: 65 6e 64 5f 67 65 74 44 69 67 69 74 73 3b 0a 20  end_getDigits;. 
0dc0: 20 20 20 7d 0a 20 20 20 20 2a 70 56 61 6c 20 3d     }.    *pVal =
0dd0: 20 76 61 6c 3b 0a 20 20 20 20 7a 44 61 74 65 2b   val;.    zDate+
0de0: 2b 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  +;.    cnt++;.  
0df0: 7d 77 68 69 6c 65 28 20 6e 65 78 74 43 20 29 3b  }while( nextC );
0e00: 0a 65 6e 64 5f 67 65 74 44 69 67 69 74 73 3a 0a  .end_getDigits:.
0e10: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
0e20: 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 2f  return cnt;.}../
0e30: 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 74 69 6d  *.** Parse a tim
0e40: 65 7a 6f 6e 65 20 65 78 74 65 6e 73 69 6f 6e 20  ezone extension 
0e50: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  on the end of a 
0e60: 64 61 74 65 2d 74 69 6d 65 2e 0a 2a 2a 20 54 68  date-time..** Th
0e70: 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6f  e extension is o
0e80: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
0e90: 2a 20 20 20 20 20 20 20 20 28 2b 2f 2d 29 48 48  *        (+/-)HH
0ea0: 3a 4d 4d 0a 2a 2a 0a 2a 2a 20 4f 72 20 74 68 65  :MM.**.** Or the
0eb0: 20 22 7a 75 6c 75 22 20 6e 6f 74 61 74 69 6f 6e   "zulu" notation
0ec0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 5a  :.**.**        Z
0ed0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
0ee0: 72 73 65 20 69 73 20 73 75 63 63 65 73 73 66 75  rse is successfu
0ef0: 6c 2c 20 77 72 69 74 65 20 74 68 65 20 6e 75 6d  l, write the num
0f00: 62 65 72 20 6f 66 20 6d 69 6e 75 74 65 73 0a 2a  ber of minutes.*
0f10: 2a 20 6f 66 20 63 68 61 6e 67 65 20 69 6e 20 70  * of change in p
0f20: 2d 3e 74 7a 20 61 6e 64 20 72 65 74 75 72 6e 20  ->tz and return 
0f30: 30 2e 20 20 49 66 20 61 20 70 61 72 73 65 72 20  0.  If a parser 
0f40: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
0f50: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
0f60: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6d 69 73 73 69 6e  ..**.** A missin
0f70: 67 20 73 70 65 63 69 66 69 65 72 20 69 73 20 6e  g specifier is n
0f80: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
0f90: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
0fa0: 63 20 69 6e 74 20 70 61 72 73 65 54 69 6d 65 7a  c int parseTimez
0fb0: 6f 6e 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  one(const char *
0fc0: 7a 44 61 74 65 2c 20 44 61 74 65 54 69 6d 65 20  zDate, DateTime 
0fd0: 2a 70 29 7b 0a 20 20 69 6e 74 20 73 67 6e 20 3d  *p){.  int sgn =
0fe0: 20 30 3b 0a 20 20 69 6e 74 20 6e 48 72 2c 20 6e   0;.  int nHr, n
0ff0: 4d 6e 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 77  Mn;.  int c;.  w
1000: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
1010: 70 61 63 65 28 2a 7a 44 61 74 65 29 20 29 7b 20  pace(*zDate) ){ 
1020: 7a 44 61 74 65 2b 2b 3b 20 7d 0a 20 20 70 2d 3e  zDate++; }.  p->
1030: 74 7a 20 3d 20 30 3b 0a 20 20 63 20 3d 20 2a 7a  tz = 0;.  c = *z
1040: 44 61 74 65 3b 0a 20 20 69 66 28 20 63 3d 3d 27  Date;.  if( c=='
1050: 2d 27 20 29 7b 0a 20 20 20 20 73 67 6e 20 3d 20  -' ){.    sgn = 
1060: 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  -1;.  }else if( 
1070: 63 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 73 67  c=='+' ){.    sg
1080: 6e 20 3d 20 2b 31 3b 0a 20 20 7d 65 6c 73 65 20  n = +1;.  }else 
1090: 69 66 28 20 63 3d 3d 27 5a 27 20 7c 7c 20 63 3d  if( c=='Z' || c=
10a0: 3d 27 7a 27 20 29 7b 0a 20 20 20 20 7a 44 61 74  ='z' ){.    zDat
10b0: 65 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 7a 75  e++;.    goto zu
10c0: 6c 75 5f 74 69 6d 65 3b 0a 20 20 7d 65 6c 73 65  lu_time;.  }else
10d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 21 3d  {.    return c!=
10e0: 30 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65 2b 2b  0;.  }.  zDate++
10f0: 3b 0a 20 20 69 66 28 20 67 65 74 44 69 67 69 74  ;.  if( getDigit
1100: 73 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 31  s(zDate, 2, 0, 1
1110: 34 2c 20 27 3a 27 2c 20 26 6e 48 72 2c 20 32 2c  4, ':', &nHr, 2,
1120: 20 30 2c 20 35 39 2c 20 30 2c 20 26 6e 4d 6e 29   0, 59, 0, &nMn)
1130: 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=2 ){.    retur
1140: 6e 20 31 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65  n 1;.  }.  zDate
1150: 20 2b 3d 20 35 3b 0a 20 20 70 2d 3e 74 7a 20 3d   += 5;.  p->tz =
1160: 20 73 67 6e 2a 28 6e 4d 6e 20 2b 20 6e 48 72 2a   sgn*(nMn + nHr*
1170: 36 30 29 3b 0a 7a 75 6c 75 5f 74 69 6d 65 3a 0a  60);.zulu_time:.
1180: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1190: 49 73 73 70 61 63 65 28 2a 7a 44 61 74 65 29 20  Isspace(*zDate) 
11a0: 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d 0a 20 20  ){ zDate++; }.  
11b0: 70 2d 3e 74 7a 53 65 74 20 3d 20 31 3b 0a 20 20  p->tzSet = 1;.  
11c0: 72 65 74 75 72 6e 20 2a 7a 44 61 74 65 21 3d 30  return *zDate!=0
11d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
11e0: 20 74 69 6d 65 73 20 6f 66 20 74 68 65 20 66 6f   times of the fo
11f0: 72 6d 20 48 48 3a 4d 4d 20 6f 72 20 48 48 3a 4d  rm HH:MM or HH:M
1200: 4d 3a 53 53 20 6f 72 20 48 48 3a 4d 4d 3a 53 53  M:SS or HH:MM:SS
1210: 2e 46 46 46 46 2e 0a 2a 2a 20 54 68 65 20 48 48  .FFFF..** The HH
1220: 2c 20 4d 4d 2c 20 61 6e 64 20 53 53 20 6d 75 73  , MM, and SS mus
1230: 74 20 65 61 63 68 20 62 65 20 65 78 61 63 74 6c  t each be exactl
1240: 79 20 32 20 64 69 67 69 74 73 2e 20 20 54 68 65  y 2 digits.  The
1250: 0a 2a 2a 20 66 72 61 63 74 69 6f 6e 61 6c 20 73  .** fractional s
1260: 65 63 6f 6e 64 73 20 46 46 46 46 20 63 61 6e 20  econds FFFF can 
1270: 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64  be one or more d
1280: 69 67 69 74 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  igits..**.** Ret
1290: 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 69  urn 1 if there i
12a0: 73 20 61 20 70 61 72 73 69 6e 67 20 65 72 72 6f  s a parsing erro
12b0: 72 20 61 6e 64 20 30 20 6f 6e 20 73 75 63 63 65  r and 0 on succe
12c0: 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
12d0: 74 20 70 61 72 73 65 48 68 4d 6d 53 73 28 63 6f  t parseHhMmSs(co
12e0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c  nst char *zDate,
12f0: 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20   DateTime *p){. 
1300: 20 69 6e 74 20 68 2c 20 6d 2c 20 73 3b 0a 20 20   int h, m, s;.  
1310: 64 6f 75 62 6c 65 20 6d 73 20 3d 20 30 2e 30 3b  double ms = 0.0;
1320: 0a 20 20 69 66 28 20 67 65 74 44 69 67 69 74 73  .  if( getDigits
1330: 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 32 34  (zDate, 2, 0, 24
1340: 2c 20 27 3a 27 2c 20 26 68 2c 20 32 2c 20 30 2c  , ':', &h, 2, 0,
1350: 20 35 39 2c 20 30 2c 20 26 6d 29 21 3d 32 20 29   59, 0, &m)!=2 )
1360: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1370: 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b 3d 20 35    }.  zDate += 5
1380: 3b 0a 20 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d  ;.  if( *zDate==
1390: 27 3a 27 20 29 7b 0a 20 20 20 20 7a 44 61 74 65  ':' ){.    zDate
13a0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 67 65 74 44  ++;.    if( getD
13b0: 69 67 69 74 73 28 7a 44 61 74 65 2c 20 32 2c 20  igits(zDate, 2, 
13c0: 30 2c 20 35 39 2c 20 30 2c 20 26 73 29 21 3d 31  0, 59, 0, &s)!=1
13d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13e0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 44   1;.    }.    zD
13f0: 61 74 65 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66  ate += 2;.    if
1400: 28 20 2a 7a 44 61 74 65 3d 3d 27 2e 27 20 26 26  ( *zDate=='.' &&
1410: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
1420: 7a 44 61 74 65 5b 31 5d 29 20 29 7b 0a 20 20 20  zDate[1]) ){.   
1430: 20 20 20 64 6f 75 62 6c 65 20 72 53 63 61 6c 65     double rScale
1440: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 7a 44   = 1.0;.      zD
1450: 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  ate++;.      whi
1460: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 64 69 67  le( sqlite3Isdig
1470: 69 74 28 2a 7a 44 61 74 65 29 20 29 7b 0a 20 20  it(*zDate) ){.  
1480: 20 20 20 20 20 20 6d 73 20 3d 20 6d 73 2a 31 30        ms = ms*10
1490: 2e 30 20 2b 20 2a 7a 44 61 74 65 20 2d 20 27 30  .0 + *zDate - '0
14a0: 27 3b 0a 20 20 20 20 20 20 20 20 72 53 63 61 6c  ';.        rScal
14b0: 65 20 2a 3d 20 31 30 2e 30 3b 0a 20 20 20 20 20  e *= 10.0;.     
14c0: 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20     zDate++;.    
14d0: 20 20 7d 0a 20 20 20 20 20 20 6d 73 20 2f 3d 20    }.      ms /= 
14e0: 72 53 63 61 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  rScale;.    }.  
14f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 30  }else{.    s = 0
1500: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64  ;.  }.  p->valid
1510: 4a 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c  JD = 0;.  p->val
1520: 69 64 48 4d 53 20 3d 20 31 3b 0a 20 20 70 2d 3e  idHMS = 1;.  p->
1530: 68 20 3d 20 68 3b 0a 20 20 70 2d 3e 6d 20 3d 20  h = h;.  p->m = 
1540: 6d 3b 0a 20 20 70 2d 3e 73 20 3d 20 73 20 2b 20  m;.  p->s = s + 
1550: 6d 73 3b 0a 20 20 69 66 28 20 70 61 72 73 65 54  ms;.  if( parseT
1560: 69 6d 65 7a 6f 6e 65 28 7a 44 61 74 65 2c 20 70  imezone(zDate, p
1570: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
1580: 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 28 70 2d  p->validTZ = (p-
1590: 3e 74 7a 21 3d 30 29 3f 31 3a 30 3b 0a 20 20 72  >tz!=0)?1:0;.  r
15a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
15b0: 2a 20 43 6f 6e 76 65 72 74 20 66 72 6f 6d 20 59  * Convert from Y
15c0: 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a  YYY-MM-DD HH:MM:
15d0: 53 53 20 74 6f 20 6a 75 6c 69 61 6e 20 64 61 79  SS to julian day
15e0: 2e 20 20 57 65 20 61 6c 77 61 79 73 20 61 73 73  .  We always ass
15f0: 75 6d 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ume.** that the 
1600: 59 59 59 59 2d 4d 4d 2d 44 44 20 69 73 20 61 63  YYYY-MM-DD is ac
1610: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 47  cording to the G
1620: 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
1630: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  r..**.** Referen
1640: 63 65 3a 20 20 4d 65 65 75 73 20 70 61 67 65 20  ce:  Meeus page 
1650: 36 31 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  61.*/.static voi
1660: 64 20 63 6f 6d 70 75 74 65 4a 44 28 44 61 74 65  d computeJD(Date
1670: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Time *p){.  int 
1680: 59 2c 20 4d 2c 20 44 2c 20 41 2c 20 42 2c 20 58  Y, M, D, A, B, X
1690: 31 2c 20 58 32 3b 0a 0a 20 20 69 66 28 20 70 2d  1, X2;..  if( p-
16a0: 3e 76 61 6c 69 64 4a 44 20 29 20 72 65 74 75 72  >validJD ) retur
16b0: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69  n;.  if( p->vali
16c0: 64 59 4d 44 20 29 7b 0a 20 20 20 20 59 20 3d 20  dYMD ){.    Y = 
16d0: 70 2d 3e 59 3b 0a 20 20 20 20 4d 20 3d 20 70 2d  p->Y;.    M = p-
16e0: 3e 4d 3b 0a 20 20 20 20 44 20 3d 20 70 2d 3e 44  >M;.    D = p->D
16f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 59  ;.  }else{.    Y
1700: 20 3d 20 32 30 30 30 3b 20 20 2f 2a 20 49 66 20   = 2000;  /* If 
1710: 6e 6f 20 59 4d 44 20 73 70 65 63 69 66 69 65 64  no YMD specified
1720: 2c 20 61 73 73 75 6d 65 20 32 30 30 30 2d 4a 61  , assume 2000-Ja
1730: 6e 2d 30 31 20 2a 2f 0a 20 20 20 20 4d 20 3d 20  n-01 */.    M = 
1740: 31 3b 0a 20 20 20 20 44 20 3d 20 31 3b 0a 20 20  1;.    D = 1;.  
1750: 7d 0a 20 20 69 66 28 20 4d 3c 3d 32 20 29 7b 0a  }.  if( M<=2 ){.
1760: 20 20 20 20 59 2d 2d 3b 0a 20 20 20 20 4d 20 2b      Y--;.    M +
1770: 3d 20 31 32 3b 0a 20 20 7d 0a 20 20 41 20 3d 20  = 12;.  }.  A = 
1780: 59 2f 31 30 30 3b 0a 20 20 42 20 3d 20 32 20 2d  Y/100;.  B = 2 -
1790: 20 41 20 2b 20 28 41 2f 34 29 3b 0a 20 20 58 31   A + (A/4);.  X1
17a0: 20 3d 20 33 36 35 32 35 2a 28 59 2b 34 37 31 36   = 36525*(Y+4716
17b0: 29 2f 31 30 30 3b 0a 20 20 58 32 20 3d 20 33 30  )/100;.  X2 = 30
17c0: 36 30 30 31 2a 28 4d 2b 31 29 2f 31 30 30 30 30  6001*(M+1)/10000
17d0: 3b 0a 20 20 70 2d 3e 69 4a 44 20 3d 20 28 73 71  ;.  p->iJD = (sq
17e0: 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 28 58 31  lite3_int64)((X1
17f0: 20 2b 20 58 32 20 2b 20 44 20 2b 20 42 20 2d 20   + X2 + D + B - 
1800: 31 35 32 34 2e 35 20 29 20 2a 20 38 36 34 30 30  1524.5 ) * 86400
1810: 30 30 30 29 3b 0a 20 20 70 2d 3e 76 61 6c 69 64  000);.  p->valid
1820: 4a 44 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 2d  JD = 1;.  if( p-
1830: 3e 76 61 6c 69 64 48 4d 53 20 29 7b 0a 20 20 20  >validHMS ){.   
1840: 20 70 2d 3e 69 4a 44 20 2b 3d 20 70 2d 3e 68 2a   p->iJD += p->h*
1850: 33 36 30 30 30 30 30 20 2b 20 70 2d 3e 6d 2a 36  3600000 + p->m*6
1860: 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
1870: 69 6e 74 36 34 29 28 70 2d 3e 73 2a 31 30 30 30  int64)(p->s*1000
1880: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 76 61  );.    if( p->va
1890: 6c 69 64 54 5a 20 29 7b 0a 20 20 20 20 20 20 70  lidTZ ){.      p
18a0: 2d 3e 69 4a 44 20 2d 3d 20 70 2d 3e 74 7a 2a 36  ->iJD -= p->tz*6
18b0: 30 30 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76  0000;.      p->v
18c0: 61 6c 69 64 59 4d 44 20 3d 20 30 3b 0a 20 20 20  alidYMD = 0;.   
18d0: 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d     p->validHMS =
18e0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c   0;.      p->val
18f0: 69 64 54 5a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  idTZ = 0;.    }.
1900: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72    }.}../*.** Par
1910: 73 65 20 64 61 74 65 73 20 6f 66 20 74 68 65 20  se dates of the 
1920: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 59  form.**.**     Y
1930: 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a  YYY-MM-DD HH:MM:
1940: 53 53 2e 46 46 46 0a 2a 2a 20 20 20 20 20 59 59  SS.FFF.**     YY
1950: 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53  YY-MM-DD HH:MM:S
1960: 53 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d  S.**     YYYY-MM
1970: 2d 44 44 20 48 48 3a 4d 4d 0a 2a 2a 20 20 20 20  -DD HH:MM.**    
1980: 20 59 59 59 59 2d 4d 4d 2d 44 44 0a 2a 2a 0a 2a   YYYY-MM-DD.**.*
1990: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
19a0: 6c 74 20 69 6e 74 6f 20 74 68 65 20 44 61 74 65  lt into the Date
19b0: 54 69 6d 65 20 73 74 72 75 63 74 75 72 65 20 61  Time structure a
19c0: 6e 64 20 72 65 74 75 72 6e 20 30 0a 2a 2a 20 6f  nd return 0.** o
19d0: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 31 20  n success and 1 
19e0: 69 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  if the input str
19f0: 69 6e 67 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ing is not a wel
1a00: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 64 61 74 65  l-formed.** date
1a10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a20: 70 61 72 73 65 59 79 79 79 4d 6d 44 64 28 63 6f  parseYyyyMmDd(co
1a30: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c  nst char *zDate,
1a40: 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20   DateTime *p){. 
1a50: 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c 20 6e 65   int Y, M, D, ne
1a60: 67 3b 0a 0a 20 20 69 66 28 20 7a 44 61 74 65 5b  g;..  if( zDate[
1a70: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 7a  0]=='-' ){.    z
1a80: 44 61 74 65 2b 2b 3b 0a 20 20 20 20 6e 65 67 20  Date++;.    neg 
1a90: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
1aa0: 20 20 6e 65 67 20 3d 20 30 3b 0a 20 20 7d 0a 20    neg = 0;.  }. 
1ab0: 20 69 66 28 20 67 65 74 44 69 67 69 74 73 28 7a   if( getDigits(z
1ac0: 44 61 74 65 2c 34 2c 30 2c 39 39 39 39 2c 27 2d  Date,4,0,9999,'-
1ad0: 27 2c 26 59 2c 32 2c 31 2c 31 32 2c 27 2d 27 2c  ',&Y,2,1,12,'-',
1ae0: 26 4d 2c 32 2c 31 2c 33 31 2c 30 2c 26 44 29 21  &M,2,1,31,0,&D)!
1af0: 3d 33 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =3 ){.    return
1b00: 20 31 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65 20   1;.  }.  zDate 
1b10: 2b 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20  += 10;.  while( 
1b20: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
1b30: 7a 44 61 74 65 29 20 7c 7c 20 27 54 27 3d 3d 2a  zDate) || 'T'==*
1b40: 28 75 38 2a 29 7a 44 61 74 65 20 29 7b 20 7a 44  (u8*)zDate ){ zD
1b50: 61 74 65 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 70  ate++; }.  if( p
1b60: 61 72 73 65 48 68 4d 6d 53 73 28 7a 44 61 74 65  arseHhMmSs(zDate
1b70: 2c 20 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  , p)==0 ){.    /
1b80: 2a 20 57 65 20 67 6f 74 20 74 68 65 20 74 69 6d  * We got the tim
1b90: 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  e */.  }else if(
1ba0: 20 2a 7a 44 61 74 65 3d 3d 30 20 29 7b 0a 20 20   *zDate==0 ){.  
1bb0: 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20    p->validHMS = 
1bc0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1bd0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1be0: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a  p->validJD = 0;.
1bf0: 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d 20    p->validYMD = 
1c00: 31 3b 0a 20 20 70 2d 3e 59 20 3d 20 6e 65 67 20  1;.  p->Y = neg 
1c10: 3f 20 2d 59 20 3a 20 59 3b 0a 20 20 70 2d 3e 4d  ? -Y : Y;.  p->M
1c20: 20 3d 20 4d 3b 0a 20 20 70 2d 3e 44 20 3d 20 44   = M;.  p->D = D
1c30: 3b 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64  ;.  if( p->valid
1c40: 54 5a 20 29 7b 0a 20 20 20 20 63 6f 6d 70 75 74  TZ ){.    comput
1c50: 65 4a 44 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  eJD(p);.  }.  re
1c60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1c70: 20 53 65 74 20 74 68 65 20 74 69 6d 65 20 74 6f   Set the time to
1c80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
1c90: 65 20 72 65 70 6f 72 74 65 64 20 62 79 20 74 68  e reported by th
1ca0: 65 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  e VFS..**.** Ret
1cb0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1cc0: 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61  f errors..*/.sta
1cd0: 74 69 63 20 69 6e 74 20 73 65 74 44 61 74 65 54  tic int setDateT
1ce0: 69 6d 65 54 6f 43 75 72 72 65 6e 74 28 73 71 6c  imeToCurrent(sql
1cf0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1d00: 6e 74 65 78 74 2c 20 44 61 74 65 54 69 6d 65 20  ntext, DateTime 
1d10: 2a 70 29 7b 0a 20 20 70 2d 3e 69 4a 44 20 3d 20  *p){.  p->iJD = 
1d20: 73 71 6c 69 74 65 33 53 74 6d 74 43 75 72 72 65  sqlite3StmtCurre
1d30: 6e 74 54 69 6d 65 28 63 6f 6e 74 65 78 74 29 3b  ntTime(context);
1d40: 0a 20 20 69 66 28 20 70 2d 3e 69 4a 44 3e 30 20  .  if( p->iJD>0 
1d50: 29 7b 0a 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a  ){.    p->validJ
1d60: 44 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  D = 1;.    retur
1d70: 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
1d80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1d90: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1da0: 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 67 69   to parse the gi
1db0: 76 65 6e 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  ven string into 
1dc0: 61 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d  a julian day num
1dd0: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
1de0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
1df0: 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rors..**.** The 
1e00: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 61 63  following are ac
1e10: 63 65 70 74 61 62 6c 65 20 66 6f 72 6d 73 20 66  ceptable forms f
1e20: 6f 72 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  or the input str
1e30: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
1e40: 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d  YYYY-MM-DD HH:MM
1e50: 3a 53 53 2e 46 46 46 20 20 2b 2f 2d 48 48 3a 4d  :SS.FFF  +/-HH:M
1e60: 4d 0a 2a 2a 20 20 20 20 20 20 44 44 44 44 2e 44  M.**      DDDD.D
1e70: 44 20 0a 2a 2a 20 20 20 20 20 20 6e 6f 77 0a 2a  D .**      now.*
1e80: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73  *.** In the firs
1e90: 74 20 66 6f 72 6d 2c 20 74 68 65 20 2b 2f 2d 48  t form, the +/-H
1ea0: 48 3a 4d 4d 20 69 73 20 61 6c 77 61 79 73 20 6f  H:MM is always o
1eb0: 70 74 69 6f 6e 61 6c 2e 20 20 54 68 65 20 66 72  ptional.  The fr
1ec0: 61 63 74 69 6f 6e 61 6c 0a 2a 2a 20 73 65 63 6f  actional.** seco
1ed0: 6e 64 73 20 65 78 74 65 6e 73 69 6f 6e 20 28 74  nds extension (t
1ee0: 68 65 20 22 2e 46 46 46 22 29 20 69 73 20 6f 70  he ".FFF") is op
1ef0: 74 69 6f 6e 61 6c 2e 20 20 54 68 65 20 73 65 63  tional.  The sec
1f00: 6f 6e 64 73 20 70 6f 72 74 69 6f 6e 0a 2a 2a 20  onds portion.** 
1f10: 28 22 3a 53 53 2e 46 46 46 22 29 20 69 73 20 6f  (":SS.FFF") is o
1f20: 70 74 69 6f 6e 2e 20 20 54 68 65 20 79 65 61 72  ption.  The year
1f30: 20 61 6e 64 20 64 61 74 65 20 63 61 6e 20 62 65   and date can be
1f40: 20 6f 6d 69 74 74 65 64 20 61 73 20 6c 6f 6e 67   omitted as long
1f50: 0a 2a 2a 20 61 73 20 74 68 65 72 65 20 69 73 20  .** as there is 
1f60: 61 20 74 69 6d 65 20 73 74 72 69 6e 67 2e 20 20  a time string.  
1f70: 54 68 65 20 74 69 6d 65 20 73 74 72 69 6e 67 20  The time string 
1f80: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61  can be omitted a
1f90: 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 74 68 65  s long.** as the
1fa0: 72 65 20 69 73 20 61 20 79 65 61 72 20 61 6e 64  re is a year and
1fb0: 20 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   date..*/.static
1fc0: 20 69 6e 74 20 70 61 72 73 65 44 61 74 65 4f 72   int parseDateOr
1fd0: 54 69 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  Time(.  sqlite3_
1fe0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1ff0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
2000: 2a 7a 44 61 74 65 2c 20 0a 20 20 44 61 74 65 54  *zDate, .  DateT
2010: 69 6d 65 20 2a 70 0a 29 7b 0a 20 20 64 6f 75 62  ime *p.){.  doub
2020: 6c 65 20 72 3b 0a 20 20 69 66 28 20 70 61 72 73  le r;.  if( pars
2030: 65 59 79 79 79 4d 6d 44 64 28 7a 44 61 74 65 2c  eYyyyMmDd(zDate,
2040: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  p)==0 ){.    ret
2050: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  urn 0;.  }else i
2060: 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73 28 7a  f( parseHhMmSs(z
2070: 44 61 74 65 2c 20 70 29 3d 3d 30 20 29 7b 0a 20  Date, p)==0 ){. 
2080: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2090: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
20a0: 53 74 72 49 43 6d 70 28 7a 44 61 74 65 2c 22 6e  StrICmp(zDate,"n
20b0: 6f 77 22 29 3d 3d 30 29 7b 0a 20 20 20 20 72 65  ow")==0){.    re
20c0: 74 75 72 6e 20 73 65 74 44 61 74 65 54 69 6d 65  turn setDateTime
20d0: 54 6f 43 75 72 72 65 6e 74 28 63 6f 6e 74 65 78  ToCurrent(contex
20e0: 74 2c 20 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69  t, p);.  }else i
20f0: 66 28 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a  f( sqlite3AtoF(z
2100: 44 61 74 65 2c 20 26 72 2c 20 73 71 6c 69 74 65  Date, &r, sqlite
2110: 33 53 74 72 6c 65 6e 33 30 28 7a 44 61 74 65 29  3Strlen30(zDate)
2120: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 20 29  , SQLITE_UTF8) )
2130: 7b 0a 20 20 20 20 70 2d 3e 69 4a 44 20 3d 20 28  {.    p->iJD = (
2140: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72  sqlite3_int64)(r
2150: 2a 38 36 34 30 30 30 30 30 2e 30 20 2b 20 30 2e  *86400000.0 + 0.
2160: 35 29 3b 0a 20 20 20 20 70 2d 3e 76 61 6c 69 64  5);.    p->valid
2170: 4a 44 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  JD = 1;.    retu
2180: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
2190: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
21a0: 6f 6d 70 75 74 65 20 74 68 65 20 59 65 61 72 2c  ompute the Year,
21b0: 20 4d 6f 6e 74 68 2c 20 61 6e 64 20 44 61 79 20   Month, and Day 
21c0: 66 72 6f 6d 20 74 68 65 20 6a 75 6c 69 61 6e 20  from the julian 
21d0: 64 61 79 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  day number..*/.s
21e0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
21f0: 74 65 59 4d 44 28 44 61 74 65 54 69 6d 65 20 2a  teYMD(DateTime *
2200: 70 29 7b 0a 20 20 69 6e 74 20 5a 2c 20 41 2c 20  p){.  int Z, A, 
2210: 42 2c 20 43 2c 20 44 2c 20 45 2c 20 58 31 3b 0a  B, C, D, E, X1;.
2220: 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 59 4d    if( p->validYM
2230: 44 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  D ) return;.  if
2240: 28 20 21 70 2d 3e 76 61 6c 69 64 4a 44 20 29 7b  ( !p->validJD ){
2250: 0a 20 20 20 20 70 2d 3e 59 20 3d 20 32 30 30 30  .    p->Y = 2000
2260: 3b 0a 20 20 20 20 70 2d 3e 4d 20 3d 20 31 3b 0a  ;.    p->M = 1;.
2270: 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0a 20 20      p->D = 1;.  
2280: 7d 65 6c 73 65 7b 0a 20 20 20 20 5a 20 3d 20 28  }else{.    Z = (
2290: 69 6e 74 29 28 28 70 2d 3e 69 4a 44 20 2b 20 34  int)((p->iJD + 4
22a0: 33 32 30 30 30 30 30 29 2f 38 36 34 30 30 30 30  3200000)/8640000
22b0: 30 29 3b 0a 20 20 20 20 41 20 3d 20 28 69 6e 74  0);.    A = (int
22c0: 29 28 28 5a 20 2d 20 31 38 36 37 32 31 36 2e 32  )((Z - 1867216.2
22d0: 35 29 2f 33 36 35 32 34 2e 32 35 29 3b 0a 20 20  5)/36524.25);.  
22e0: 20 20 41 20 3d 20 5a 20 2b 20 31 20 2b 20 41 20    A = Z + 1 + A 
22f0: 2d 20 28 41 2f 34 29 3b 0a 20 20 20 20 42 20 3d  - (A/4);.    B =
2300: 20 41 20 2b 20 31 35 32 34 3b 0a 20 20 20 20 43   A + 1524;.    C
2310: 20 3d 20 28 69 6e 74 29 28 28 42 20 2d 20 31 32   = (int)((B - 12
2320: 32 2e 31 29 2f 33 36 35 2e 32 35 29 3b 0a 20 20  2.1)/365.25);.  
2330: 20 20 44 20 3d 20 28 33 36 35 32 35 2a 28 43 26    D = (36525*(C&
2340: 33 32 37 36 37 29 29 2f 31 30 30 3b 0a 20 20 20  32767))/100;.   
2350: 20 45 20 3d 20 28 69 6e 74 29 28 28 42 2d 44 29   E = (int)((B-D)
2360: 2f 33 30 2e 36 30 30 31 29 3b 0a 20 20 20 20 58  /30.6001);.    X
2370: 31 20 3d 20 28 69 6e 74 29 28 33 30 2e 36 30 30  1 = (int)(30.600
2380: 31 2a 45 29 3b 0a 20 20 20 20 70 2d 3e 44 20 3d  1*E);.    p->D =
2390: 20 42 20 2d 20 44 20 2d 20 58 31 3b 0a 20 20 20   B - D - X1;.   
23a0: 20 70 2d 3e 4d 20 3d 20 45 3c 31 34 20 3f 20 45   p->M = E<14 ? E
23b0: 2d 31 20 3a 20 45 2d 31 33 3b 0a 20 20 20 20 70  -1 : E-13;.    p
23c0: 2d 3e 59 20 3d 20 70 2d 3e 4d 3e 32 20 3f 20 43  ->Y = p->M>2 ? C
23d0: 20 2d 20 34 37 31 36 20 3a 20 43 20 2d 20 34 37   - 4716 : C - 47
23e0: 31 35 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c  15;.  }.  p->val
23f0: 69 64 59 4d 44 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  idYMD = 1;.}../*
2400: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
2410: 48 6f 75 72 2c 20 4d 69 6e 75 74 65 2c 20 61 6e  Hour, Minute, an
2420: 64 20 53 65 63 6f 6e 64 73 20 66 72 6f 6d 20 74  d Seconds from t
2430: 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75  he julian day nu
2440: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
2450: 76 6f 69 64 20 63 6f 6d 70 75 74 65 48 4d 53 28  void computeHMS(
2460: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
2470: 69 6e 74 20 73 3b 0a 20 20 69 66 28 20 70 2d 3e  int s;.  if( p->
2480: 76 61 6c 69 64 48 4d 53 20 29 20 72 65 74 75 72  validHMS ) retur
2490: 6e 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 70  n;.  computeJD(p
24a0: 29 3b 0a 20 20 73 20 3d 20 28 69 6e 74 29 28 28  );.  s = (int)((
24b0: 70 2d 3e 69 4a 44 20 2b 20 34 33 32 30 30 30 30  p->iJD + 4320000
24c0: 30 29 20 25 20 38 36 34 30 30 30 30 30 29 3b 0a  0) % 86400000);.
24d0: 20 20 70 2d 3e 73 20 3d 20 73 2f 31 30 30 30 2e    p->s = s/1000.
24e0: 30 3b 0a 20 20 73 20 3d 20 28 69 6e 74 29 70 2d  0;.  s = (int)p-
24f0: 3e 73 3b 0a 20 20 70 2d 3e 73 20 2d 3d 20 73 3b  >s;.  p->s -= s;
2500: 0a 20 20 70 2d 3e 68 20 3d 20 73 2f 33 36 30 30  .  p->h = s/3600
2510: 3b 0a 20 20 73 20 2d 3d 20 70 2d 3e 68 2a 33 36  ;.  s -= p->h*36
2520: 30 30 3b 0a 20 20 70 2d 3e 6d 20 3d 20 73 2f 36  00;.  p->m = s/6
2530: 30 3b 0a 20 20 70 2d 3e 73 20 2b 3d 20 73 20 2d  0;.  p->s += s -
2540: 20 70 2d 3e 6d 2a 36 30 3b 0a 20 20 70 2d 3e 76   p->m*60;.  p->v
2550: 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 7d 0a 0a  alidHMS = 1;.}..
2560: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 62 6f  /*.** Compute bo
2570: 74 68 20 59 4d 44 20 61 6e 64 20 48 4d 53 0a 2a  th YMD and HMS.*
2580: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
2590: 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 44 61 74  mputeYMD_HMS(Dat
25a0: 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 63 6f 6d  eTime *p){.  com
25b0: 70 75 74 65 59 4d 44 28 70 29 3b 0a 20 20 63 6f  puteYMD(p);.  co
25c0: 6d 70 75 74 65 48 4d 53 28 70 29 3b 0a 7d 0a 0a  mputeHMS(p);.}..
25d0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
25e0: 59 4d 44 20 61 6e 64 20 48 4d 53 20 61 6e 64 20  YMD and HMS and 
25f0: 74 68 65 20 54 5a 0a 2a 2f 0a 73 74 61 74 69 63  the TZ.*/.static
2600: 20 76 6f 69 64 20 63 6c 65 61 72 59 4d 44 5f 48   void clearYMD_H
2610: 4d 53 5f 54 5a 28 44 61 74 65 54 69 6d 65 20 2a  MS_TZ(DateTime *
2620: 70 29 7b 0a 20 20 70 2d 3e 76 61 6c 69 64 59 4d  p){.  p->validYM
2630: 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69  D = 0;.  p->vali
2640: 64 48 4d 53 20 3d 20 30 3b 0a 20 20 70 2d 3e 76  dHMS = 0;.  p->v
2650: 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 7d 0a 0a 2f  alidTZ = 0;.}../
2660: 2a 0a 2a 2a 20 4f 6e 20 72 65 63 65 6e 74 20 57  *.** On recent W
2670: 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73  indows platforms
2680: 2c 20 74 68 65 20 6c 6f 63 61 6c 74 69 6d 65 5f  , the localtime_
2690: 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  s() function is 
26a0: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20  available.** as 
26b0: 70 61 72 74 20 6f 66 20 74 68 65 20 22 53 65 63  part of the "Sec
26c0: 75 72 65 20 43 52 54 22 2e 20 49 74 20 69 73 20  ure CRT". It is 
26d0: 65 73 73 65 6e 74 69 61 6c 6c 79 20 65 71 75 69  essentially equi
26e0: 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 20 6c 6f  valent to .** lo
26f0: 63 61 6c 74 69 6d 65 5f 72 28 29 20 61 76 61 69  caltime_r() avai
2700: 6c 61 62 6c 65 20 75 6e 64 65 72 20 6d 6f 73 74  lable under most
2710: 20 50 4f 53 49 58 20 70 6c 61 74 66 6f 72 6d 73   POSIX platforms
2720: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  , except that th
2730: 65 20 0a 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74  e .** order of t
2740: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 69 73  he parameters is
2750: 20 72 65 76 65 72 73 65 64 2e 0a 2a 2a 0a 2a 2a   reversed..**.**
2760: 20 53 65 65 20 68 74 74 70 3a 2f 2f 6d 73 64 6e   See http://msdn
2770: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 65  .microsoft.com/e
2780: 6e 2d 75 73 2f 6c 69 62 72 61 72 79 2f 61 34 34  n-us/library/a44
2790: 32 78 33 79 65 28 56 53 2e 38 30 29 2e 61 73 70  2x3ye(VS.80).asp
27a0: 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  x..**.** If the 
27b0: 75 73 65 72 20 68 61 73 20 6e 6f 74 20 69 6e 64  user has not ind
27c0: 69 63 61 74 65 64 20 74 6f 20 75 73 65 20 6c 6f  icated to use lo
27d0: 63 61 6c 74 69 6d 65 5f 72 28 29 20 6f 72 20 6c  caltime_r() or l
27e0: 6f 63 61 6c 74 69 6d 65 5f 73 28 29 0a 2a 2a 20  ocaltime_s().** 
27f0: 61 6c 72 65 61 64 79 2c 20 63 68 65 63 6b 20 66  already, check f
2800: 6f 72 20 61 6e 20 4d 53 56 43 20 62 75 69 6c 64  or an MSVC build
2810: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 74 68 61   environment tha
2820: 74 20 70 72 6f 76 69 64 65 73 20 0a 2a 2a 20 6c  t provides .** l
2830: 6f 63 61 6c 74 69 6d 65 5f 73 28 29 2e 0a 2a 2f  ocaltime_s()..*/
2840: 0a 23 69 66 20 21 48 41 56 45 5f 4c 4f 43 41 4c  .#if !HAVE_LOCAL
2850: 54 49 4d 45 5f 52 20 26 26 20 21 48 41 56 45 5f  TIME_R && !HAVE_
2860: 4c 4f 43 41 4c 54 49 4d 45 5f 53 20 5c 0a 20 20  LOCALTIME_S \.  
2870: 20 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 53    && defined(_MS
2880: 43 5f 56 45 52 29 20 26 26 20 64 65 66 69 6e 65  C_VER) && define
2890: 64 28 5f 43 52 54 5f 49 4e 53 45 43 55 52 45 5f  d(_CRT_INSECURE_
28a0: 44 45 50 52 45 43 41 54 45 29 0a 23 75 6e 64 65  DEPRECATE).#unde
28b0: 66 20 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d  f  HAVE_LOCALTIM
28c0: 45 5f 53 0a 23 64 65 66 69 6e 65 20 48 41 56 45  E_S.#define HAVE
28d0: 5f 4c 4f 43 41 4c 54 49 4d 45 5f 53 20 31 0a 23  _LOCALTIME_S 1.#
28e0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
28f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c  QLITE_OMIT_LOCAL
2900: 54 49 4d 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  TIME./*.** The f
2910: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
2920: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
2930: 72 6f 75 67 68 20 65 71 75 69 76 61 6c 65 6e 74  rough equivalent
2940: 20 6f 66 20 6c 6f 63 61 6c 74 69 6d 65 5f 72 28   of localtime_r(
2950: 29 0a 2a 2a 20 75 73 69 6e 67 20 77 68 61 74 65  ).** using whate
2960: 76 65 72 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  ver operating-sy
2970: 73 74 65 6d 20 73 70 65 63 69 66 69 63 20 6c 6f  stem specific lo
2980: 63 61 6c 74 69 6d 65 20 66 61 63 69 6c 69 74 79  caltime facility
2990: 20 74 68 61 74 0a 2a 2a 20 69 73 20 61 76 61 69   that.** is avai
29a0: 6c 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  lable.  This rou
29b0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 20 6f  tine returns 0 o
29c0: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 0a 2a 2a  n success and.**
29d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 61 6e 79   non-zero on any
29e0: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 2e 0a   kind of error..
29f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 71 6c  **.** If the sql
2a00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2a10: 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74  .bLocaltimeFault
2a20: 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 72 75   variable is tru
2a30: 65 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  e then this.** r
2a40: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 6c 77 61  outine will alwa
2a50: 79 73 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 45  ys fail..**.** E
2a60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 32  VIDENCE-OF: R-62
2a70: 31 37 32 2d 30 30 30 33 36 20 49 6e 20 74 68 69  172-00036 In thi
2a80: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
2a90: 2c 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 43  , the standard C
2aa0: 0a 2a 2a 20 6c 69 62 72 61 72 79 20 66 75 6e 63  .** library func
2ab0: 74 69 6f 6e 20 6c 6f 63 61 6c 74 69 6d 65 5f 72  tion localtime_r
2ac0: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
2ad0: 73 69 73 74 20 69 6e 20 74 68 65 20 63 61 6c 63  sist in the calc
2ae0: 75 6c 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 6c 6f  ulation of.** lo
2af0: 63 61 6c 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61  cal time..*/.sta
2b00: 74 69 63 20 69 6e 74 20 6f 73 4c 6f 63 61 6c 74  tic int osLocalt
2b10: 69 6d 65 28 74 69 6d 65 5f 74 20 2a 74 2c 20 73  ime(time_t *t, s
2b20: 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 29 7b 0a  truct tm *pTm){.
2b30: 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 20 21 48    int rc;.#if !H
2b40: 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 20  AVE_LOCALTIME_R 
2b50: 26 26 20 21 48 41 56 45 5f 4c 4f 43 41 4c 54 49  && !HAVE_LOCALTI
2b60: 4d 45 5f 53 0a 20 20 73 74 72 75 63 74 20 74 6d  ME_S.  struct tm
2b70: 20 2a 70 58 3b 0a 23 69 66 20 53 51 4c 49 54 45   *pX;.#if SQLITE
2b80: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20 20  _THREADSAFE>0.  
2b90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
2ba0: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
2bb0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
2bc0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
2bd0: 54 45 52 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  TER);.#endif.  s
2be0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2bf0: 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 70 58 20  er(mutex);.  pX 
2c00: 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 74 29 3b 0a  = localtime(t);.
2c10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c20: 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
2c30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2c40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61  obalConfig.bLoca
2c50: 6c 74 69 6d 65 46 61 75 6c 74 20 29 20 70 58 20  ltimeFault ) pX 
2c60: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
2c70: 28 20 70 58 20 29 20 2a 70 54 6d 20 3d 20 2a 70  ( pX ) *pTm = *p
2c80: 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  X;.  sqlite3_mut
2c90: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
2ca0: 0a 20 20 72 63 20 3d 20 70 58 3d 3d 30 3b 0a 23  .  rc = pX==0;.#
2cb0: 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
2cc0: 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
2cd0: 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
2ce0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2cf0: 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20  bLocaltimeFault 
2d00: 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64  ) return 1;.#end
2d10: 69 66 0a 23 69 66 20 48 41 56 45 5f 4c 4f 43 41  if.#if HAVE_LOCA
2d20: 4c 54 49 4d 45 5f 52 0a 20 20 72 63 20 3d 20 6c  LTIME_R.  rc = l
2d30: 6f 63 61 6c 74 69 6d 65 5f 72 28 74 2c 20 70 54  ocaltime_r(t, pT
2d40: 6d 29 3d 3d 30 3b 0a 23 65 6c 73 65 0a 20 20 72  m)==0;.#else.  r
2d50: 63 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 5f 73 28  c = localtime_s(
2d60: 70 54 6d 2c 20 74 29 3b 0a 23 65 6e 64 69 66 20  pTm, t);.#endif 
2d70: 2f 2a 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d  /* HAVE_LOCALTIM
2d80: 45 5f 52 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  E_R */.#endif /*
2d90: 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f   HAVE_LOCALTIME_
2da0: 52 20 7c 7c 20 48 41 56 45 5f 4c 4f 43 41 4c 54  R || HAVE_LOCALT
2db0: 49 4d 45 5f 53 20 2a 2f 0a 20 20 72 65 74 75 72  IME_S */.  retur
2dc0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2dd0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
2de0: 43 41 4c 54 49 4d 45 20 2a 2f 0a 0a 0a 23 69 66  CALTIME */...#if
2df0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e00: 5f 4c 4f 43 41 4c 54 49 4d 45 0a 2f 2a 0a 2a 2a  _LOCALTIME./*.**
2e10: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 64 69 66   Compute the dif
2e20: 66 65 72 65 6e 63 65 20 28 69 6e 20 6d 69 6c 6c  ference (in mill
2e30: 69 73 65 63 6f 6e 64 73 29 20 62 65 74 77 65 65  iseconds) betwee
2e40: 6e 20 6c 6f 63 61 6c 74 69 6d 65 20 61 6e 64 20  n localtime and 
2e50: 55 54 43 0a 2a 2a 20 28 61 2e 6b 2e 61 2e 20 47  UTC.** (a.k.a. G
2e60: 4d 54 29 20 66 6f 72 20 74 68 65 20 74 69 6d 65  MT) for the time
2e70: 20 76 61 6c 75 65 20 70 20 77 68 65 72 65 20 70   value p where p
2e80: 20 69 73 20 69 6e 20 55 54 43 2e 20 49 66 20 6e   is in UTC. If n
2e90: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  o error occurs,.
2ea0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 69 73 20 76  ** return this v
2eb0: 61 6c 75 65 20 61 6e 64 20 73 65 74 20 2a 70 52  alue and set *pR
2ec0: 63 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  c to SQLITE_OK. 
2ed0: 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e  .**.** Or, if an
2ee0: 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
2ef0: 72 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20 53  r, set *pRc to S
2f00: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 54 68 65  QLITE_ERROR. The
2f10: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 0a   returned value.
2f20: 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ** is undefined 
2f30: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2f40: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
2f50: 69 6e 74 36 34 20 6c 6f 63 61 6c 74 69 6d 65 4f  int64 localtimeO
2f60: 66 66 73 65 74 28 0a 20 20 44 61 74 65 54 69 6d  ffset(.  DateTim
2f70: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
2f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 65           /* Date
2f90: 20 61 74 20 77 68 69 63 68 20 74 6f 20 63 61 6c   at which to cal
2fa0: 63 75 6c 61 74 65 20 6f 66 66 73 65 74 20 2a 2f  culate offset */
2fb0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2fc0: 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
2fd0: 20 20 20 2f 2a 20 57 72 69 74 65 20 65 72 72 6f     /* Write erro
2fe0: 72 20 68 65 72 65 20 69 66 20 6f 6e 65 20 6f 63  r here if one oc
2ff0: 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  curs */.  int *p
3000: 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
3010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3020: 3a 20 45 72 72 6f 72 20 63 6f 64 65 2e 20 53 51  : Error code. SQ
3030: 4c 49 54 45 5f 4f 4b 20 6f 72 20 45 52 52 4f 52  LITE_OK or ERROR
3040: 20 2a 2f 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d   */.){.  DateTim
3050: 65 20 78 2c 20 79 3b 0a 20 20 74 69 6d 65 5f 74  e x, y;.  time_t
3060: 20 74 3b 0a 20 20 73 74 72 75 63 74 20 74 6d 20   t;.  struct tm 
3070: 73 4c 6f 63 61 6c 3b 0a 0a 20 20 2f 2a 20 49 6e  sLocal;..  /* In
3080: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  itialize the con
3090: 74 65 6e 74 73 20 6f 66 20 73 4c 6f 63 61 6c 20  tents of sLocal 
30a0: 74 6f 20 61 76 6f 69 64 20 61 20 63 6f 6d 70 69  to avoid a compi
30b0: 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a  ler warning. */.
30c0: 20 20 6d 65 6d 73 65 74 28 26 73 4c 6f 63 61 6c    memset(&sLocal
30d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4c 6f 63  , 0, sizeof(sLoc
30e0: 61 6c 29 29 3b 0a 0a 20 20 78 20 3d 20 2a 70 3b  al));..  x = *p;
30f0: 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d  .  computeYMD_HM
3100: 53 28 26 78 29 3b 0a 20 20 69 66 28 20 78 2e 59  S(&x);.  if( x.Y
3110: 3c 31 39 37 31 20 7c 7c 20 78 2e 59 3e 3d 32 30  <1971 || x.Y>=20
3120: 33 38 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  38 ){.    /* EVI
3130: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 32 36  DENCE-OF: R-5526
3140: 39 2d 32 39 35 39 38 20 54 68 65 20 6c 6f 63 61  9-29598 The loca
3150: 6c 74 69 6d 65 5f 72 28 29 20 43 20 66 75 6e 63  ltime_r() C func
3160: 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e  tion normally on
3170: 6c 79 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20  ly.    ** works 
3180: 66 6f 72 20 79 65 61 72 73 20 62 65 74 77 65 65  for years betwee
3190: 6e 20 31 39 37 30 20 61 6e 64 20 32 30 33 37 2e  n 1970 and 2037.
31a0: 20 46 6f 72 20 64 61 74 65 73 20 6f 75 74 73 69   For dates outsi
31b0: 64 65 20 74 68 69 73 20 72 61 6e 67 65 2c 0a 20  de this range,. 
31c0: 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 61 74 74     ** SQLite att
31d0: 65 6d 70 74 73 20 74 6f 20 6d 61 70 20 74 68 65  empts to map the
31e0: 20 79 65 61 72 20 69 6e 74 6f 20 61 6e 20 65 71   year into an eq
31f0: 75 69 76 61 6c 65 6e 74 20 79 65 61 72 20 77 69  uivalent year wi
3200: 74 68 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  thin this.    **
3210: 20 72 61 6e 67 65 2c 20 64 6f 20 74 68 65 20 63   range, do the c
3220: 61 6c 63 75 6c 61 74 69 6f 6e 2c 20 74 68 65 6e  alculation, then
3230: 20 6d 61 70 20 74 68 65 20 79 65 61 72 20 62 61   map the year ba
3240: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 78  ck..    */.    x
3250: 2e 59 20 3d 20 32 30 30 30 3b 0a 20 20 20 20 78  .Y = 2000;.    x
3260: 2e 4d 20 3d 20 31 3b 0a 20 20 20 20 78 2e 44 20  .M = 1;.    x.D 
3270: 3d 20 31 3b 0a 20 20 20 20 78 2e 68 20 3d 20 30  = 1;.    x.h = 0
3280: 3b 0a 20 20 20 20 78 2e 6d 20 3d 20 30 3b 0a 20  ;.    x.m = 0;. 
3290: 20 20 20 78 2e 73 20 3d 20 30 2e 30 3b 0a 20 20     x.s = 0.0;.  
32a0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 6e 74  } else {.    int
32b0: 20 73 20 3d 20 28 69 6e 74 29 28 78 2e 73 20 2b   s = (int)(x.s +
32c0: 20 30 2e 35 29 3b 0a 20 20 20 20 78 2e 73 20 3d   0.5);.    x.s =
32d0: 20 73 3b 0a 20 20 7d 0a 20 20 78 2e 74 7a 20 3d   s;.  }.  x.tz =
32e0: 20 30 3b 0a 20 20 78 2e 76 61 6c 69 64 4a 44 20   0;.  x.validJD 
32f0: 3d 20 30 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44  = 0;.  computeJD
3300: 28 26 78 29 3b 0a 20 20 74 20 3d 20 28 74 69 6d  (&x);.  t = (tim
3310: 65 5f 74 29 28 78 2e 69 4a 44 2f 31 30 30 30 20  e_t)(x.iJD/1000 
3320: 2d 20 32 31 30 38 36 36 37 36 2a 28 69 36 34 29  - 21086676*(i64)
3330: 31 30 30 30 30 29 3b 0a 20 20 69 66 28 20 6f 73  10000);.  if( os
3340: 4c 6f 63 61 6c 74 69 6d 65 28 26 74 2c 20 26 73  Localtime(&t, &s
3350: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 73 71  Local) ){.    sq
3360: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
3370: 6f 72 28 70 43 74 78 2c 20 22 6c 6f 63 61 6c 20  or(pCtx, "local 
3380: 74 69 6d 65 20 75 6e 61 76 61 69 6c 61 62 6c 65  time unavailable
3390: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 2a 70 52 63  ", -1);.    *pRc
33a0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
33b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
33c0: 20 7d 0a 20 20 79 2e 59 20 3d 20 73 4c 6f 63 61   }.  y.Y = sLoca
33d0: 6c 2e 74 6d 5f 79 65 61 72 20 2b 20 31 39 30 30  l.tm_year + 1900
33e0: 3b 0a 20 20 79 2e 4d 20 3d 20 73 4c 6f 63 61 6c  ;.  y.M = sLocal
33f0: 2e 74 6d 5f 6d 6f 6e 20 2b 20 31 3b 0a 20 20 79  .tm_mon + 1;.  y
3400: 2e 44 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d  .D = sLocal.tm_m
3410: 64 61 79 3b 0a 20 20 79 2e 68 20 3d 20 73 4c 6f  day;.  y.h = sLo
3420: 63 61 6c 2e 74 6d 5f 68 6f 75 72 3b 0a 20 20 79  cal.tm_hour;.  y
3430: 2e 6d 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d  .m = sLocal.tm_m
3440: 69 6e 3b 0a 20 20 79 2e 73 20 3d 20 73 4c 6f 63  in;.  y.s = sLoc
3450: 61 6c 2e 74 6d 5f 73 65 63 3b 0a 20 20 79 2e 76  al.tm_sec;.  y.v
3460: 61 6c 69 64 59 4d 44 20 3d 20 31 3b 0a 20 20 79  alidYMD = 1;.  y
3470: 2e 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 20  .validHMS = 1;. 
3480: 20 79 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a   y.validJD = 0;.
3490: 20 20 79 2e 76 61 6c 69 64 54 5a 20 3d 20 30 3b    y.validTZ = 0;
34a0: 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 79 29  .  computeJD(&y)
34b0: 3b 0a 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54  ;.  *pRc = SQLIT
34c0: 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 79  E_OK;.  return y
34d0: 2e 69 4a 44 20 2d 20 78 2e 69 4a 44 3b 0a 7d 0a  .iJD - x.iJD;.}.
34e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
34f0: 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 20  _OMIT_LOCALTIME 
3500: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  */../*.** Proces
3510: 73 20 61 20 6d 6f 64 69 66 69 65 72 20 74 6f 20  s a modifier to 
3520: 61 20 64 61 74 65 2d 74 69 6d 65 20 73 74 61 6d  a date-time stam
3530: 70 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 72  p.  The modifier
3540: 73 20 61 72 65 0a 2a 2a 20 61 73 20 66 6f 6c 6c  s are.** as foll
3550: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e  ows:.**.**     N
3560: 4e 4e 20 64 61 79 73 0a 2a 2a 20 20 20 20 20 4e  NN days.**     N
3570: 4e 4e 20 68 6f 75 72 73 0a 2a 2a 20 20 20 20 20  NN hours.**     
3580: 4e 4e 4e 20 6d 69 6e 75 74 65 73 0a 2a 2a 20 20  NNN minutes.**  
3590: 20 20 20 4e 4e 4e 2e 4e 4e 4e 4e 20 73 65 63 6f     NNN.NNNN seco
35a0: 6e 64 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 6d  nds.**     NNN m
35b0: 6f 6e 74 68 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e  onths.**     NNN
35c0: 20 79 65 61 72 73 0a 2a 2a 20 20 20 20 20 73 74   years.**     st
35d0: 61 72 74 20 6f 66 20 6d 6f 6e 74 68 0a 2a 2a 20  art of month.** 
35e0: 20 20 20 20 73 74 61 72 74 20 6f 66 20 79 65 61      start of yea
35f0: 72 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20 6f  r.**     start o
3600: 66 20 77 65 65 6b 0a 2a 2a 20 20 20 20 20 73 74  f week.**     st
3610: 61 72 74 20 6f 66 20 64 61 79 0a 2a 2a 20 20 20  art of day.**   
3620: 20 20 77 65 65 6b 64 61 79 20 4e 0a 2a 2a 20 20    weekday N.**  
3630: 20 20 20 75 6e 69 78 65 70 6f 63 68 0a 2a 2a 20     unixepoch.** 
3640: 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65 0a 2a 2a      localtime.**
3650: 20 20 20 20 20 75 74 63 0a 2a 2a 0a 2a 2a 20 52       utc.**.** R
3660: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
3670: 73 73 20 61 6e 64 20 31 20 69 66 20 74 68 65 72  ss and 1 if ther
3680: 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
3690: 20 65 72 72 6f 72 2e 20 49 66 20 74 68 65 20 65   error. If the e
36a0: 72 72 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 61 20  rror.** is in a 
36b0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 28 69 2e 65  system call (i.e
36c0: 2e 20 6c 6f 63 61 6c 74 69 6d 65 28 29 29 2c 20  . localtime()), 
36d0: 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65  then an error me
36e0: 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
36f0: 0a 2a 2a 20 74 6f 20 63 6f 6e 74 65 78 74 20 70  .** to context p
3700: 43 74 78 2e 20 49 66 20 74 68 65 20 65 72 72 6f  Ctx. If the erro
3710: 72 20 69 73 20 61 6e 20 75 6e 72 65 63 6f 67 6e  r is an unrecogn
3720: 69 7a 65 64 20 6d 6f 64 69 66 69 65 72 2c 20 6e  ized modifier, n
3730: 6f 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 77 72  o error is.** wr
3740: 69 74 74 65 6e 20 74 6f 20 70 43 74 78 2e 0a 2a  itten to pCtx..*
3750: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72  /.static int par
3760: 73 65 4d 6f 64 69 66 69 65 72 28 73 71 6c 69 74  seModifier(sqlit
3770: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
3780: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
3790: 6f 64 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29  od, DateTime *p)
37a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a  {.  int rc = 1;.
37b0: 20 20 69 6e 74 20 6e 3b 0a 20 20 64 6f 75 62 6c    int n;.  doubl
37c0: 65 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20  e r;.  char *z, 
37d0: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 7a 20 3d 20  zBuf[30];.  z = 
37e0: 7a 42 75 66 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  zBuf;.  for(n=0;
37f0: 20 6e 3c 41 72 72 61 79 53 69 7a 65 28 7a 42 75   n<ArraySize(zBu
3800: 66 29 2d 31 20 26 26 20 7a 4d 6f 64 5b 6e 5d 3b  f)-1 && zMod[n];
3810: 20 6e 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 5d 20   n++){.    z[n] 
3820: 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33 55  = (char)sqlite3U
3830: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 75 38 29  pperToLower[(u8)
3840: 7a 4d 6f 64 5b 6e 5d 5d 3b 0a 20 20 7d 0a 20 20  zMod[n]];.  }.  
3850: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 77 69 74  z[n] = 0;.  swit
3860: 63 68 28 20 7a 5b 30 5d 20 29 7b 0a 23 69 66 6e  ch( z[0] ){.#ifn
3870: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3880: 4c 4f 43 41 4c 54 49 4d 45 0a 20 20 20 20 63 61  LOCALTIME.    ca
3890: 73 65 20 27 6c 27 3a 20 7b 0a 20 20 20 20 20 20  se 'l': {.      
38a0: 2f 2a 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65 0a  /*    localtime.
38b0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
38c0: 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63  * Assuming the c
38d0: 75 72 72 65 6e 74 20 74 69 6d 65 20 76 61 6c 75  urrent time valu
38e0: 65 20 69 73 20 55 54 43 20 28 61 2e 6b 2e 61 2e  e is UTC (a.k.a.
38f0: 20 47 4d 54 29 2c 20 73 68 69 66 74 20 69 74 20   GMT), shift it 
3900: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 77  to.      ** show
3910: 20 6c 6f 63 61 6c 20 74 69 6d 65 2e 0a 20 20 20   local time..   
3920: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
3930: 73 74 72 63 6d 70 28 7a 2c 20 22 6c 6f 63 61 6c  strcmp(z, "local
3940: 74 69 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  time")==0 ){.   
3950: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
3960: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a  );.        p->iJ
3970: 44 20 2b 3d 20 6c 6f 63 61 6c 74 69 6d 65 4f 66  D += localtimeOf
3980: 66 73 65 74 28 70 2c 20 70 43 74 78 2c 20 26 72  fset(p, pCtx, &r
3990: 63 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61  c);.        clea
39a0: 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a  rYMD_HMS_TZ(p);.
39b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
39c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
39d0: 66 0a 20 20 20 20 63 61 73 65 20 27 75 27 3a 20  f.    case 'u': 
39e0: 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20  {.      /*.     
39f0: 20 2a 2a 20 20 20 20 75 6e 69 78 65 70 6f 63 68   **    unixepoch
3a00: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
3a10: 2a 2a 20 54 72 65 61 74 20 74 68 65 20 63 75 72  ** Treat the cur
3a20: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 2d  rent value of p-
3a30: 3e 69 4a 44 20 61 73 20 74 68 65 20 6e 75 6d 62  >iJD as the numb
3a40: 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 73  er of.      ** s
3a50: 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
3a60: 30 2e 20 20 43 6f 6e 76 65 72 74 20 74 6f 20 61  0.  Convert to a
3a70: 20 72 65 61 6c 20 6a 75 6c 69 61 6e 20 64 61 79   real julian day
3a80: 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a   number..      *
3a90: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  /.      if( strc
3aa0: 6d 70 28 7a 2c 20 22 75 6e 69 78 65 70 6f 63 68  mp(z, "unixepoch
3ab0: 22 29 3d 3d 30 20 26 26 20 70 2d 3e 76 61 6c 69  ")==0 && p->vali
3ac0: 64 4a 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dJD ){.        p
3ad0: 2d 3e 69 4a 44 20 3d 20 28 70 2d 3e 69 4a 44 20  ->iJD = (p->iJD 
3ae0: 2b 20 34 33 32 30 30 29 2f 38 36 34 30 30 20 2b  + 43200)/86400 +
3af0: 20 32 31 30 38 36 36 37 36 2a 28 69 36 34 29 31   21086676*(i64)1
3b00: 30 30 30 30 30 30 30 3b 0a 20 20 20 20 20 20 20  0000000;.       
3b10: 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a   clearYMD_HMS_TZ
3b20: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (p);.        rc 
3b30: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
3b40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3b50: 5f 4c 4f 43 41 4c 54 49 4d 45 0a 20 20 20 20 20  _LOCALTIME.     
3b60: 20 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70   else if( strcmp
3b70: 28 7a 2c 20 22 75 74 63 22 29 3d 3d 30 20 29 7b  (z, "utc")==0 ){
3b80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
3b90: 74 7a 53 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  tzSet==0 ){.    
3ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
3bb0: 74 36 34 20 63 31 3b 0a 20 20 20 20 20 20 20 20  t64 c1;.        
3bc0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a    computeJD(p);.
3bd0: 20 20 20 20 20 20 20 20 20 20 63 31 20 3d 20 6c            c1 = l
3be0: 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70  ocaltimeOffset(p
3bf0: 2c 20 70 43 74 78 2c 20 26 72 63 29 3b 0a 20 20  , pCtx, &rc);.  
3c00: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
3c10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3c20: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20           p->iJD 
3c30: 2d 3d 20 63 31 3b 0a 20 20 20 20 20 20 20 20 20  -= c1;.         
3c40: 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f     clearYMD_HMS_
3c50: 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  TZ(p);.         
3c60: 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 63 31 20     p->iJD += c1 
3c70: 2d 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65  - localtimeOffse
3c80: 74 28 70 2c 20 70 43 74 78 2c 20 26 72 63 29 3b  t(p, pCtx, &rc);
3c90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3ca0: 20 20 20 20 20 20 20 70 2d 3e 74 7a 53 65 74 20         p->tzSet 
3cb0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
3cc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
3cd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3ce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3cf0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
3d00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3d10: 73 65 20 27 77 27 3a 20 7b 0a 20 20 20 20 20 20  se 'w': {.      
3d20: 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 77  /*.      **    w
3d30: 65 65 6b 64 61 79 20 4e 0a 20 20 20 20 20 20 2a  eekday N.      *
3d40: 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20  *.      ** Move 
3d50: 74 68 65 20 64 61 74 65 20 74 6f 20 74 68 65 20  the date to the 
3d60: 73 61 6d 65 20 74 69 6d 65 20 6f 6e 20 74 68 65  same time on the
3d70: 20 6e 65 78 74 20 6f 63 63 75 72 72 65 6e 63 65   next occurrence
3d80: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 65 65   of.      ** wee
3d90: 6b 64 61 79 20 4e 20 77 68 65 72 65 20 30 3d 3d  kday N where 0==
3da0: 53 75 6e 64 61 79 2c 20 31 3d 3d 4d 6f 6e 64 61  Sunday, 1==Monda
3db0: 79 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  y, and so forth.
3dc0: 20 20 49 66 20 74 68 65 0a 20 20 20 20 20 20 2a    If the.      *
3dd0: 2a 20 64 61 74 65 20 69 73 20 61 6c 72 65 61 64  * date is alread
3de0: 79 20 6f 6e 20 74 68 65 20 61 70 70 72 6f 70 72  y on the appropr
3df0: 69 61 74 65 20 77 65 65 6b 64 61 79 2c 20 74 68  iate weekday, th
3e00: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
3e10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
3e20: 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 77 65  ( strncmp(z, "we
3e30: 65 6b 64 61 79 20 22 2c 20 38 29 3d 3d 30 0a 20  ekday ", 8)==0. 
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
3e50: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 26 7a 5b   sqlite3AtoF(&z[
3e60: 38 5d 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53  8], &r, sqlite3S
3e70: 74 72 6c 65 6e 33 30 28 26 7a 5b 38 5d 29 2c 20  trlen30(&z[8]), 
3e80: 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 20 20 20  SQLITE_UTF8).   
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
3ea0: 6e 3d 28 69 6e 74 29 72 29 3d 3d 72 20 26 26 20  n=(int)r)==r && 
3eb0: 6e 3e 3d 30 20 26 26 20 72 3c 37 20 29 7b 0a 20  n>=0 && r<7 ){. 
3ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
3ed0: 6e 74 36 34 20 5a 3b 0a 20 20 20 20 20 20 20 20  nt64 Z;.        
3ee0: 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 70  computeYMD_HMS(p
3ef0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 76 61  );.        p->va
3f00: 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 20 20 20  lidTZ = 0;.     
3f10: 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20     p->validJD = 
3f20: 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  0;.        compu
3f30: 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 20  teJD(p);.       
3f40: 20 5a 20 3d 20 28 28 70 2d 3e 69 4a 44 20 2b 20   Z = ((p->iJD + 
3f50: 31 32 39 36 30 30 30 30 30 29 2f 38 36 34 30 30  129600000)/86400
3f60: 30 30 30 29 20 25 20 37 3b 0a 20 20 20 20 20 20  000) % 7;.      
3f70: 20 20 69 66 28 20 5a 3e 6e 20 29 20 5a 20 2d 3d    if( Z>n ) Z -=
3f80: 20 37 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   7;.        p->i
3f90: 4a 44 20 2b 3d 20 28 6e 20 2d 20 5a 29 2a 38 36  JD += (n - Z)*86
3fa0: 34 30 30 30 30 30 3b 0a 20 20 20 20 20 20 20 20  400000;.        
3fb0: 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28  clearYMD_HMS_TZ(
3fc0: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  p);.        rc =
3fd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3fe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ff0: 20 20 20 63 61 73 65 20 27 73 27 3a 20 7b 0a 20     case 's': {. 
4000: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a       /*.      **
4010: 20 20 20 20 73 74 61 72 74 20 6f 66 20 54 54 54      start of TTT
4020: 54 54 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  TT.      **.    
4030: 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 61    ** Move the da
4040: 74 65 20 62 61 63 6b 77 61 72 64 73 20 74 6f 20  te backwards to 
4050: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
4060: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 79   the current day
4070: 2c 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 6d 6f  ,.      ** or mo
4080: 6e 74 68 20 6f 72 20 79 65 61 72 2e 0a 20 20 20  nth or year..   
4090: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
40a0: 73 74 72 6e 63 6d 70 28 7a 2c 20 22 73 74 61 72  strncmp(z, "star
40b0: 74 20 6f 66 20 22 2c 20 39 29 21 3d 30 20 29 20  t of ", 9)!=0 ) 
40c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7a 20 2b  break;.      z +
40d0: 3d 20 39 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  = 9;.      compu
40e0: 74 65 59 4d 44 28 70 29 3b 0a 20 20 20 20 20 20  teYMD(p);.      
40f0: 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b  p->validHMS = 1;
4100: 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 70 2d  .      p->h = p-
4110: 3e 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  >m = 0;.      p-
4120: 3e 73 20 3d 20 30 2e 30 3b 0a 20 20 20 20 20 20  >s = 0.0;.      
4130: 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a  p->validTZ = 0;.
4140: 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44        p->validJD
4150: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
4160: 73 74 72 63 6d 70 28 7a 2c 22 6d 6f 6e 74 68 22  strcmp(z,"month"
4170: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4180: 70 2d 3e 44 20 3d 20 31 3b 0a 20 20 20 20 20 20  p->D = 1;.      
4190: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
41a0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
41b0: 28 7a 2c 22 79 65 61 72 22 29 3d 3d 30 20 29 7b  (z,"year")==0 ){
41c0: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
41d0: 59 4d 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20  YMD(p);.        
41e0: 70 2d 3e 4d 20 3d 20 31 3b 0a 20 20 20 20 20 20  p->M = 1;.      
41f0: 20 20 70 2d 3e 44 20 3d 20 31 3b 0a 20 20 20 20    p->D = 1;.    
4200: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
4210: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
4220: 6d 70 28 7a 2c 22 64 61 79 22 29 3d 3d 30 20 29  mp(z,"day")==0 )
4230: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30  {.        rc = 0
4240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4260: 20 63 61 73 65 20 27 2b 27 3a 0a 20 20 20 20 63   case '+':.    c
4270: 61 73 65 20 27 2d 27 3a 0a 20 20 20 20 63 61 73  ase '-':.    cas
4280: 65 20 27 30 27 3a 0a 20 20 20 20 63 61 73 65 20  e '0':.    case 
4290: 27 31 27 3a 0a 20 20 20 20 63 61 73 65 20 27 32  '1':.    case '2
42a0: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 33 27 3a  ':.    case '3':
42b0: 0a 20 20 20 20 63 61 73 65 20 27 34 27 3a 0a 20  .    case '4':. 
42c0: 20 20 20 63 61 73 65 20 27 35 27 3a 0a 20 20 20     case '5':.   
42d0: 20 63 61 73 65 20 27 36 27 3a 0a 20 20 20 20 63   case '6':.    c
42e0: 61 73 65 20 27 37 27 3a 0a 20 20 20 20 63 61 73  ase '7':.    cas
42f0: 65 20 27 38 27 3a 0a 20 20 20 20 63 61 73 65 20  e '8':.    case 
4300: 27 39 27 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75  '9': {.      dou
4310: 62 6c 65 20 72 52 6f 75 6e 64 65 72 3b 0a 20 20  ble rRounder;.  
4320: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 7a 5b 6e      for(n=1; z[n
4330: 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27 3a 27 20 26  ] && z[n]!=':' &
4340: 26 20 21 73 71 6c 69 74 65 33 49 73 73 70 61 63  & !sqlite3Isspac
4350: 65 28 7a 5b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a  e(z[n]); n++){}.
4360: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
4370: 65 33 41 74 6f 46 28 7a 2c 20 26 72 2c 20 6e 2c  e3AtoF(z, &r, n,
4380: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 20 29 7b   SQLITE_UTF8) ){
4390: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
43a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
43b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
43c0: 28 20 7a 5b 6e 5d 3d 3d 27 3a 27 20 29 7b 0a 20  ( z[n]==':' ){. 
43d0: 20 20 20 20 20 20 20 2f 2a 20 41 20 6d 6f 64 69         /* A modi
43e0: 66 69 65 72 20 6f 66 20 74 68 65 20 66 6f 72 6d  fier of the form
43f0: 20 28 2b 7c 2d 29 48 48 3a 4d 4d 3a 53 53 2e 46   (+|-)HH:MM:SS.F
4400: 46 46 20 61 64 64 73 20 28 6f 72 20 73 75 62 74  FF adds (or subt
4410: 72 61 63 74 73 29 20 74 68 65 0a 20 20 20 20 20  racts) the.     
4420: 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20     ** specified 
4430: 6e 75 6d 62 65 72 20 6f 66 20 68 6f 75 72 73 2c  number of hours,
4440: 20 6d 69 6e 75 74 65 73 2c 20 73 65 63 6f 6e 64   minutes, second
4450: 73 2c 20 61 6e 64 20 66 72 61 63 74 69 6f 6e 61  s, and fractiona
4460: 6c 20 73 65 63 6f 6e 64 73 0a 20 20 20 20 20 20  l seconds.      
4470: 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 69 6d 65    ** to the time
4480: 2e 20 20 54 68 65 20 22 2e 46 46 46 22 20 6d 61  .  The ".FFF" ma
4490: 79 20 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 54  y be omitted.  T
44a0: 68 65 20 22 3a 53 53 2e 46 46 46 22 20 6d 61 79  he ":SS.FFF" may
44b0: 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   be.        ** o
44c0: 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20 20 20  mitted..        
44d0: 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
44e0: 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20   char *z2 = z;. 
44f0: 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 20         DateTime 
4500: 74 78 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  tx;.        sqli
4510: 74 65 33 5f 69 6e 74 36 34 20 64 61 79 3b 0a 20  te3_int64 day;. 
4520: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
4530: 74 65 33 49 73 64 69 67 69 74 28 2a 7a 32 29 20  te3Isdigit(*z2) 
4540: 29 20 7a 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ) z2++;.        
4550: 6d 65 6d 73 65 74 28 26 74 78 2c 20 30 2c 20 73  memset(&tx, 0, s
4560: 69 7a 65 6f 66 28 74 78 29 29 3b 0a 20 20 20 20  izeof(tx));.    
4570: 20 20 20 20 69 66 28 20 70 61 72 73 65 48 68 4d      if( parseHhM
4580: 6d 53 73 28 7a 32 2c 20 26 74 78 29 20 29 20 62  mSs(z2, &tx) ) b
4590: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 6f  reak;.        co
45a0: 6d 70 75 74 65 4a 44 28 26 74 78 29 3b 0a 20 20  mputeJD(&tx);.  
45b0: 20 20 20 20 20 20 74 78 2e 69 4a 44 20 2d 3d 20        tx.iJD -= 
45c0: 34 33 32 30 30 30 30 30 3b 0a 20 20 20 20 20 20  43200000;.      
45d0: 20 20 64 61 79 20 3d 20 74 78 2e 69 4a 44 2f 38    day = tx.iJD/8
45e0: 36 34 30 30 30 30 30 3b 0a 20 20 20 20 20 20 20  6400000;.       
45f0: 20 74 78 2e 69 4a 44 20 2d 3d 20 64 61 79 2a 38   tx.iJD -= day*8
4600: 36 34 30 30 30 30 30 3b 0a 20 20 20 20 20 20 20  6400000;.       
4610: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
4620: 20 74 78 2e 69 4a 44 20 3d 20 2d 74 78 2e 69 4a   tx.iJD = -tx.iJ
4630: 44 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  D;.        compu
4640: 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 20  teJD(p);.       
4650: 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a   clearYMD_HMS_TZ
4660: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
4670: 69 4a 44 20 2b 3d 20 74 78 2e 69 4a 44 3b 0a 20  iJD += tx.iJD;. 
4680: 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
4690: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
46a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 20 2b 3d      }.      z +=
46b0: 20 6e 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   n;.      while(
46c0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
46d0: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  *z) ) z++;.     
46e0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
46f0: 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20 20 69  en30(z);.      i
4700: 66 28 20 6e 3e 31 30 20 7c 7c 20 6e 3c 33 20 29  f( n>10 || n<3 )
4710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
4720: 28 20 7a 5b 6e 2d 31 5d 3d 3d 27 73 27 20 29 7b  ( z[n-1]=='s' ){
4730: 20 7a 5b 6e 2d 31 5d 20 3d 20 30 3b 20 6e 2d 2d   z[n-1] = 0; n--
4740: 3b 20 7d 0a 20 20 20 20 20 20 63 6f 6d 70 75 74  ; }.      comput
4750: 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 72 63  eJD(p);.      rc
4760: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 52 6f 75   = 0;.      rRou
4770: 6e 64 65 72 20 3d 20 72 3c 30 20 3f 20 2d 30 2e  nder = r<0 ? -0.
4780: 35 20 3a 20 2b 30 2e 35 3b 0a 20 20 20 20 20 20  5 : +0.5;.      
4790: 69 66 28 20 6e 3d 3d 33 20 26 26 20 73 74 72 63  if( n==3 && strc
47a0: 6d 70 28 7a 2c 22 64 61 79 22 29 3d 3d 30 20 29  mp(z,"day")==0 )
47b0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44  {.        p->iJD
47c0: 20 2b 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74   += (sqlite3_int
47d0: 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30  64)(r*86400000.0
47e0: 20 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20   + rRounder);.  
47f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d      }else if( n=
4800: 3d 34 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22  =4 && strcmp(z,"
4810: 68 6f 75 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  hour")==0 ){.   
4820: 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28       p->iJD += (
4830: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72  sqlite3_int64)(r
4840: 2a 28 38 36 34 30 30 30 30 30 2e 30 2f 32 34 2e  *(86400000.0/24.
4850: 30 29 20 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a  0) + rRounder);.
4860: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4870: 6e 3d 3d 36 20 26 26 20 73 74 72 63 6d 70 28 7a  n==6 && strcmp(z
4880: 2c 22 6d 69 6e 75 74 65 22 29 3d 3d 30 20 29 7b  ,"minute")==0 ){
4890: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20  .        p->iJD 
48a0: 2b 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  += (sqlite3_int6
48b0: 34 29 28 72 2a 28 38 36 34 30 30 30 30 30 2e 30  4)(r*(86400000.0
48c0: 2f 28 32 34 2e 30 2a 36 30 2e 30 29 29 20 2b 20  /(24.0*60.0)) + 
48d0: 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20 20 20 20  rRounder);.     
48e0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20   }else if( n==6 
48f0: 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 73 65 63  && strcmp(z,"sec
4900: 6f 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ond")==0 ){.    
4910: 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73      p->iJD += (s
4920: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a  qlite3_int64)(r*
4930: 28 38 36 34 30 30 30 30 30 2e 30 2f 28 32 34 2e  (86400000.0/(24.
4940: 30 2a 36 30 2e 30 2a 36 30 2e 30 29 29 20 2b 20  0*60.0*60.0)) + 
4950: 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20 20 20 20  rRounder);.     
4960: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 35 20   }else if( n==5 
4970: 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d 6f 6e  && strcmp(z,"mon
4980: 74 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  th")==0 ){.     
4990: 20 20 20 69 6e 74 20 78 2c 20 79 3b 0a 20 20 20     int x, y;.   
49a0: 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f       computeYMD_
49b0: 48 4d 53 28 70 29 3b 0a 20 20 20 20 20 20 20 20  HMS(p);.        
49c0: 70 2d 3e 4d 20 2b 3d 20 28 69 6e 74 29 72 3b 0a  p->M += (int)r;.
49d0: 20 20 20 20 20 20 20 20 78 20 3d 20 70 2d 3e 4d          x = p->M
49e0: 3e 30 20 3f 20 28 70 2d 3e 4d 2d 31 29 2f 31 32  >0 ? (p->M-1)/12
49f0: 20 3a 20 28 70 2d 3e 4d 2d 31 32 29 2f 31 32 3b   : (p->M-12)/12;
4a00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 59 20 2b 3d  .        p->Y +=
4a10: 20 78 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 4d   x;.        p->M
4a20: 20 2d 3d 20 78 2a 31 32 3b 0a 20 20 20 20 20 20   -= x*12;.      
4a30: 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30    p->validJD = 0
4a40: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
4a50: 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20  eJD(p);.        
4a60: 79 20 3d 20 28 69 6e 74 29 72 3b 0a 20 20 20 20  y = (int)r;.    
4a70: 20 20 20 20 69 66 28 20 79 21 3d 72 20 29 7b 0a      if( y!=r ){.
4a80: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44            p->iJD
4a90: 20 2b 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74   += (sqlite3_int
4aa0: 36 34 29 28 28 72 20 2d 20 79 29 2a 33 30 2e 30  64)((r - y)*30.0
4ab0: 2a 38 36 34 30 30 30 30 30 2e 30 20 2b 20 72 52  *86400000.0 + rR
4ac0: 6f 75 6e 64 65 72 29 3b 0a 20 20 20 20 20 20 20  ounder);.       
4ad0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
4ae0: 66 28 20 6e 3d 3d 34 20 26 26 20 73 74 72 63 6d  f( n==4 && strcm
4af0: 70 28 7a 2c 22 79 65 61 72 22 29 3d 3d 30 20 29  p(z,"year")==0 )
4b00: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 79 20  {.        int y 
4b10: 3d 20 28 69 6e 74 29 72 3b 0a 20 20 20 20 20 20  = (int)r;.      
4b20: 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53    computeYMD_HMS
4b30: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
4b40: 59 20 2b 3d 20 79 3b 0a 20 20 20 20 20 20 20 20  Y += y;.        
4b50: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a  p->validJD = 0;.
4b60: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
4b70: 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  D(p);.        if
4b80: 28 20 79 21 3d 72 20 29 7b 0a 20 20 20 20 20 20  ( y!=r ){.      
4b90: 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73      p->iJD += (s
4ba0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 28 72  qlite3_int64)((r
4bb0: 20 2d 20 79 29 2a 33 36 35 2e 30 2a 38 36 34 30   - y)*365.0*8640
4bc0: 30 30 30 30 2e 30 20 2b 20 72 52 6f 75 6e 64 65  0000.0 + rRounde
4bd0: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
4be0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4bf0: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
4c00: 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 59 4d   }.      clearYM
4c10: 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20  D_HMS_TZ(p);.   
4c20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4c30: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4c40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4c50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
4c60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  c;.}../*.** Proc
4c70: 65 73 73 20 74 69 6d 65 20 66 75 6e 63 74 69 6f  ess time functio
4c80: 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 61 72  n arguments.  ar
4c90: 67 76 5b 30 5d 20 69 73 20 61 20 64 61 74 65 2d  gv[0] is a date-
4ca0: 74 69 6d 65 20 73 74 61 6d 70 2e 0a 2a 2a 20 61  time stamp..** a
4cb0: 72 67 76 5b 31 5d 20 61 6e 64 20 66 6f 6c 6c 6f  rgv[1] and follo
4cc0: 77 69 6e 67 20 61 72 65 20 6d 6f 64 69 66 69 65  wing are modifie
4cd0: 72 73 2e 20 20 50 61 72 73 65 20 74 68 65 6d 20  rs.  Parse them 
4ce0: 61 6c 6c 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a  all and write.**
4cf0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 74   the resulting t
4d00: 69 6d 65 20 69 6e 74 6f 20 74 68 65 20 44 61 74  ime into the Dat
4d10: 65 54 69 6d 65 20 73 74 72 75 63 74 75 72 65 20  eTime structure 
4d20: 70 2e 20 20 52 65 74 75 72 6e 20 30 0a 2a 2a 20  p.  Return 0.** 
4d30: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 31  on success and 1
4d40: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
4d50: 79 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  y errors..**.** 
4d60: 49 66 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  If there are zer
4d70: 6f 20 70 61 72 61 6d 65 74 65 72 73 20 28 69 66  o parameters (if
4d80: 20 65 76 65 6e 20 61 72 67 76 5b 30 5d 20 69 73   even argv[0] is
4d90: 20 75 6e 64 65 66 69 6e 65 64 29 0a 2a 2a 20 74   undefined).** t
4da0: 68 65 6e 20 61 73 73 75 6d 65 20 61 20 64 65 66  hen assume a def
4db0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 22 6e  ault value of "n
4dc0: 6f 77 22 20 66 6f 72 20 61 72 67 76 5b 30 5d 2e  ow" for argv[0].
4dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
4de0: 73 44 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  sDate(.  sqlite3
4df0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
4e00: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
4e10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4e20: 20 2a 2a 61 72 67 76 2c 20 0a 20 20 44 61 74 65   **argv, .  Date
4e30: 54 69 6d 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74  Time *p.){.  int
4e40: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   i;.  const unsi
4e50: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
4e60: 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 6d 65 6d  int eType;.  mem
4e70: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
4e80: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 61 72 67  (*p));.  if( arg
4e90: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c==0 ){.    retu
4ea0: 72 6e 20 73 65 74 44 61 74 65 54 69 6d 65 54 6f  rn setDateTimeTo
4eb0: 43 75 72 72 65 6e 74 28 63 6f 6e 74 65 78 74 2c  Current(context,
4ec0: 20 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28   p);.  }.  if( (
4ed0: 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  eType = sqlite3_
4ee0: 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
4ef0: 30 5d 29 29 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  0]))==SQLITE_FLO
4f00: 41 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  AT.             
4f10: 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
4f20: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29  SQLITE_INTEGER )
4f30: 7b 0a 20 20 20 20 70 2d 3e 69 4a 44 20 3d 20 28  {.    p->iJD = (
4f40: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 73  sqlite3_int64)(s
4f50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
4f60: 62 6c 65 28 61 72 67 76 5b 30 5d 29 2a 38 36 34  ble(argv[0])*864
4f70: 30 30 30 30 30 2e 30 20 2b 20 30 2e 35 29 3b 0a  00000.0 + 0.5);.
4f80: 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d      p->validJD =
4f90: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
4fa0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
4fb0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
4fc0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 20 7c 7c 20  ;.    if( !z || 
4fd0: 70 61 72 73 65 44 61 74 65 4f 72 54 69 6d 65 28  parseDateOrTime(
4fe0: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
4ff0: 7a 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 72  z, p) ){.      r
5000: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
5010: 20 7d 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c   }.  for(i=1; i<
5020: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
5030: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5040: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
5050: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 7c 7c  .    if( z==0 ||
5060: 20 70 61 72 73 65 4d 6f 64 69 66 69 65 72 28 63   parseModifier(c
5070: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a  ontext, (char*)z
5080: 2c 20 70 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , p) ) return 1;
5090: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
50a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
50b0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
50c0: 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  s implement the 
50d0: 76 61 72 69 6f 75 73 20 64 61 74 65 20 61 6e 64  various date and
50e0: 20 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 0a   time functions.
50f0: 2a 2a 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2f  ** of SQLite..*/
5100: 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 6a 75 6c 69 61  ../*.**    julia
5110: 6e 64 61 79 28 20 54 49 4d 45 53 54 52 49 4e 47  nday( TIMESTRING
5120: 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29  , MOD, MOD, ...)
5130: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
5140: 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d  e julian day num
5150: 62 65 72 20 6f 66 20 74 68 65 20 64 61 74 65 20  ber of the date 
5160: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
5170: 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74   arguments.*/.st
5180: 61 74 69 63 20 76 6f 69 64 20 6a 75 6c 69 61 6e  atic void julian
5190: 64 61 79 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  dayFunc(.  sqlit
51a0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
51b0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
51c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
51d0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74   **argv.){.  Dat
51e0: 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20 69  eTime x;.  if( i
51f0: 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 61  sDate(context, a
5200: 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d  rgc, argv, &x)==
5210: 30 20 29 7b 0a 20 20 20 20 63 6f 6d 70 75 74 65  0 ){.    compute
5220: 4a 44 28 26 78 29 3b 0a 20 20 20 20 73 71 6c 69  JD(&x);.    sqli
5230: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
5240: 65 28 63 6f 6e 74 65 78 74 2c 20 78 2e 69 4a 44  e(context, x.iJD
5250: 2f 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20 20  /86400000.0);.  
5260: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64 61  }.}../*.**    da
5270: 74 65 74 69 6d 65 28 20 54 49 4d 45 53 54 52 49  tetime( TIMESTRI
5280: 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e  NG, MOD, MOD, ..
5290: 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .).**.** Return 
52a0: 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d  YYYY-MM-DD HH:MM
52b0: 3a 53 53 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  :SS.*/.static vo
52c0: 69 64 20 64 61 74 65 74 69 6d 65 46 75 6e 63 28  id datetimeFunc(
52d0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
52e0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
52f0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
5300: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5310: 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b  ){.  DateTime x;
5320: 0a 20 20 69 66 28 20 69 73 44 61 74 65 28 63 6f  .  if( isDate(co
5330: 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
5340: 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20  v, &x)==0 ){.   
5350: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
5360: 0a 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f  .    computeYMD_
5370: 48 4d 53 28 26 78 29 3b 0a 20 20 20 20 73 71 6c  HMS(&x);.    sql
5380: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5390: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
53a0: 2c 20 22 25 30 34 64 2d 25 30 32 64 2d 25 30 32  , "%04d-%02d-%02
53b0: 64 20 25 30 32 64 3a 25 30 32 64 3a 25 30 32 64  d %02d:%02d:%02d
53c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
53d0: 20 20 20 20 20 20 20 20 78 2e 59 2c 20 78 2e 4d          x.Y, x.M
53e0: 2c 20 78 2e 44 2c 20 78 2e 68 2c 20 78 2e 6d 2c  , x.D, x.h, x.m,
53f0: 20 28 69 6e 74 29 28 78 2e 73 29 29 3b 0a 20 20   (int)(x.s));.  
5400: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5410: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
5420: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
5430: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
5440: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 74 69 6d 65  }../*.**    time
5450: 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f  ( TIMESTRING, MO
5460: 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a  D, MOD, ...).**.
5470: 2a 2a 20 52 65 74 75 72 6e 20 48 48 3a 4d 4d 3a  ** Return HH:MM:
5480: 53 53 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  SS.*/.static voi
5490: 64 20 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71  d timeFunc(.  sq
54a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
54b0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
54c0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
54d0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
54e0: 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20 69 66  DateTime x;.  if
54f0: 28 20 69 73 44 61 74 65 28 63 6f 6e 74 65 78 74  ( isDate(context
5500: 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 26 78  , argc, argv, &x
5510: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
5520: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20   zBuf[100];.    
5530: 63 6f 6d 70 75 74 65 48 4d 53 28 26 78 29 3b 0a  computeHMS(&x);.
5540: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5550: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
5560: 29 2c 20 7a 42 75 66 2c 20 22 25 30 32 64 3a 25  ), zBuf, "%02d:%
5570: 30 32 64 3a 25 30 32 64 22 2c 20 78 2e 68 2c 20  02d:%02d", x.h, 
5580: 78 2e 6d 2c 20 28 69 6e 74 29 78 2e 73 29 3b 0a  x.m, (int)x.s);.
5590: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
55a0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
55b0: 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54   zBuf, -1, SQLIT
55c0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
55d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64 61  }.}../*.**    da
55e0: 74 65 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20  te( TIMESTRING, 
55f0: 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a  MOD, MOD, ...).*
5600: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 59 59 59 59  *.** Return YYYY
5610: 2d 4d 4d 2d 44 44 0a 2a 2f 0a 73 74 61 74 69 63  -MM-DD.*/.static
5620: 20 76 6f 69 64 20 64 61 74 65 46 75 6e 63 28 0a   void dateFunc(.
5630: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5640: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5650: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5660: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5670: 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a  {.  DateTime x;.
5680: 20 20 69 66 28 20 69 73 44 61 74 65 28 63 6f 6e    if( isDate(con
5690: 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
56a0: 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , &x)==0 ){.    
56b0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
56c0: 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 28 26      computeYMD(&
56d0: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
56e0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
56f0: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 30  zBuf), zBuf, "%0
5700: 34 64 2d 25 30 32 64 2d 25 30 32 64 22 2c 20 78  4d-%02d-%02d", x
5710: 2e 59 2c 20 78 2e 4d 2c 20 78 2e 44 29 3b 0a 20  .Y, x.M, x.D);. 
5720: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5730: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
5740: 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
5750: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
5760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 74 72  .}../*.**    str
5770: 66 74 69 6d 65 28 20 46 4f 52 4d 41 54 2c 20 54  ftime( FORMAT, T
5780: 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20  IMESTRING, MOD, 
5790: 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  MOD, ...).**.** 
57a0: 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
57b0: 64 65 73 63 72 69 62 65 64 20 62 79 20 46 4f 52  described by FOR
57c0: 4d 41 54 2e 20 20 43 6f 6e 76 65 72 73 69 6f 6e  MAT.  Conversion
57d0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
57e0: 0a 2a 2a 20 20 20 25 64 20 20 64 61 79 20 6f 66  .**   %d  day of
57f0: 20 6d 6f 6e 74 68 0a 2a 2a 20 20 20 25 66 20 20   month.**   %f  
5800: 2a 2a 20 66 72 61 63 74 69 6f 6e 61 6c 20 73 65  ** fractional se
5810: 63 6f 6e 64 73 20 20 53 53 2e 53 53 53 0a 2a 2a  conds  SS.SSS.**
5820: 20 20 20 25 48 20 20 68 6f 75 72 20 30 30 2d 32     %H  hour 00-2
5830: 34 0a 2a 2a 20 20 20 25 6a 20 20 64 61 79 20 6f  4.**   %j  day o
5840: 66 20 79 65 61 72 20 30 30 30 2d 33 36 36 0a 2a  f year 000-366.*
5850: 2a 20 20 20 25 4a 20 20 2a 2a 20 6a 75 6c 69 61  *   %J  ** julia
5860: 6e 20 64 61 79 20 6e 75 6d 62 65 72 0a 2a 2a 20  n day number.** 
5870: 20 20 25 6d 20 20 6d 6f 6e 74 68 20 30 31 2d 31    %m  month 01-1
5880: 32 0a 2a 2a 20 20 20 25 4d 20 20 6d 69 6e 75 74  2.**   %M  minut
5890: 65 20 30 30 2d 35 39 0a 2a 2a 20 20 20 25 73 20  e 00-59.**   %s 
58a0: 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
58b0: 39 37 30 2d 30 31 2d 30 31 0a 2a 2a 20 20 20 25  970-01-01.**   %
58c0: 53 20 20 73 65 63 6f 6e 64 73 20 30 30 2d 35 39  S  seconds 00-59
58d0: 0a 2a 2a 20 20 20 25 77 20 20 64 61 79 20 6f 66  .**   %w  day of
58e0: 20 77 65 65 6b 20 30 2d 36 20 20 73 75 6e 64 61   week 0-6  sunda
58f0: 79 3d 3d 30 0a 2a 2a 20 20 20 25 57 20 20 77 65  y==0.**   %W  we
5900: 65 6b 20 6f 66 20 79 65 61 72 20 30 30 2d 35 33  ek of year 00-53
5910: 0a 2a 2a 20 20 20 25 59 20 20 79 65 61 72 20 30  .**   %Y  year 0
5920: 30 30 30 2d 39 39 39 39 0a 2a 2a 20 20 20 25 25  000-9999.**   %%
5930: 20 20 25 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f    %.*/.static vo
5940: 69 64 20 73 74 72 66 74 69 6d 65 46 75 6e 63 28  id strftimeFunc(
5950: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5960: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
5970: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
5980: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5990: 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b  ){.  DateTime x;
59a0: 0a 20 20 75 36 34 20 6e 3b 0a 20 20 73 69 7a 65  .  u64 n;.  size
59b0: 5f 74 20 69 2c 6a 3b 0a 20 20 63 68 61 72 20 2a  _t i,j;.  char *
59c0: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  z;.  sqlite3 *db
59d0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
59e0: 7a 46 6d 74 3b 0a 20 20 63 68 61 72 20 7a 42 75  zFmt;.  char zBu
59f0: 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 61 72  f[100];.  if( ar
5a00: 67 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  gc==0 ) return;.
5a10: 20 20 7a 46 6d 74 20 3d 20 28 63 6f 6e 73 74 20    zFmt = (const 
5a20: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5a30: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5a40: 29 3b 0a 20 20 69 66 28 20 7a 46 6d 74 3d 3d 30  );.  if( zFmt==0
5a50: 20 7c 7c 20 69 73 44 61 74 65 28 63 6f 6e 74 65   || isDate(conte
5a60: 78 74 2c 20 61 72 67 63 2d 31 2c 20 61 72 67 76  xt, argc-1, argv
5a70: 2b 31 2c 20 26 78 29 20 29 20 72 65 74 75 72 6e  +1, &x) ) return
5a80: 3b 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  ;.  db = sqlite3
5a90: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
5aa0: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 66  le(context);.  f
5ab0: 6f 72 28 69 3d 30 2c 20 6e 3d 31 3b 20 7a 46 6d  or(i=0, n=1; zFm
5ac0: 74 5b 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b  t[i]; i++, n++){
5ad0: 0a 20 20 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d  .    if( zFmt[i]
5ae0: 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 73  =='%' ){.      s
5af0: 77 69 74 63 68 28 20 7a 46 6d 74 5b 69 2b 31 5d  witch( zFmt[i+1]
5b00: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
5b10: 20 27 64 27 3a 0a 20 20 20 20 20 20 20 20 63 61   'd':.        ca
5b20: 73 65 20 27 48 27 3a 0a 20 20 20 20 20 20 20 20  se 'H':.        
5b30: 63 61 73 65 20 27 6d 27 3a 0a 20 20 20 20 20 20  case 'm':.      
5b40: 20 20 63 61 73 65 20 27 4d 27 3a 0a 20 20 20 20    case 'M':.    
5b50: 20 20 20 20 63 61 73 65 20 27 53 27 3a 0a 20 20      case 'S':.  
5b60: 20 20 20 20 20 20 63 61 73 65 20 27 57 27 3a 0a        case 'W':.
5b70: 20 20 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20            n++;. 
5b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c           /* fall
5b90: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20   thru */.       
5ba0: 20 63 61 73 65 20 27 77 27 3a 0a 20 20 20 20 20   case 'w':.     
5bb0: 20 20 20 63 61 73 65 20 27 25 27 3a 0a 20 20 20     case '%':.   
5bc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5bd0: 20 20 20 20 20 20 63 61 73 65 20 27 66 27 3a 0a        case 'f':.
5be0: 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 38            n += 8
5bf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5c00: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
5c10: 27 6a 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e  'j':.          n
5c20: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
5c30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5c40: 63 61 73 65 20 27 59 27 3a 0a 20 20 20 20 20 20  case 'Y':.      
5c50: 20 20 20 20 6e 20 2b 3d 20 38 3b 0a 20 20 20 20      n += 8;.    
5c60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c70: 20 20 20 20 20 63 61 73 65 20 27 73 27 3a 0a 20       case 's':. 
5c80: 20 20 20 20 20 20 20 63 61 73 65 20 27 4a 27 3a         case 'J':
5c90: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20  .          n += 
5ca0: 35 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  50;.          br
5cb0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66  eak;.        def
5cc0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20  ault:.          
5cd0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 52 52 4f  return;  /* ERRO
5ce0: 52 2e 20 20 72 65 74 75 72 6e 20 61 20 4e 55 4c  R.  return a NUL
5cf0: 4c 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  L */.      }.   
5d00: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     i++;.    }.  
5d10: 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  }.  testcase( n=
5d20: 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20  =sizeof(zBuf)-1 
5d30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
5d40: 3d 3d 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29  ==sizeof(zBuf) )
5d50: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
5d60: 3d 28 75 36 34 29 64 62 2d 3e 61 4c 69 6d 69 74  =(u64)db->aLimit
5d70: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
5d80: 4e 47 54 48 5d 2b 31 20 29 3b 0a 20 20 74 65 73  NGTH]+1 );.  tes
5d90: 74 63 61 73 65 28 20 6e 3d 3d 28 75 36 34 29 64  tcase( n==(u64)d
5da0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
5db0: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
5dc0: 3b 0a 20 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66  ;.  if( n<sizeof
5dd0: 28 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 7a 20  (zBuf) ){.    z 
5de0: 3d 20 7a 42 75 66 3b 0a 20 20 7d 65 6c 73 65 20  = zBuf;.  }else 
5df0: 69 66 28 20 6e 3e 28 75 36 34 29 64 62 2d 3e 61  if( n>(u64)db->a
5e00: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
5e10: 49 54 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20  IT_LENGTH] ){.  
5e20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5e30: 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f  _error_toobig(co
5e40: 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75  ntext);.    retu
5e50: 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rn;.  }else{.   
5e60: 20 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   z = sqlite3DbMa
5e70: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 28 69 6e 74  llocRaw(db, (int
5e80: 29 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  )n);.    if( z==
5e90: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
5ea0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
5eb0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
5ec0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
5ed0: 20 20 7d 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74    }.  }.  comput
5ee0: 65 4a 44 28 26 78 29 3b 0a 20 20 63 6f 6d 70 75  eJD(&x);.  compu
5ef0: 74 65 59 4d 44 5f 48 4d 53 28 26 78 29 3b 0a 20  teYMD_HMS(&x);. 
5f00: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46 6d 74   for(i=j=0; zFmt
5f10: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
5f20: 66 28 20 7a 46 6d 74 5b 69 5d 21 3d 27 25 27 20  f( zFmt[i]!='%' 
5f30: 29 7b 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  ){.      z[j++] 
5f40: 3d 20 7a 46 6d 74 5b 69 5d 3b 0a 20 20 20 20 7d  = zFmt[i];.    }
5f50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  else{.      i++;
5f60: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 7a  .      switch( z
5f70: 46 6d 74 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  Fmt[i] ){.      
5f80: 20 20 63 61 73 65 20 27 64 27 3a 20 20 73 71 6c    case 'd':  sql
5f90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
5fa0: 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e   &z[j],"%02d",x.
5fb0: 44 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b  D); j+=2; break;
5fc0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 66  .        case 'f
5fd0: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64  ': {.          d
5fe0: 6f 75 62 6c 65 20 73 20 3d 20 78 2e 73 3b 0a 20  ouble s = x.s;. 
5ff0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 3e 35           if( s>5
6000: 39 2e 39 39 39 20 29 20 73 20 3d 20 35 39 2e 39  9.999 ) s = 59.9
6010: 39 39 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  99;.          sq
6020: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 37  lite3_snprintf(7
6030: 2c 20 26 7a 5b 6a 5d 2c 22 25 30 36 2e 33 66 22  , &z[j],"%06.3f"
6040: 2c 20 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , s);.          
6050: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
6060: 65 6e 33 30 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20  en30(&z[j]);.   
6070: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6090: 63 61 73 65 20 27 48 27 3a 20 20 73 71 6c 69 74  case 'H':  sqlit
60a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 26  e3_snprintf(3, &
60b0: 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 68 29  z[j],"%02d",x.h)
60c0: 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20  ; j+=2; break;. 
60d0: 20 20 20 20 20 20 20 63 61 73 65 20 27 57 27 3a         case 'W':
60e0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
60f0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 6a  .        case 'j
6100: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ': {.          i
6110: 6e 74 20 6e 44 61 79 3b 20 20 20 20 20 20 20 20  nt nDay;        
6120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6130: 66 20 64 61 79 73 20 73 69 6e 63 65 20 31 73 74  f days since 1st
6140: 20 64 61 79 20 6f 66 20 79 65 61 72 20 2a 2f 0a   day of year */.
6150: 20 20 20 20 20 20 20 20 20 20 44 61 74 65 54 69            DateTi
6160: 6d 65 20 79 20 3d 20 78 3b 0a 20 20 20 20 20 20  me y = x;.      
6170: 20 20 20 20 79 2e 76 61 6c 69 64 4a 44 20 3d 20      y.validJD = 
6180: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 79 2e 4d  0;.          y.M
6190: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
61a0: 79 2e 44 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  y.D = 1;.       
61b0: 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 79 29     computeJD(&y)
61c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 61 79  ;.          nDay
61d0: 20 3d 20 28 69 6e 74 29 28 28 78 2e 69 4a 44 2d   = (int)((x.iJD-
61e0: 79 2e 69 4a 44 2b 34 33 32 30 30 30 30 30 29 2f  y.iJD+43200000)/
61f0: 38 36 34 30 30 30 30 30 29 3b 0a 20 20 20 20 20  86400000);.     
6200: 20 20 20 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d       if( zFmt[i]
6210: 3d 3d 27 57 27 20 29 7b 0a 20 20 20 20 20 20 20  =='W' ){.       
6220: 20 20 20 20 20 69 6e 74 20 77 64 3b 20 20 20 2f       int wd;   /
6230: 2a 20 30 3d 4d 6f 6e 64 61 79 2c 20 31 3d 54 75  * 0=Monday, 1=Tu
6240: 65 73 64 61 79 2c 20 2e 2e 2e 20 36 3d 53 75 6e  esday, ... 6=Sun
6250: 64 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  day */.         
6260: 20 20 20 77 64 20 3d 20 28 69 6e 74 29 28 28 28     wd = (int)(((
6270: 78 2e 69 4a 44 2b 34 33 32 30 30 30 30 30 29 2f  x.iJD+43200000)/
6280: 38 36 34 30 30 30 30 30 29 25 37 29 3b 0a 20 20  86400000)%7);.  
6290: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
62a0: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a  3_snprintf(3, &z
62b0: 5b 6a 5d 2c 22 25 30 32 64 22 2c 28 6e 44 61 79  [j],"%02d",(nDay
62c0: 2b 37 2d 77 64 29 2f 37 29 3b 0a 20 20 20 20 20  +7-wd)/7);.     
62d0: 20 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20         j += 2;. 
62e0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6300: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 34 2c 20  te3_snprintf(4, 
6310: 26 7a 5b 6a 5d 2c 22 25 30 33 64 22 2c 6e 44 61  &z[j],"%03d",nDa
6320: 79 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  y+1);.          
6330: 20 20 6a 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20    j += 3;.      
6340: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6350: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
6360: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 4a  .        case 'J
6370: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ': {.          s
6380: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6390: 32 30 2c 20 26 7a 5b 6a 5d 2c 22 25 2e 31 36 67  20, &z[j],"%.16g
63a0: 22 2c 78 2e 69 4a 44 2f 38 36 34 30 30 30 30 30  ",x.iJD/86400000
63b0: 2e 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  .0);.          j
63c0: 2b 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  +=sqlite3Strlen3
63d0: 30 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  0(&z[j]);.      
63e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
63f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
6400: 65 20 27 6d 27 3a 20 20 73 71 6c 69 74 65 33 5f  e 'm':  sqlite3_
6410: 73 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a  snprintf(3, &z[j
6420: 5d 2c 22 25 30 32 64 22 2c 78 2e 4d 29 3b 20 6a  ],"%02d",x.M); j
6430: 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  +=2; break;.    
6440: 20 20 20 20 63 61 73 65 20 27 4d 27 3a 20 20 73      case 'M':  s
6450: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6460: 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c  3, &z[j],"%02d",
6470: 78 2e 6d 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61  x.m); j+=2; brea
6480: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
6490: 27 73 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  's': {.         
64a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
64b0: 66 28 33 30 2c 26 7a 5b 6a 5d 2c 22 25 6c 6c 64  f(30,&z[j],"%lld
64c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
64e0: 36 34 29 28 78 2e 69 4a 44 2f 31 30 30 30 20 2d  64)(x.iJD/1000 -
64f0: 20 32 31 30 38 36 36 37 36 2a 28 69 36 34 29 31   21086676*(i64)1
6500: 30 30 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20  0000));.        
6510: 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    j += sqlite3St
6520: 72 6c 65 6e 33 30 28 26 7a 5b 6a 5d 29 3b 0a 20  rlen30(&z[j]);. 
6530: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6550: 20 20 63 61 73 65 20 27 53 27 3a 20 20 73 71 6c    case 'S':  sql
6560: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
6570: 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 28 69 6e  &z[j],"%02d",(in
6580: 74 29 78 2e 73 29 3b 20 6a 2b 3d 32 3b 20 62 72  t)x.s); j+=2; br
6590: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
65a0: 65 20 27 77 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'w': {.       
65b0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61     z[j++] = (cha
65c0: 72 29 28 28 28 78 2e 69 4a 44 2b 31 32 39 36 30  r)(((x.iJD+12960
65d0: 30 30 30 30 29 2f 38 36 34 30 30 30 30 30 29 20  0000)/86400000) 
65e0: 25 20 37 29 20 2b 20 27 30 27 3b 0a 20 20 20 20  % 7) + '0';.    
65f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
6610: 61 73 65 20 27 59 27 3a 20 7b 0a 20 20 20 20 20  ase 'Y': {.     
6620: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6630: 72 69 6e 74 66 28 35 2c 26 7a 5b 6a 5d 2c 22 25  rintf(5,&z[j],"%
6640: 30 34 64 22 2c 78 2e 59 29 3b 20 6a 2b 3d 73 71  04d",x.Y); j+=sq
6650: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
6660: 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [j]);.          
6670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
6680: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
6690: 3a 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 25 27  :   z[j++] = '%'
66a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ; break;.      }
66b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 6a  .    }.  }.  z[j
66c0: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
66d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
66e0: 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 0a 20 20 20  text, z, -1,.   
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6700: 20 20 20 7a 3d 3d 7a 42 75 66 20 3f 20 53 51 4c     z==zBuf ? SQL
6710: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20  ITE_TRANSIENT : 
6720: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
6730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72 72 65 6e  .}../*.** curren
6740: 74 5f 74 69 6d 65 28 29 0a 2a 2a 0a 2a 2a 20 54  t_time().**.** T
6750: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
6760: 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 76 61  urns the same va
6770: 6c 75 65 20 61 73 20 74 69 6d 65 28 27 6e 6f 77  lue as time('now
6780: 27 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ')..*/.static vo
6790: 69 64 20 63 74 69 6d 65 46 75 6e 63 28 0a 20 20  id ctimeFunc(.  
67a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
67b0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
67c0: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
67d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
67e0: 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ed2.){.  UNUSED_
67f0: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
6800: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
6810: 20 74 69 6d 65 46 75 6e 63 28 63 6f 6e 74 65 78   timeFunc(contex
6820: 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
6830: 2a 2a 20 63 75 72 72 65 6e 74 5f 64 61 74 65 28  ** current_date(
6840: 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ).**.** This fun
6850: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
6860: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
6870: 64 61 74 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a  date('now')..*/.
6880: 73 74 61 74 69 63 20 76 6f 69 64 20 63 64 61 74  static void cdat
6890: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
68a0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
68b0: 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64  t,.  int NotUsed
68c0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
68d0: 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a  e **NotUsed2.){.
68e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
68f0: 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
6900: 55 73 65 64 32 29 3b 0a 20 20 64 61 74 65 46 75  Used2);.  dateFu
6910: 6e 63 28 63 6f 6e 74 65 78 74 2c 20 30 2c 20 30  nc(context, 0, 0
6920: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72 72  );.}../*.** curr
6930: 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70 28 29 0a  ent_timestamp().
6940: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
6950: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
6960: 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 64 61  same value as da
6970: 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 2e 0a 2a  tetime('now')..*
6980: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 74  /.static void ct
6990: 69 6d 65 73 74 61 6d 70 46 75 6e 63 28 0a 20 20  imestampFunc(.  
69a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
69b0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
69c0: 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74  NotUsed,.  sqlit
69d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73  e3_value **NotUs
69e0: 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ed2.){.  UNUSED_
69f0: 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
6a00: 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
6a10: 20 64 61 74 65 74 69 6d 65 46 75 6e 63 28 63 6f   datetimeFunc(co
6a20: 6e 74 65 78 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ntext, 0, 0);.}.
6a30: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
6a40: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
6a50: 41 54 45 54 49 4d 45 5f 46 55 4e 43 53 29 20 2a  ATETIME_FUNCS) *
6a60: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
6a70: 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46  _OMIT_DATETIME_F
6a80: 55 4e 43 53 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  UNCS./*.** If th
6a90: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
6aa0: 70 69 6c 65 64 20 74 6f 20 6f 6d 69 74 20 74 68  piled to omit th
6ab0: 65 20 66 75 6c 6c 2d 73 63 61 6c 65 20 64 61 74  e full-scale dat
6ac0: 65 20 61 6e 64 20 74 69 6d 65 0a 2a 2a 20 68 61  e and time.** ha
6ad0: 6e 64 6c 69 6e 67 20 28 74 6f 20 67 65 74 20 61  ndling (to get a
6ae0: 20 73 6d 61 6c 6c 65 72 20 62 69 6e 61 72 79 29   smaller binary)
6af0: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
6b00: 6d 69 6e 69 6d 61 6c 20 76 65 72 73 69 6f 6e 0a  minimal version.
6b10: 2a 2a 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ** of the functi
6b20: 6f 6e 73 20 63 75 72 72 65 6e 74 5f 74 69 6d 65  ons current_time
6b30: 28 29 2c 20 63 75 72 72 65 6e 74 5f 64 61 74 65  (), current_date
6b40: 28 29 20 61 6e 64 20 63 75 72 72 65 6e 74 5f 74  () and current_t
6b50: 69 6d 65 73 74 61 6d 70 28 29 0a 2a 2a 20 61 72  imestamp().** ar
6b60: 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 73 74 65  e included inste
6b70: 61 64 2e 20 54 68 69 73 20 69 73 20 74 6f 20 73  ad. This is to s
6b80: 75 70 70 6f 72 74 20 63 6f 6c 75 6d 6e 20 64 65  upport column de
6b90: 63 6c 61 72 61 74 69 6f 6e 73 20 74 68 61 74 0a  clarations that.
6ba0: 2a 2a 20 69 6e 63 6c 75 64 65 20 22 44 45 46 41  ** include "DEFA
6bb0: 55 4c 54 20 43 55 52 52 45 4e 54 5f 54 49 4d 45  ULT CURRENT_TIME
6bc0: 22 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  " etc..**.** Thi
6bd0: 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
6be0: 74 68 65 20 43 2d 6c 69 62 72 61 72 79 20 66 75  the C-library fu
6bf0: 6e 63 74 69 6f 6e 73 20 74 69 6d 65 28 29 2c 20  nctions time(), 
6c00: 67 6d 74 69 6d 65 28 29 0a 2a 2a 20 61 6e 64 20  gmtime().** and 
6c10: 73 74 72 66 74 69 6d 65 28 29 2e 20 54 68 65 20  strftime(). The 
6c20: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 74 6f  format string to
6c30: 20 70 61 73 73 20 74 6f 20 73 74 72 66 74 69 6d   pass to strftim
6c40: 65 28 29 20 69 73 20 73 75 70 70 6c 69 65 64 0a  e() is supplied.
6c50: 2a 2a 20 61 73 20 74 68 65 20 75 73 65 72 2d 64  ** as the user-d
6c60: 61 74 61 20 66 6f 72 20 74 68 65 20 66 75 6e 63  ata for the func
6c70: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
6c80: 76 6f 69 64 20 63 75 72 72 65 6e 74 54 69 6d 65  void currentTime
6c90: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
6ca0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6cb0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
6cc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6cd0: 61 72 67 76 0a 29 7b 0a 20 20 74 69 6d 65 5f 74  argv.){.  time_t
6ce0: 20 74 3b 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72   t;.  char *zFor
6cf0: 6d 61 74 20 3d 20 28 63 68 61 72 20 2a 29 73 71  mat = (char *)sq
6d00: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
6d10: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69  context);.  sqli
6d20: 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
6d30: 65 33 5f 69 6e 74 36 34 20 69 54 3b 0a 20 20 73  e3_int64 iT;.  s
6d40: 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20  truct tm *pTm;. 
6d50: 20 73 74 72 75 63 74 20 74 6d 20 73 4e 6f 77 3b   struct tm sNow;
6d60: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 5d  .  char zBuf[20]
6d70: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
6d80: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55  METER(argc);.  U
6d90: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6da0: 61 72 67 76 29 3b 0a 0a 20 20 69 54 20 3d 20 73  argv);..  iT = s
6db0: 71 6c 69 74 65 33 53 74 6d 74 43 75 72 72 65 6e  qlite3StmtCurren
6dc0: 74 54 69 6d 65 28 63 6f 6e 74 65 78 74 29 3b 0a  tTime(context);.
6dd0: 20 20 69 66 28 20 69 54 3c 3d 30 20 29 20 72 65    if( iT<=0 ) re
6de0: 74 75 72 6e 3b 0a 20 20 74 20 3d 20 69 54 2f 31  turn;.  t = iT/1
6df0: 30 30 30 20 2d 20 31 30 30 30 30 2a 28 73 71 6c  000 - 10000*(sql
6e00: 69 74 65 33 5f 69 6e 74 36 34 29 32 31 30 38 36  ite3_int64)21086
6e10: 36 37 36 3b 0a 23 69 66 20 48 41 56 45 5f 47 4d  676;.#if HAVE_GM
6e20: 54 49 4d 45 5f 52 0a 20 20 70 54 6d 20 3d 20 67  TIME_R.  pTm = g
6e30: 6d 74 69 6d 65 5f 72 28 26 74 2c 20 26 73 4e 6f  mtime_r(&t, &sNo
6e40: 77 29 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  w);.#else.  sqli
6e50: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6e60: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
6e70: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6e80: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
6e90: 20 20 70 54 6d 20 3d 20 67 6d 74 69 6d 65 28 26    pTm = gmtime(&
6ea0: 74 29 3b 0a 20 20 69 66 28 20 70 54 6d 20 29 20  t);.  if( pTm ) 
6eb0: 6d 65 6d 63 70 79 28 26 73 4e 6f 77 2c 20 70 54  memcpy(&sNow, pT
6ec0: 6d 2c 20 73 69 7a 65 6f 66 28 73 4e 6f 77 29 29  m, sizeof(sNow))
6ed0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
6ee0: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
6ef0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
6f00: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
6f10: 53 54 45 52 29 29 3b 0a 23 65 6e 64 69 66 0a 20  STER));.#endif. 
6f20: 20 69 66 28 20 70 54 6d 20 29 7b 0a 20 20 20 20   if( pTm ){.    
6f30: 73 74 72 66 74 69 6d 65 28 7a 42 75 66 2c 20 32  strftime(zBuf, 2
6f40: 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 26 73 4e 6f  0, zFormat, &sNo
6f50: 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  w);.    sqlite3_
6f60: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6f70: 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53  ext, zBuf, -1, S
6f80: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
6f90: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
6fa0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
6fb0: 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 61  ion registered a
6fc0: 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
6fd0: 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 53  C functions as S
6fe0: 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e  QL.** functions.
6ff0: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
7000: 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e   the only routin
7010: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77  e in this file w
7020: 69 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20  ith.** external 
7030: 6c 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  linkage..*/.void
7040: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
7050: 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e  DateTimeFunction
7060: 73 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  s(void){.  stati
7070: 63 20 53 51 4c 49 54 45 5f 57 53 44 20 46 75 6e  c SQLITE_WSD Fun
7080: 63 44 65 66 20 61 44 61 74 65 54 69 6d 65 46 75  cDef aDateTimeFu
7090: 6e 63 73 5b 5d 20 3d 20 7b 0a 23 69 66 6e 64 65  ncs[] = {.#ifnde
70a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41  f SQLITE_OMIT_DA
70b0: 54 45 54 49 4d 45 5f 46 55 4e 43 53 0a 20 20 20  TETIME_FUNCS.   
70c0: 20 44 46 55 4e 43 54 49 4f 4e 28 6a 75 6c 69 61   DFUNCTION(julia
70d0: 6e 64 61 79 2c 20 20 20 20 20 20 20 20 2d 31 2c  nday,        -1,
70e0: 20 30 2c 20 30 2c 20 6a 75 6c 69 61 6e 64 61 79   0, 0, julianday
70f0: 46 75 6e 63 20 29 2c 0a 20 20 20 20 44 46 55 4e  Func ),.    DFUN
7100: 43 54 49 4f 4e 28 64 61 74 65 2c 20 20 20 20 20  CTION(date,     
7110: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30          -1, 0, 0
7120: 2c 20 64 61 74 65 46 75 6e 63 20 20 20 20 20 20  , dateFunc      
7130: 29 2c 0a 20 20 20 20 44 46 55 4e 43 54 49 4f 4e  ),.    DFUNCTION
7140: 28 74 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  (time,          
7150: 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 74 69 6d     -1, 0, 0, tim
7160: 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20  eFunc      ),.  
7170: 20 20 44 46 55 4e 43 54 49 4f 4e 28 64 61 74 65    DFUNCTION(date
7180: 74 69 6d 65 2c 20 20 20 20 20 20 20 20 20 2d 31  time,         -1
7190: 2c 20 30 2c 20 30 2c 20 64 61 74 65 74 69 6d 65  , 0, 0, datetime
71a0: 46 75 6e 63 20 20 29 2c 0a 20 20 20 20 44 46 55  Func  ),.    DFU
71b0: 4e 43 54 49 4f 4e 28 73 74 72 66 74 69 6d 65 2c  NCTION(strftime,
71c0: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20           -1, 0, 
71d0: 30 2c 20 73 74 72 66 74 69 6d 65 46 75 6e 63 20  0, strftimeFunc 
71e0: 20 29 2c 0a 20 20 20 20 44 46 55 4e 43 54 49 4f   ),.    DFUNCTIO
71f0: 4e 28 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20  N(current_time, 
7200: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 74       0, 0, 0, ct
7210: 69 6d 65 46 75 6e 63 20 20 20 20 20 29 2c 0a 20  imeFunc     ),. 
7220: 20 20 20 44 46 55 4e 43 54 49 4f 4e 28 63 75 72     DFUNCTION(cur
7230: 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70 2c 20  rent_timestamp, 
7240: 30 2c 20 30 2c 20 30 2c 20 63 74 69 6d 65 73 74  0, 0, 0, ctimest
7250: 61 6d 70 46 75 6e 63 29 2c 0a 20 20 20 20 44 46  ampFunc),.    DF
7260: 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 6e 74 5f  UNCTION(current_
7270: 64 61 74 65 2c 20 20 20 20 20 20 30 2c 20 30 2c  date,      0, 0,
7280: 20 30 2c 20 63 64 61 74 65 46 75 6e 63 20 20 20   0, cdateFunc   
7290: 20 20 29 2c 0a 23 65 6c 73 65 0a 20 20 20 20 53    ),.#else.    S
72a0: 54 52 5f 46 55 4e 43 54 49 4f 4e 28 63 75 72 72  TR_FUNCTION(curr
72b0: 65 6e 74 5f 74 69 6d 65 2c 20 20 20 20 20 20 30  ent_time,      0
72c0: 2c 20 22 25 48 3a 25 4d 3a 25 53 22 2c 20 20 20  , "%H:%M:%S",   
72d0: 20 20 20 20 20 20 20 30 2c 20 63 75 72 72 65 6e         0, curren
72e0: 74 54 69 6d 65 46 75 6e 63 29 2c 0a 20 20 20 20  tTimeFunc),.    
72f0: 53 54 52 5f 46 55 4e 43 54 49 4f 4e 28 63 75 72  STR_FUNCTION(cur
7300: 72 65 6e 74 5f 64 61 74 65 2c 20 20 20 20 20 20  rent_date,      
7310: 30 2c 20 22 25 59 2d 25 6d 2d 25 64 22 2c 20 20  0, "%Y-%m-%d",  
7320: 20 20 20 20 20 20 20 20 30 2c 20 63 75 72 72 65          0, curre
7330: 6e 74 54 69 6d 65 46 75 6e 63 29 2c 0a 20 20 20  ntTimeFunc),.   
7340: 20 53 54 52 5f 46 55 4e 43 54 49 4f 4e 28 63 75   STR_FUNCTION(cu
7350: 72 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70 2c  rrent_timestamp,
7360: 20 30 2c 20 22 25 59 2d 25 6d 2d 25 64 20 25 48   0, "%Y-%m-%d %H
7370: 3a 25 4d 3a 25 53 22 2c 20 30 2c 20 63 75 72 72  :%M:%S", 0, curr
7380: 65 6e 74 54 69 6d 65 46 75 6e 63 29 2c 0a 23 65  entTimeFunc),.#e
7390: 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  ndif.  };.  int 
73a0: 69 3b 0a 20 20 46 75 6e 63 44 65 66 48 61 73 68  i;.  FuncDefHash
73b0: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
73c0: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
73d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
73e0: 74 69 6f 6e 73 29 3b 0a 20 20 46 75 6e 63 44 65  tions);.  FuncDe
73f0: 66 20 2a 61 46 75 6e 63 20 3d 20 28 46 75 6e 63  f *aFunc = (Func
7400: 44 65 66 2a 29 26 47 4c 4f 42 41 4c 28 46 75 6e  Def*)&GLOBAL(Fun
7410: 63 44 65 66 2c 20 61 44 61 74 65 54 69 6d 65 46  cDef, aDateTimeF
7420: 75 6e 63 73 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  uncs);..  for(i=
7430: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
7440: 44 61 74 65 54 69 6d 65 46 75 6e 63 73 29 3b 20  DateTimeFuncs); 
7450: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
7460: 33 46 75 6e 63 44 65 66 49 6e 73 65 72 74 28 70  3FuncDefInsert(p
7470: 48 61 73 68 2c 20 26 61 46 75 6e 63 5b 69 5d 29  Hash, &aFunc[i])
7480: 3b 0a 20 20 7d 0a 7d 0a                          ;.  }.}.