/ Hex Artifact Content
Login

Artifact 57a7f9ba9f6b4d5268f5e411739066a611f99036:


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 4a 75   and dates as Ju
02b0: 6c 69 61 6e 20 44 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 4a 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 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43   */.};.../*.** C
0970: 6f 6e 76 65 72 74 20 7a 44 61 74 65 20 69 6e 74  onvert zDate int
0980: 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  o one or more in
0990: 74 65 67 65 72 73 2e 20 20 41 64 64 69 74 69 6f  tegers.  Additio
09a0: 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a  nal arguments.**
09b0: 20 63 6f 6d 65 20 69 6e 20 67 72 6f 75 70 73 20   come in groups 
09c0: 6f 66 20 35 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  of 5 as follows:
09d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4e 20 20  .**.**       N  
09e0: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 64       number of d
09f0: 69 67 69 74 73 20 69 6e 20 74 68 65 20 69 6e 74  igits in the int
0a00: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 6d 69  eger.**       mi
0a10: 6e 20 20 20 20 20 6d 69 6e 69 6d 75 6d 20 61 6c  n     minimum al
0a20: 6c 6f 77 65 64 20 76 61 6c 75 65 20 6f 66 20 74  lowed value of t
0a30: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  he integer.**   
0a40: 20 20 20 20 6d 61 78 20 20 20 20 20 6d 61 78 69      max     maxi
0a50: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75  mum allowed valu
0a60: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
0a70: 0a 2a 2a 20 20 20 20 20 20 20 6e 65 78 74 43 20  .**       nextC 
0a80: 20 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65    first characte
0a90: 72 20 61 66 74 65 72 20 74 68 65 20 69 6e 74 65  r after the inte
0aa0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 70 56 61  ger.**       pVa
0ab0: 6c 20 20 20 20 77 68 65 72 65 20 74 6f 20 77 72  l    where to wr
0ac0: 69 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 73  ite the integers
0ad0: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f   value..**.** Co
0ae0: 6e 76 65 72 73 69 6f 6e 73 20 63 6f 6e 74 69 6e  nversions contin
0af0: 75 65 20 75 6e 74 69 6c 20 6f 6e 65 20 77 69 74  ue until one wit
0b00: 68 20 6e 65 78 74 43 3d 3d 30 20 69 73 20 65 6e  h nextC==0 is en
0b10: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 20 54 68  countered..** Th
0b20: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
0b30: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
0b40: 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 6e 76   successful conv
0b50: 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ersions..*/.stat
0b60: 69 63 20 69 6e 74 20 67 65 74 44 69 67 69 74 73  ic int getDigits
0b70: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61  (const char *zDa
0b80: 74 65 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  te, ...){.  va_l
0b90: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 76 61  ist ap;.  int va
0ba0: 6c 3b 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e  l;.  int N;.  in
0bb0: 74 20 6d 69 6e 3b 0a 20 20 69 6e 74 20 6d 61 78  t min;.  int max
0bc0: 3b 0a 20 20 69 6e 74 20 6e 65 78 74 43 3b 0a 20  ;.  int nextC;. 
0bd0: 20 69 6e 74 20 2a 70 56 61 6c 3b 0a 20 20 69 6e   int *pVal;.  in
0be0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 76 61 5f  t cnt = 0;.  va_
0bf0: 73 74 61 72 74 28 61 70 2c 20 7a 44 61 74 65 29  start(ap, zDate)
0c00: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 4e 20 3d 20  ;.  do{.    N = 
0c10: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
0c20: 0a 20 20 20 20 6d 69 6e 20 3d 20 76 61 5f 61 72  .    min = va_ar
0c30: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
0c40: 6d 61 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  max = va_arg(ap,
0c50: 20 69 6e 74 29 3b 0a 20 20 20 20 6e 65 78 74 43   int);.    nextC
0c60: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
0c70: 74 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 76  t);.    pVal = v
0c80: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
0c90: 0a 20 20 20 20 76 61 6c 20 3d 20 30 3b 0a 20 20  .    val = 0;.  
0ca0: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
0cb0: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
0cc0: 65 33 49 73 64 69 67 69 74 28 2a 7a 44 61 74 65  e3Isdigit(*zDate
0cd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ) ){.        got
0ce0: 6f 20 65 6e 64 5f 67 65 74 44 69 67 69 74 73 3b  o end_getDigits;
0cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76  .      }.      v
0d00: 61 6c 20 3d 20 76 61 6c 2a 31 30 20 2b 20 2a 7a  al = val*10 + *z
0d10: 44 61 74 65 20 2d 20 27 30 27 3b 0a 20 20 20 20  Date - '0';.    
0d20: 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 7d    zDate++;.    }
0d30: 0a 20 20 20 20 69 66 28 20 76 61 6c 3c 6d 69 6e  .    if( val<min
0d40: 20 7c 7c 20 76 61 6c 3e 6d 61 78 20 7c 7c 20 28   || val>max || (
0d50: 6e 65 78 74 43 21 3d 30 20 26 26 20 6e 65 78 74  nextC!=0 && next
0d60: 43 21 3d 2a 7a 44 61 74 65 29 20 29 7b 0a 20 20  C!=*zDate) ){.  
0d70: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 67 65 74      goto end_get
0d80: 44 69 67 69 74 73 3b 0a 20 20 20 20 7d 0a 20 20  Digits;.    }.  
0d90: 20 20 2a 70 56 61 6c 20 3d 20 76 61 6c 3b 0a 20    *pVal = val;. 
0da0: 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20     zDate++;.    
0db0: 63 6e 74 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  cnt++;.  }while(
0dc0: 20 6e 65 78 74 43 20 29 3b 0a 65 6e 64 5f 67 65   nextC );.end_ge
0dd0: 74 44 69 67 69 74 73 3a 0a 20 20 76 61 5f 65 6e  tDigits:.  va_en
0de0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
0df0: 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  cnt;.}../*.** Pa
0e00: 72 73 65 20 61 20 74 69 6d 65 7a 6f 6e 65 20 65  rse a timezone e
0e10: 78 74 65 6e 73 69 6f 6e 20 6f 6e 20 74 68 65 20  xtension on the 
0e20: 65 6e 64 20 6f 66 20 61 20 64 61 74 65 2d 74 69  end of a date-ti
0e30: 6d 65 2e 0a 2a 2a 20 54 68 65 20 65 78 74 65 6e  me..** The exten
0e40: 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66  sion is of the f
0e50: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  orm:.**.**      
0e60: 20 20 28 2b 2f 2d 29 48 48 3a 4d 4d 0a 2a 2a 0a    (+/-)HH:MM.**.
0e70: 2a 2a 20 4f 72 20 74 68 65 20 22 7a 75 6c 75 22  ** Or the "zulu"
0e80: 20 6e 6f 74 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   notation:.**.**
0e90: 20 20 20 20 20 20 20 20 5a 0a 2a 2a 0a 2a 2a 20          Z.**.** 
0ea0: 49 66 20 74 68 65 20 70 61 72 73 65 20 69 73 20  If the parse is 
0eb0: 73 75 63 63 65 73 73 66 75 6c 2c 20 77 72 69 74  successful, writ
0ec0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
0ed0: 6d 69 6e 75 74 65 73 0a 2a 2a 20 6f 66 20 63 68  minutes.** of ch
0ee0: 61 6e 67 65 20 69 6e 20 70 2d 3e 74 7a 20 61 6e  ange in p->tz an
0ef0: 64 20 72 65 74 75 72 6e 20 30 2e 20 20 49 66 20  d return 0.  If 
0f00: 61 20 70 61 72 73 65 72 20 65 72 72 6f 72 20 6f  a parser error o
0f10: 63 63 75 72 73 2c 0a 2a 2a 20 72 65 74 75 72 6e  ccurs,.** return
0f20: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
0f30: 20 41 20 6d 69 73 73 69 6e 67 20 73 70 65 63 69   A missing speci
0f40: 66 69 65 72 20 69 73 20 6e 6f 74 20 63 6f 6e 73  fier is not cons
0f50: 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2e  idered an error.
0f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
0f70: 61 72 73 65 54 69 6d 65 7a 6f 6e 65 28 63 6f 6e  arseTimezone(con
0f80: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20  st char *zDate, 
0f90: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
0fa0: 69 6e 74 20 73 67 6e 20 3d 20 30 3b 0a 20 20 69  int sgn = 0;.  i
0fb0: 6e 74 20 6e 48 72 2c 20 6e 4d 6e 3b 0a 20 20 69  nt nHr, nMn;.  i
0fc0: 6e 74 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 73  nt c;.  while( s
0fd0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
0fe0: 44 61 74 65 29 20 29 7b 20 7a 44 61 74 65 2b 2b  Date) ){ zDate++
0ff0: 3b 20 7d 0a 20 20 70 2d 3e 74 7a 20 3d 20 30 3b  ; }.  p->tz = 0;
1000: 0a 20 20 63 20 3d 20 2a 7a 44 61 74 65 3b 0a 20  .  c = *zDate;. 
1010: 20 69 66 28 20 63 3d 3d 27 2d 27 20 29 7b 0a 20   if( c=='-' ){. 
1020: 20 20 20 73 67 6e 20 3d 20 2d 31 3b 0a 20 20 7d     sgn = -1;.  }
1030: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2b 27 20  else if( c=='+' 
1040: 29 7b 0a 20 20 20 20 73 67 6e 20 3d 20 2b 31 3b  ){.    sgn = +1;
1050: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
1060: 27 5a 27 20 7c 7c 20 63 3d 3d 27 7a 27 20 29 7b  'Z' || c=='z' ){
1070: 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20  .    zDate++;.  
1080: 20 20 67 6f 74 6f 20 7a 75 6c 75 5f 74 69 6d 65    goto zulu_time
1090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
10a0: 65 74 75 72 6e 20 63 21 3d 30 3b 0a 20 20 7d 0a  eturn c!=0;.  }.
10b0: 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 69 66 28    zDate++;.  if(
10c0: 20 67 65 74 44 69 67 69 74 73 28 7a 44 61 74 65   getDigits(zDate
10d0: 2c 20 32 2c 20 30 2c 20 31 34 2c 20 27 3a 27 2c  , 2, 0, 14, ':',
10e0: 20 26 6e 48 72 2c 20 32 2c 20 30 2c 20 35 39 2c   &nHr, 2, 0, 59,
10f0: 20 30 2c 20 26 6e 4d 6e 29 21 3d 32 20 29 7b 0a   0, &nMn)!=2 ){.
1100: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1110: 7d 0a 20 20 7a 44 61 74 65 20 2b 3d 20 35 3b 0a  }.  zDate += 5;.
1120: 20 20 70 2d 3e 74 7a 20 3d 20 73 67 6e 2a 28 6e    p->tz = sgn*(n
1130: 4d 6e 20 2b 20 6e 48 72 2a 36 30 29 3b 0a 7a 75  Mn + nHr*60);.zu
1140: 6c 75 5f 74 69 6d 65 3a 0a 20 20 77 68 69 6c 65  lu_time:.  while
1150: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
1160: 28 2a 7a 44 61 74 65 29 20 29 7b 20 7a 44 61 74  (*zDate) ){ zDat
1170: 65 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  e++; }.  return 
1180: 2a 7a 44 61 74 65 21 3d 30 3b 0a 7d 0a 0a 2f 2a  *zDate!=0;.}../*
1190: 0a 2a 2a 20 50 61 72 73 65 20 74 69 6d 65 73 20  .** Parse times 
11a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 48 48 3a 4d  of the form HH:M
11b0: 4d 20 6f 72 20 48 48 3a 4d 4d 3a 53 53 20 6f 72  M or HH:MM:SS or
11c0: 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 46 2e 0a   HH:MM:SS.FFFF..
11d0: 2a 2a 20 54 68 65 20 48 48 2c 20 4d 4d 2c 20 61  ** The HH, MM, a
11e0: 6e 64 20 53 53 20 6d 75 73 74 20 65 61 63 68 20  nd SS must each 
11f0: 62 65 20 65 78 61 63 74 6c 79 20 32 20 64 69 67  be exactly 2 dig
1200: 69 74 73 2e 20 20 54 68 65 0a 2a 2a 20 66 72 61  its.  The.** fra
1210: 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 20  ctional seconds 
1220: 46 46 46 46 20 63 61 6e 20 62 65 20 6f 6e 65 20  FFFF can be one 
1230: 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 2e 0a  or more digits..
1240: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  **.** Return 1 i
1250: 66 20 74 68 65 72 65 20 69 73 20 61 20 70 61 72  f there is a par
1260: 73 69 6e 67 20 65 72 72 6f 72 20 61 6e 64 20 30  sing error and 0
1270: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
1280: 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 73 65  static int parse
1290: 48 68 4d 6d 53 73 28 63 6f 6e 73 74 20 63 68 61  HhMmSs(const cha
12a0: 72 20 2a 7a 44 61 74 65 2c 20 44 61 74 65 54 69  r *zDate, DateTi
12b0: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 2c  me *p){.  int h,
12c0: 20 6d 2c 20 73 3b 0a 20 20 64 6f 75 62 6c 65 20   m, s;.  double 
12d0: 6d 73 20 3d 20 30 2e 30 3b 0a 20 20 69 66 28 20  ms = 0.0;.  if( 
12e0: 67 65 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c  getDigits(zDate,
12f0: 20 32 2c 20 30 2c 20 32 34 2c 20 27 3a 27 2c 20   2, 0, 24, ':', 
1300: 26 68 2c 20 32 2c 20 30 2c 20 35 39 2c 20 30 2c  &h, 2, 0, 59, 0,
1310: 20 26 6d 29 21 3d 32 20 29 7b 0a 20 20 20 20 72   &m)!=2 ){.    r
1320: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 7a  eturn 1;.  }.  z
1330: 44 61 74 65 20 2b 3d 20 35 3b 0a 20 20 69 66 28  Date += 5;.  if(
1340: 20 2a 7a 44 61 74 65 3d 3d 27 3a 27 20 29 7b 0a   *zDate==':' ){.
1350: 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20      zDate++;.   
1360: 20 69 66 28 20 67 65 74 44 69 67 69 74 73 28 7a   if( getDigits(z
1370: 44 61 74 65 2c 20 32 2c 20 30 2c 20 35 39 2c 20  Date, 2, 0, 59, 
1380: 30 2c 20 26 73 29 21 3d 31 20 29 7b 0a 20 20 20  0, &s)!=1 ){.   
1390: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
13a0: 20 7d 0a 20 20 20 20 7a 44 61 74 65 20 2b 3d 20   }.    zDate += 
13b0: 32 3b 0a 20 20 20 20 69 66 28 20 2a 7a 44 61 74  2;.    if( *zDat
13c0: 65 3d 3d 27 2e 27 20 26 26 20 73 71 6c 69 74 65  e=='.' && sqlite
13d0: 33 49 73 64 69 67 69 74 28 7a 44 61 74 65 5b 31  3Isdigit(zDate[1
13e0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62  ]) ){.      doub
13f0: 6c 65 20 72 53 63 61 6c 65 20 3d 20 31 2e 30 3b  le rScale = 1.0;
1400: 0a 20 20 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a  .      zDate++;.
1410: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
1420: 69 74 65 33 49 73 64 69 67 69 74 28 2a 7a 44 61  ite3Isdigit(*zDa
1430: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  te) ){.        m
1440: 73 20 3d 20 6d 73 2a 31 30 2e 30 20 2b 20 2a 7a  s = ms*10.0 + *z
1450: 44 61 74 65 20 2d 20 27 30 27 3b 0a 20 20 20 20  Date - '0';.    
1460: 20 20 20 20 72 53 63 61 6c 65 20 2a 3d 20 31 30      rScale *= 10
1470: 2e 30 3b 0a 20 20 20 20 20 20 20 20 7a 44 61 74  .0;.        zDat
1480: 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e++;.      }.   
1490: 20 20 20 6d 73 20 2f 3d 20 72 53 63 61 6c 65 3b     ms /= rScale;
14a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
14b0: 20 20 20 20 73 20 3d 20 30 3b 0a 20 20 7d 0a 20      s = 0;.  }. 
14c0: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b   p->validJD = 0;
14d0: 0a 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d  .  p->validHMS =
14e0: 20 31 3b 0a 20 20 70 2d 3e 68 20 3d 20 68 3b 0a   1;.  p->h = h;.
14f0: 20 20 70 2d 3e 6d 20 3d 20 6d 3b 0a 20 20 70 2d    p->m = m;.  p-
1500: 3e 73 20 3d 20 73 20 2b 20 6d 73 3b 0a 20 20 69  >s = s + ms;.  i
1510: 66 28 20 70 61 72 73 65 54 69 6d 65 7a 6f 6e 65  f( parseTimezone
1520: 28 7a 44 61 74 65 2c 20 70 29 20 29 20 72 65 74  (zDate, p) ) ret
1530: 75 72 6e 20 31 3b 0a 20 20 70 2d 3e 76 61 6c 69  urn 1;.  p->vali
1540: 64 54 5a 20 3d 20 28 70 2d 3e 74 7a 21 3d 30 29  dTZ = (p->tz!=0)
1550: 3f 31 3a 30 3b 0a 20 20 72 65 74 75 72 6e 20 30  ?1:0;.  return 0
1560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1570: 72 74 20 66 72 6f 6d 20 59 59 59 59 2d 4d 4d 2d  rt from YYYY-MM-
1580: 44 44 20 48 48 3a 4d 4d 3a 53 53 20 74 6f 20 6a  DD HH:MM:SS to j
1590: 75 6c 69 61 6e 20 64 61 79 2e 20 20 57 65 20 61  ulian day.  We a
15a0: 6c 77 61 79 73 20 61 73 73 75 6d 65 0a 2a 2a 20  lways assume.** 
15b0: 74 68 61 74 20 74 68 65 20 59 59 59 59 2d 4d 4d  that the YYYY-MM
15c0: 2d 44 44 20 69 73 20 61 63 63 6f 72 64 69 6e 67  -DD is according
15d0: 20 74 6f 20 74 68 65 20 47 72 65 67 6f 72 69 61   to the Gregoria
15e0: 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
15f0: 2a 20 52 65 66 65 72 65 6e 63 65 3a 20 20 4d 65  * Reference:  Me
1600: 65 75 73 20 70 61 67 65 20 36 31 0a 2a 2f 0a 73  eus page 61.*/.s
1610: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
1620: 74 65 4a 44 28 44 61 74 65 54 69 6d 65 20 2a 70  teJD(DateTime *p
1630: 29 7b 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44  ){.  int Y, M, D
1640: 2c 20 41 2c 20 42 2c 20 58 31 2c 20 58 32 3b 0a  , A, B, X1, X2;.
1650: 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 4a  .  if( p->validJ
1660: 44 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  D ) return;.  if
1670: 28 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 29 7b  ( p->validYMD ){
1680: 0a 20 20 20 20 59 20 3d 20 70 2d 3e 59 3b 0a 20  .    Y = p->Y;. 
1690: 20 20 20 4d 20 3d 20 70 2d 3e 4d 3b 0a 20 20 20     M = p->M;.   
16a0: 20 44 20 3d 20 70 2d 3e 44 3b 0a 20 20 7d 65 6c   D = p->D;.  }el
16b0: 73 65 7b 0a 20 20 20 20 59 20 3d 20 32 30 30 30  se{.    Y = 2000
16c0: 3b 20 20 2f 2a 20 49 66 20 6e 6f 20 59 4d 44 20  ;  /* If no YMD 
16d0: 73 70 65 63 69 66 69 65 64 2c 20 61 73 73 75 6d  specified, assum
16e0: 65 20 32 30 30 30 2d 4a 61 6e 2d 30 31 20 2a 2f  e 2000-Jan-01 */
16f0: 0a 20 20 20 20 4d 20 3d 20 31 3b 0a 20 20 20 20  .    M = 1;.    
1700: 44 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  D = 1;.  }.  if(
1710: 20 4d 3c 3d 32 20 29 7b 0a 20 20 20 20 59 2d 2d   M<=2 ){.    Y--
1720: 3b 0a 20 20 20 20 4d 20 2b 3d 20 31 32 3b 0a 20  ;.    M += 12;. 
1730: 20 7d 0a 20 20 41 20 3d 20 59 2f 31 30 30 3b 0a   }.  A = Y/100;.
1740: 20 20 42 20 3d 20 32 20 2d 20 41 20 2b 20 28 41    B = 2 - A + (A
1750: 2f 34 29 3b 0a 20 20 58 31 20 3d 20 33 36 35 32  /4);.  X1 = 3652
1760: 35 2a 28 59 2b 34 37 31 36 29 2f 31 30 30 3b 0a  5*(Y+4716)/100;.
1770: 20 20 58 32 20 3d 20 33 30 36 30 30 31 2a 28 4d    X2 = 306001*(M
1780: 2b 31 29 2f 31 30 30 30 30 3b 0a 20 20 70 2d 3e  +1)/10000;.  p->
1790: 69 4a 44 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  iJD = (sqlite3_i
17a0: 6e 74 36 34 29 28 28 58 31 20 2b 20 58 32 20 2b  nt64)((X1 + X2 +
17b0: 20 44 20 2b 20 42 20 2d 20 31 35 32 34 2e 35 20   D + B - 1524.5 
17c0: 29 20 2a 20 38 36 34 30 30 30 30 30 29 3b 0a 20  ) * 86400000);. 
17d0: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b   p->validJD = 1;
17e0: 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 48  .  if( p->validH
17f0: 4d 53 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4a 44  MS ){.    p->iJD
1800: 20 2b 3d 20 70 2d 3e 68 2a 33 36 30 30 30 30 30   += p->h*3600000
1810: 20 2b 20 70 2d 3e 6d 2a 36 30 30 30 30 20 2b 20   + p->m*60000 + 
1820: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
1830: 70 2d 3e 73 2a 31 30 30 30 29 3b 0a 20 20 20 20  p->s*1000);.    
1840: 69 66 28 20 70 2d 3e 76 61 6c 69 64 54 5a 20 29  if( p->validTZ )
1850: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2d  {.      p->iJD -
1860: 3d 20 70 2d 3e 74 7a 2a 36 30 30 30 30 3b 0a 20  = p->tz*60000;. 
1870: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44       p->validYMD
1880: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76   = 0;.      p->v
1890: 61 6c 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20 20  alidHMS = 0;.   
18a0: 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20     p->validTZ = 
18b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
18c0: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 64 61 74 65  /*.** Parse date
18d0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
18e0: 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d  .**     YYYY-MM-
18f0: 44 44 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 0a  DD HH:MM:SS.FFF.
1900: 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44  **     YYYY-MM-D
1910: 44 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2a 20 20 20  D HH:MM:SS.**   
1920: 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a    YYYY-MM-DD HH:
1930: 4d 4d 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d  MM.**     YYYY-M
1940: 4d 2d 44 44 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  M-DD.**.** Write
1950: 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 74 6f   the result into
1960: 20 74 68 65 20 44 61 74 65 54 69 6d 65 20 73 74   the DateTime st
1970: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
1980: 72 6e 20 30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  rn 0.** on succe
1990: 73 73 20 61 6e 64 20 31 20 69 66 20 74 68 65 20  ss and 1 if the 
19a0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 69 73 20  input string is 
19b0: 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
19c0: 64 0a 2a 2a 20 64 61 74 65 2e 0a 2a 2f 0a 73 74  d.** date..*/.st
19d0: 61 74 69 63 20 69 6e 74 20 70 61 72 73 65 59 79  atic int parseYy
19e0: 79 79 4d 6d 44 64 28 63 6f 6e 73 74 20 63 68 61  yyMmDd(const cha
19f0: 72 20 2a 7a 44 61 74 65 2c 20 44 61 74 65 54 69  r *zDate, DateTi
1a00: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 59 2c  me *p){.  int Y,
1a10: 20 4d 2c 20 44 2c 20 6e 65 67 3b 0a 0a 20 20 69   M, D, neg;..  i
1a20: 66 28 20 7a 44 61 74 65 5b 30 5d 3d 3d 27 2d 27  f( zDate[0]=='-'
1a30: 20 29 7b 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b   ){.    zDate++;
1a40: 0a 20 20 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20  .    neg = 1;.  
1a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65 67 20 3d  }else{.    neg =
1a60: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65   0;.  }.  if( ge
1a70: 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c 34 2c  tDigits(zDate,4,
1a80: 30 2c 39 39 39 39 2c 27 2d 27 2c 26 59 2c 32 2c  0,9999,'-',&Y,2,
1a90: 31 2c 31 32 2c 27 2d 27 2c 26 4d 2c 32 2c 31 2c  1,12,'-',&M,2,1,
1aa0: 33 31 2c 30 2c 26 44 29 21 3d 33 20 29 7b 0a 20  31,0,&D)!=3 ){. 
1ab0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1ac0: 0a 20 20 7a 44 61 74 65 20 2b 3d 20 31 30 3b 0a  .  zDate += 10;.
1ad0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1ae0: 49 73 73 70 61 63 65 28 2a 7a 44 61 74 65 29 20  Isspace(*zDate) 
1af0: 7c 7c 20 27 54 27 3d 3d 2a 28 75 38 2a 29 7a 44  || 'T'==*(u8*)zD
1b00: 61 74 65 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20  ate ){ zDate++; 
1b10: 7d 0a 20 20 69 66 28 20 70 61 72 73 65 48 68 4d  }.  if( parseHhM
1b20: 6d 53 73 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30  mSs(zDate, p)==0
1b30: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 67 6f   ){.    /* We go
1b40: 74 20 74 68 65 20 74 69 6d 65 20 2a 2f 0a 20 20  t the time */.  
1b50: 7d 65 6c 73 65 20 69 66 28 20 2a 7a 44 61 74 65  }else if( *zDate
1b60: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 76 61  ==0 ){.    p->va
1b70: 6c 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20 7d 65  lidHMS = 0;.  }e
1b80: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1b90: 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69  1;.  }.  p->vali
1ba0: 64 4a 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61  dJD = 0;.  p->va
1bb0: 6c 69 64 59 4d 44 20 3d 20 31 3b 0a 20 20 70 2d  lidYMD = 1;.  p-
1bc0: 3e 59 20 3d 20 6e 65 67 20 3f 20 2d 59 20 3a 20  >Y = neg ? -Y : 
1bd0: 59 3b 0a 20 20 70 2d 3e 4d 20 3d 20 4d 3b 0a 20  Y;.  p->M = M;. 
1be0: 20 70 2d 3e 44 20 3d 20 44 3b 0a 20 20 69 66 28   p->D = D;.  if(
1bf0: 20 70 2d 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20   p->validTZ ){. 
1c00: 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b     computeJD(p);
1c10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1c30: 65 20 74 69 6d 65 20 74 6f 20 74 68 65 20 63 75  e time to the cu
1c40: 72 72 65 6e 74 20 74 69 6d 65 20 72 65 70 6f 72  rrent time repor
1c50: 74 65 64 20 62 79 20 74 68 65 20 56 46 53 2e 0a  ted by the VFS..
1c60: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1c70: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1c80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1c90: 20 73 65 74 44 61 74 65 54 69 6d 65 54 6f 43 75   setDateTimeToCu
1ca0: 72 72 65 6e 74 28 73 71 6c 69 74 65 33 5f 63 6f  rrent(sqlite3_co
1cb0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
1cc0: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
1cd0: 70 2d 3e 69 4a 44 20 3d 20 73 71 6c 69 74 65 33  p->iJD = sqlite3
1ce0: 53 74 6d 74 43 75 72 72 65 6e 74 54 69 6d 65 28  StmtCurrentTime(
1cf0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 66 28 20  context);.  if( 
1d00: 70 2d 3e 69 4a 44 3e 30 20 29 7b 0a 20 20 20 20  p->iJD>0 ){.    
1d10: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a  p->validJD = 1;.
1d20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d30: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
1d40: 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
1d50: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 70 61 72  * Attempt to par
1d60: 73 65 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  se the given str
1d70: 69 6e 67 20 69 6e 74 6f 20 61 20 4a 75 6c 69 61  ing into a Julia
1d80: 6e 20 44 61 79 20 4e 75 6d 62 65 72 2e 20 20 52  n Day Number.  R
1d90: 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
1da0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
1db0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1dc0: 6e 67 20 61 72 65 20 61 63 63 65 70 74 61 62 6c  ng are acceptabl
1dd0: 65 20 66 6f 72 6d 73 20 66 6f 72 20 74 68 65 20  e forms for the 
1de0: 69 6e 70 75 74 20 73 74 72 69 6e 67 3a 0a 2a 2a  input string:.**
1df0: 0a 2a 2a 20 20 20 20 20 20 59 59 59 59 2d 4d 4d  .**      YYYY-MM
1e00: 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46  -DD HH:MM:SS.FFF
1e10: 20 20 2b 2f 2d 48 48 3a 4d 4d 0a 2a 2a 20 20 20    +/-HH:MM.**   
1e20: 20 20 20 44 44 44 44 2e 44 44 20 0a 2a 2a 20 20     DDDD.DD .**  
1e30: 20 20 20 20 6e 6f 77 0a 2a 2a 0a 2a 2a 20 49 6e      now.**.** In
1e40: 20 74 68 65 20 66 69 72 73 74 20 66 6f 72 6d 2c   the first form,
1e50: 20 74 68 65 20 2b 2f 2d 48 48 3a 4d 4d 20 69 73   the +/-HH:MM is
1e60: 20 61 6c 77 61 79 73 20 6f 70 74 69 6f 6e 61 6c   always optional
1e70: 2e 20 20 54 68 65 20 66 72 61 63 74 69 6f 6e 61  .  The fractiona
1e80: 6c 0a 2a 2a 20 73 65 63 6f 6e 64 73 20 65 78 74  l.** seconds ext
1e90: 65 6e 73 69 6f 6e 20 28 74 68 65 20 22 2e 46 46  ension (the ".FF
1ea0: 46 22 29 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  F") is optional.
1eb0: 20 20 54 68 65 20 73 65 63 6f 6e 64 73 20 70 6f    The seconds po
1ec0: 72 74 69 6f 6e 0a 2a 2a 20 28 22 3a 53 53 2e 46  rtion.** (":SS.F
1ed0: 46 46 22 29 20 69 73 20 6f 70 74 69 6f 6e 2e 20  FF") is option. 
1ee0: 20 54 68 65 20 79 65 61 72 20 61 6e 64 20 64 61   The year and da
1ef0: 74 65 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  te can be omitte
1f00: 64 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  d as long.** as 
1f10: 74 68 65 72 65 20 69 73 20 61 20 74 69 6d 65 20  there is a time 
1f20: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 74 69 6d  string.  The tim
1f30: 65 20 73 74 72 69 6e 67 20 63 61 6e 20 62 65 20  e string can be 
1f40: 6f 6d 69 74 74 65 64 20 61 73 20 6c 6f 6e 67 0a  omitted as long.
1f50: 2a 2a 20 61 73 20 74 68 65 72 65 20 69 73 20 61  ** as there is a
1f60: 20 79 65 61 72 20 61 6e 64 20 64 61 74 65 2e 0a   year and date..
1f70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f80: 72 73 65 44 61 74 65 4f 72 54 69 6d 65 28 0a 20  rseDateOrTime(. 
1f90: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1fa0: 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f   *context, .  co
1fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c  nst char *zDate,
1fc0: 20 0a 20 20 44 61 74 65 54 69 6d 65 20 2a 70 0a   .  DateTime *p.
1fd0: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  ){.  double r;. 
1fe0: 20 69 66 28 20 70 61 72 73 65 59 79 79 79 4d 6d   if( parseYyyyMm
1ff0: 44 64 28 7a 44 61 74 65 2c 70 29 3d 3d 30 20 29  Dd(zDate,p)==0 )
2000: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2010: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 61 72 73    }else if( pars
2020: 65 48 68 4d 6d 53 73 28 7a 44 61 74 65 2c 20 70  eHhMmSs(zDate, p
2030: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
2040: 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rn 0;.  }else if
2050: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2060: 28 7a 44 61 74 65 2c 22 6e 6f 77 22 29 3d 3d 30  (zDate,"now")==0
2070: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 65  ){.    return se
2080: 74 44 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65  tDateTimeToCurre
2090: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 29 3b 0a  nt(context, p);.
20a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
20b0: 74 65 33 41 74 6f 46 28 7a 44 61 74 65 2c 20 26  te3AtoF(zDate, &
20c0: 72 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  r, sqlite3Strlen
20d0: 33 30 28 7a 44 61 74 65 29 2c 20 53 51 4c 49 54  30(zDate), SQLIT
20e0: 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20 70  E_UTF8) ){.    p
20f0: 2d 3e 69 4a 44 20 3d 20 28 73 71 6c 69 74 65 33  ->iJD = (sqlite3
2100: 5f 69 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30  _int64)(r*864000
2110: 30 30 2e 30 20 2b 20 30 2e 35 29 3b 0a 20 20 20  00.0 + 0.5);.   
2120: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b   p->validJD = 1;
2130: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2140: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
2150: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
2160: 74 68 65 20 59 65 61 72 2c 20 4d 6f 6e 74 68 2c  the Year, Month,
2170: 20 61 6e 64 20 44 61 79 20 66 72 6f 6d 20 74 68   and Day from th
2180: 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d  e julian day num
2190: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
21a0: 6f 69 64 20 63 6f 6d 70 75 74 65 59 4d 44 28 44  oid computeYMD(D
21b0: 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69  ateTime *p){.  i
21c0: 6e 74 20 5a 2c 20 41 2c 20 42 2c 20 43 2c 20 44  nt Z, A, B, C, D
21d0: 2c 20 45 2c 20 58 31 3b 0a 20 20 69 66 28 20 70  , E, X1;.  if( p
21e0: 2d 3e 76 61 6c 69 64 59 4d 44 20 29 20 72 65 74  ->validYMD ) ret
21f0: 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 76  urn;.  if( !p->v
2200: 61 6c 69 64 4a 44 20 29 7b 0a 20 20 20 20 70 2d  alidJD ){.    p-
2210: 3e 59 20 3d 20 32 30 30 30 3b 0a 20 20 20 20 70  >Y = 2000;.    p
2220: 2d 3e 4d 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e  ->M = 1;.    p->
2230: 44 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  D = 1;.  }else{.
2240: 20 20 20 20 5a 20 3d 20 28 69 6e 74 29 28 28 70      Z = (int)((p
2250: 2d 3e 69 4a 44 20 2b 20 34 33 32 30 30 30 30 30  ->iJD + 43200000
2260: 29 2f 38 36 34 30 30 30 30 30 29 3b 0a 20 20 20  )/86400000);.   
2270: 20 41 20 3d 20 28 69 6e 74 29 28 28 5a 20 2d 20   A = (int)((Z - 
2280: 31 38 36 37 32 31 36 2e 32 35 29 2f 33 36 35 32  1867216.25)/3652
2290: 34 2e 32 35 29 3b 0a 20 20 20 20 41 20 3d 20 5a  4.25);.    A = Z
22a0: 20 2b 20 31 20 2b 20 41 20 2d 20 28 41 2f 34 29   + 1 + A - (A/4)
22b0: 3b 0a 20 20 20 20 42 20 3d 20 41 20 2b 20 31 35  ;.    B = A + 15
22c0: 32 34 3b 0a 20 20 20 20 43 20 3d 20 28 69 6e 74  24;.    C = (int
22d0: 29 28 28 42 20 2d 20 31 32 32 2e 31 29 2f 33 36  )((B - 122.1)/36
22e0: 35 2e 32 35 29 3b 0a 20 20 20 20 44 20 3d 20 28  5.25);.    D = (
22f0: 33 36 35 32 35 2a 43 29 2f 31 30 30 3b 0a 20 20  36525*C)/100;.  
2300: 20 20 45 20 3d 20 28 69 6e 74 29 28 28 42 2d 44    E = (int)((B-D
2310: 29 2f 33 30 2e 36 30 30 31 29 3b 0a 20 20 20 20  )/30.6001);.    
2320: 58 31 20 3d 20 28 69 6e 74 29 28 33 30 2e 36 30  X1 = (int)(30.60
2330: 30 31 2a 45 29 3b 0a 20 20 20 20 70 2d 3e 44 20  01*E);.    p->D 
2340: 3d 20 42 20 2d 20 44 20 2d 20 58 31 3b 0a 20 20  = B - D - X1;.  
2350: 20 20 70 2d 3e 4d 20 3d 20 45 3c 31 34 20 3f 20    p->M = E<14 ? 
2360: 45 2d 31 20 3a 20 45 2d 31 33 3b 0a 20 20 20 20  E-1 : E-13;.    
2370: 70 2d 3e 59 20 3d 20 70 2d 3e 4d 3e 32 20 3f 20  p->Y = p->M>2 ? 
2380: 43 20 2d 20 34 37 31 36 20 3a 20 43 20 2d 20 34  C - 4716 : C - 4
2390: 37 31 35 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61  715;.  }.  p->va
23a0: 6c 69 64 59 4d 44 20 3d 20 31 3b 0a 7d 0a 0a 2f  lidYMD = 1;.}../
23b0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
23c0: 20 48 6f 75 72 2c 20 4d 69 6e 75 74 65 2c 20 61   Hour, Minute, a
23d0: 6e 64 20 53 65 63 6f 6e 64 73 20 66 72 6f 6d 20  nd Seconds from 
23e0: 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e  the julian day n
23f0: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
2400: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 48 4d 53   void computeHMS
2410: 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20  (DateTime *p){. 
2420: 20 69 6e 74 20 73 3b 0a 20 20 69 66 28 20 70 2d   int s;.  if( p-
2430: 3e 76 61 6c 69 64 48 4d 53 20 29 20 72 65 74 75  >validHMS ) retu
2440: 72 6e 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28  rn;.  computeJD(
2450: 70 29 3b 0a 20 20 73 20 3d 20 28 69 6e 74 29 28  p);.  s = (int)(
2460: 28 70 2d 3e 69 4a 44 20 2b 20 34 33 32 30 30 30  (p->iJD + 432000
2470: 30 30 29 20 25 20 38 36 34 30 30 30 30 30 29 3b  00) % 86400000);
2480: 0a 20 20 70 2d 3e 73 20 3d 20 73 2f 31 30 30 30  .  p->s = s/1000
2490: 2e 30 3b 0a 20 20 73 20 3d 20 28 69 6e 74 29 70  .0;.  s = (int)p
24a0: 2d 3e 73 3b 0a 20 20 70 2d 3e 73 20 2d 3d 20 73  ->s;.  p->s -= s
24b0: 3b 0a 20 20 70 2d 3e 68 20 3d 20 73 2f 33 36 30  ;.  p->h = s/360
24c0: 30 3b 0a 20 20 73 20 2d 3d 20 70 2d 3e 68 2a 33  0;.  s -= p->h*3
24d0: 36 30 30 3b 0a 20 20 70 2d 3e 6d 20 3d 20 73 2f  600;.  p->m = s/
24e0: 36 30 3b 0a 20 20 70 2d 3e 73 20 2b 3d 20 73 20  60;.  p->s += s 
24f0: 2d 20 70 2d 3e 6d 2a 36 30 3b 0a 20 20 70 2d 3e  - p->m*60;.  p->
2500: 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 7d 0a  validHMS = 1;.}.
2510: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 62  ./*.** Compute b
2520: 6f 74 68 20 59 4d 44 20 61 6e 64 20 48 4d 53 0a  oth YMD and HMS.
2530: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2540: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 44 61  omputeYMD_HMS(Da
2550: 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 63 6f  teTime *p){.  co
2560: 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a 20 20 63  mputeYMD(p);.  c
2570: 6f 6d 70 75 74 65 48 4d 53 28 70 29 3b 0a 7d 0a  omputeHMS(p);.}.
2580: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
2590: 20 59 4d 44 20 61 6e 64 20 48 4d 53 20 61 6e 64   YMD and HMS and
25a0: 20 74 68 65 20 54 5a 0a 2a 2f 0a 73 74 61 74 69   the TZ.*/.stati
25b0: 63 20 76 6f 69 64 20 63 6c 65 61 72 59 4d 44 5f  c void clearYMD_
25c0: 48 4d 53 5f 54 5a 28 44 61 74 65 54 69 6d 65 20  HMS_TZ(DateTime 
25d0: 2a 70 29 7b 0a 20 20 70 2d 3e 76 61 6c 69 64 59  *p){.  p->validY
25e0: 4d 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c  MD = 0;.  p->val
25f0: 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20 70 2d 3e  idHMS = 0;.  p->
2600: 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 7d 0a 0a  validTZ = 0;.}..
2610: 2f 2a 0a 2a 2a 20 4f 6e 20 72 65 63 65 6e 74 20  /*.** On recent 
2620: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
2630: 73 2c 20 74 68 65 20 6c 6f 63 61 6c 74 69 6d 65  s, the localtime
2640: 5f 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  _s() function is
2650: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
2660: 20 70 61 72 74 20 6f 66 20 74 68 65 20 22 53 65   part of the "Se
2670: 63 75 72 65 20 43 52 54 22 2e 20 49 74 20 69 73  cure CRT". It is
2680: 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 65 71 75   essentially equ
2690: 69 76 61 6c 65 6e 74 20 74 6f 20 0a 2a 2a 20 6c  ivalent to .** l
26a0: 6f 63 61 6c 74 69 6d 65 5f 72 28 29 20 61 76 61  ocaltime_r() ava
26b0: 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 6d 6f 73  ilable under mos
26c0: 74 20 50 4f 53 49 58 20 70 6c 61 74 66 6f 72 6d  t POSIX platform
26d0: 73 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  s, except that t
26e0: 68 65 20 0a 2a 2a 20 6f 72 64 65 72 20 6f 66 20  he .** order of 
26f0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 69  the parameters i
2700: 73 20 72 65 76 65 72 73 65 64 2e 0a 2a 2a 0a 2a  s reversed..**.*
2710: 2a 20 53 65 65 20 68 74 74 70 3a 2f 2f 6d 73 64  * See http://msd
2720: 6e 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  n.microsoft.com/
2730: 65 6e 2d 75 73 2f 6c 69 62 72 61 72 79 2f 61 34  en-us/library/a4
2740: 34 32 78 33 79 65 28 56 53 2e 38 30 29 2e 61 73  42x3ye(VS.80).as
2750: 70 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  px..**.** If the
2760: 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 69 6e   user has not in
2770: 64 69 63 61 74 65 64 20 74 6f 20 75 73 65 20 6c  dicated to use l
2780: 6f 63 61 6c 74 69 6d 65 5f 72 28 29 20 6f 72 20  ocaltime_r() or 
2790: 6c 6f 63 61 6c 74 69 6d 65 5f 73 28 29 0a 2a 2a  localtime_s().**
27a0: 20 61 6c 72 65 61 64 79 2c 20 63 68 65 63 6b 20   already, check 
27b0: 66 6f 72 20 61 6e 20 4d 53 56 43 20 62 75 69 6c  for an MSVC buil
27c0: 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 74 68  d environment th
27d0: 61 74 20 70 72 6f 76 69 64 65 73 20 0a 2a 2a 20  at provides .** 
27e0: 6c 6f 63 61 6c 74 69 6d 65 5f 73 28 29 2e 0a 2a  localtime_s()..*
27f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 48  /.#if !defined(H
2800: 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 29  AVE_LOCALTIME_R)
2810: 20 26 26 20 21 64 65 66 69 6e 65 64 28 48 41 56   && !defined(HAV
2820: 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 53 29 20 26  E_LOCALTIME_S) &
2830: 26 20 5c 0a 20 20 20 20 20 64 65 66 69 6e 65 64  & \.     defined
2840: 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 64 65  (_MSC_VER) && de
2850: 66 69 6e 65 64 28 5f 43 52 54 5f 49 4e 53 45 43  fined(_CRT_INSEC
2860: 55 52 45 5f 44 45 50 52 45 43 41 54 45 29 0a 23  URE_DEPRECATE).#
2870: 64 65 66 69 6e 65 20 48 41 56 45 5f 4c 4f 43 41  define HAVE_LOCA
2880: 4c 54 49 4d 45 5f 53 20 31 0a 23 65 6e 64 69 66  LTIME_S 1.#endif
2890: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28a0: 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 0a  _OMIT_LOCALTIME.
28b0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
28c0: 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  ing routine impl
28d0: 65 6d 65 6e 74 73 20 74 68 65 20 72 6f 75 67 68  ements the rough
28e0: 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 6c   equivalent of l
28f0: 6f 63 61 6c 74 69 6d 65 5f 72 28 29 0a 2a 2a 20  ocaltime_r().** 
2900: 75 73 69 6e 67 20 77 68 61 74 65 76 65 72 20 6f  using whatever o
2910: 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
2920: 73 70 65 63 69 66 69 63 20 6c 6f 63 61 6c 74 69  specific localti
2930: 6d 65 20 66 61 63 69 6c 69 74 79 20 74 68 61 74  me facility that
2940: 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
2950: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2960: 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  returns 0 on suc
2970: 63 65 73 73 20 61 6e 64 0a 2a 2a 20 6e 6f 6e 2d  cess and.** non-
2980: 7a 65 72 6f 20 6f 6e 20 61 6e 79 20 6b 69 6e 64  zero on any kind
2990: 20 6f 66 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   of error..**.**
29a0: 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 33 47   If the sqlite3G
29b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63  lobalConfig.bLoc
29c0: 61 6c 74 69 6d 65 46 61 75 6c 74 20 76 61 72 69  altimeFault vari
29d0: 61 62 6c 65 20 69 73 20 74 72 75 65 20 74 68 65  able is true the
29e0: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
29f0: 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  e will always fa
2a00: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e  il..**.** EVIDEN
2a10: 43 45 2d 4f 46 3a 20 52 2d 36 32 31 37 32 2d 30  CE-OF: R-62172-0
2a20: 30 30 33 36 20 49 6e 20 74 68 69 73 20 69 6d 70  0036 In this imp
2a30: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
2a40: 20 73 74 61 6e 64 61 72 64 20 43 0a 2a 2a 20 6c   standard C.** l
2a50: 69 62 72 61 72 79 20 66 75 6e 63 74 69 6f 6e 20  ibrary function 
2a60: 6c 6f 63 61 6c 74 69 6d 65 5f 72 28 29 20 69 73  localtime_r() is
2a70: 20 75 73 65 64 20 74 6f 20 61 73 73 69 73 74 20   used to assist 
2a80: 69 6e 20 74 68 65 20 63 61 6c 63 75 6c 61 74 69  in the calculati
2a90: 6f 6e 20 6f 66 0a 2a 2a 20 6c 6f 63 61 6c 20 74  on of.** local t
2aa0: 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ime..*/.static i
2ab0: 6e 74 20 6f 73 4c 6f 63 61 6c 74 69 6d 65 28 74  nt osLocaltime(t
2ac0: 69 6d 65 5f 74 20 2a 74 2c 20 73 74 72 75 63 74  ime_t *t, struct
2ad0: 20 74 6d 20 2a 70 54 6d 29 7b 0a 20 20 69 6e 74   tm *pTm){.  int
2ae0: 20 72 63 3b 0a 23 69 66 20 28 21 64 65 66 69 6e   rc;.#if (!defin
2af0: 65 64 28 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d  ed(HAVE_LOCALTIM
2b00: 45 5f 52 29 20 7c 7c 20 21 48 41 56 45 5f 4c 4f  E_R) || !HAVE_LO
2b10: 43 41 4c 54 49 4d 45 5f 52 29 20 5c 0a 20 20 20  CALTIME_R) \.   
2b20: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
2b30: 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 53  HAVE_LOCALTIME_S
2b40: 29 20 7c 7c 20 21 48 41 56 45 5f 4c 4f 43 41 4c  ) || !HAVE_LOCAL
2b50: 54 49 4d 45 5f 53 29 0a 20 20 73 74 72 75 63 74  TIME_S).  struct
2b60: 20 74 6d 20 2a 70 58 3b 0a 23 69 66 20 53 51 4c   tm *pX;.#if SQL
2b70: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
2b80: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2b90: 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65   *mutex = sqlite
2ba0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
2bb0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
2bc0: 4d 41 53 54 45 52 29 3b 0a 23 65 6e 64 69 66 0a  MASTER);.#endif.
2bd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2be0: 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20  enter(mutex);.  
2bf0: 70 58 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 74  pX = localtime(t
2c00: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2c10: 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54  E_OMIT_BUILTIN_T
2c20: 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
2c30: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
2c40: 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 29 20  ocaltimeFault ) 
2c50: 70 58 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  pX = 0;.#endif. 
2c60: 20 69 66 28 20 70 58 20 29 20 2a 70 54 6d 20 3d   if( pX ) *pTm =
2c70: 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
2c80: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
2c90: 78 29 3b 0a 20 20 72 63 20 3d 20 70 58 3d 3d 30  x);.  rc = pX==0
2ca0: 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66 20  ;.#else.#ifndef 
2cb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
2cc0: 54 49 4e 5f 54 45 53 54 0a 20 20 69 66 28 20 73  TIN_TEST.  if( s
2cd0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ce0: 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75  ig.bLocaltimeFau
2cf0: 6c 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23  lt ) return 1;.#
2d00: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
2d10: 64 28 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45  d(HAVE_LOCALTIME
2d20: 5f 52 29 20 26 26 20 48 41 56 45 5f 4c 4f 43 41  _R) && HAVE_LOCA
2d30: 4c 54 49 4d 45 5f 52 0a 20 20 72 63 20 3d 20 6c  LTIME_R.  rc = l
2d40: 6f 63 61 6c 74 69 6d 65 5f 72 28 74 2c 20 70 54  ocaltime_r(t, pT
2d50: 6d 29 3d 3d 30 3b 0a 23 65 6c 73 65 0a 20 20 72  m)==0;.#else.  r
2d60: 63 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 5f 73 28  c = localtime_s(
2d70: 70 54 6d 2c 20 74 29 3b 0a 23 65 6e 64 69 66 20  pTm, t);.#endif 
2d80: 2f 2a 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d  /* HAVE_LOCALTIM
2d90: 45 5f 52 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  E_R */.#endif /*
2da0: 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f   HAVE_LOCALTIME_
2db0: 52 20 7c 7c 20 48 41 56 45 5f 4c 4f 43 41 4c 54  R || HAVE_LOCALT
2dc0: 49 4d 45 5f 53 20 2a 2f 0a 20 20 72 65 74 75 72  IME_S */.  retur
2dd0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2de0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
2df0: 43 41 4c 54 49 4d 45 20 2a 2f 0a 0a 0a 23 69 66  CALTIME */...#if
2e00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e10: 5f 4c 4f 43 41 4c 54 49 4d 45 0a 2f 2a 0a 2a 2a  _LOCALTIME./*.**
2e20: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 64 69 66   Compute the dif
2e30: 66 65 72 65 6e 63 65 20 28 69 6e 20 6d 69 6c 6c  ference (in mill
2e40: 69 73 65 63 6f 6e 64 73 29 20 62 65 74 77 65 65  iseconds) betwee
2e50: 6e 20 6c 6f 63 61 6c 74 69 6d 65 20 61 6e 64 20  n localtime and 
2e60: 55 54 43 0a 2a 2a 20 28 61 2e 6b 2e 61 2e 20 47  UTC.** (a.k.a. G
2e70: 4d 54 29 20 66 6f 72 20 74 68 65 20 74 69 6d 65  MT) for the time
2e80: 20 76 61 6c 75 65 20 70 20 77 68 65 72 65 20 70   value p where p
2e90: 20 69 73 20 69 6e 20 55 54 43 2e 20 49 66 20 6e   is in UTC. If n
2ea0: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  o error occurs,.
2eb0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 69 73 20 76  ** return this v
2ec0: 61 6c 75 65 20 61 6e 64 20 73 65 74 20 2a 70 52  alue and set *pR
2ed0: 63 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  c to SQLITE_OK. 
2ee0: 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e  .**.** Or, if an
2ef0: 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
2f00: 72 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20 53  r, set *pRc to S
2f10: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 54 68 65  QLITE_ERROR. The
2f20: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 0a   returned value.
2f30: 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  ** is undefined 
2f40: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2f50: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
2f60: 69 6e 74 36 34 20 6c 6f 63 61 6c 74 69 6d 65 4f  int64 localtimeO
2f70: 66 66 73 65 74 28 0a 20 20 44 61 74 65 54 69 6d  ffset(.  DateTim
2f80: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
2f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 65           /* Date
2fa0: 20 61 74 20 77 68 69 63 68 20 74 6f 20 63 61 6c   at which to cal
2fb0: 63 75 6c 61 74 65 20 6f 66 66 73 65 74 20 2a 2f  culate offset */
2fc0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2fd0: 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
2fe0: 20 20 20 2f 2a 20 57 72 69 74 65 20 65 72 72 6f     /* Write erro
2ff0: 72 20 68 65 72 65 20 69 66 20 6f 6e 65 20 6f 63  r here if one oc
3000: 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  curs */.  int *p
3010: 52 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc              
3020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3030: 3a 20 45 72 72 6f 72 20 63 6f 64 65 2e 20 53 51  : Error code. SQ
3040: 4c 49 54 45 5f 4f 4b 20 6f 72 20 45 52 52 4f 52  LITE_OK or ERROR
3050: 20 2a 2f 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d   */.){.  DateTim
3060: 65 20 78 2c 20 79 3b 0a 20 20 74 69 6d 65 5f 74  e x, y;.  time_t
3070: 20 74 3b 0a 20 20 73 74 72 75 63 74 20 74 6d 20   t;.  struct tm 
3080: 73 4c 6f 63 61 6c 3b 0a 0a 20 20 2f 2a 20 49 6e  sLocal;..  /* In
3090: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  itialize the con
30a0: 74 65 6e 74 73 20 6f 66 20 73 4c 6f 63 61 6c 20  tents of sLocal 
30b0: 74 6f 20 61 76 6f 69 64 20 61 20 63 6f 6d 70 69  to avoid a compi
30c0: 6c 65 72 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a  ler warning. */.
30d0: 20 20 6d 65 6d 73 65 74 28 26 73 4c 6f 63 61 6c    memset(&sLocal
30e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4c 6f 63  , 0, sizeof(sLoc
30f0: 61 6c 29 29 3b 0a 0a 20 20 78 20 3d 20 2a 70 3b  al));..  x = *p;
3100: 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d  .  computeYMD_HM
3110: 53 28 26 78 29 3b 0a 20 20 69 66 28 20 78 2e 59  S(&x);.  if( x.Y
3120: 3c 31 39 37 31 20 7c 7c 20 78 2e 59 3e 3d 32 30  <1971 || x.Y>=20
3130: 33 38 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  38 ){.    /* EVI
3140: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 32 36  DENCE-OF: R-5526
3150: 39 2d 32 39 35 39 38 20 54 68 65 20 6c 6f 63 61  9-29598 The loca
3160: 6c 74 69 6d 65 5f 72 28 29 20 43 20 66 75 6e 63  ltime_r() C func
3170: 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 6f 6e  tion normally on
3180: 6c 79 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20  ly.    ** works 
3190: 66 6f 72 20 79 65 61 72 73 20 62 65 74 77 65 65  for years betwee
31a0: 6e 20 31 39 37 30 20 61 6e 64 20 32 30 33 37 2e  n 1970 and 2037.
31b0: 20 46 6f 72 20 64 61 74 65 73 20 6f 75 74 73 69   For dates outsi
31c0: 64 65 20 74 68 69 73 20 72 61 6e 67 65 2c 0a 20  de this range,. 
31d0: 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 61 74 74     ** SQLite att
31e0: 65 6d 70 74 73 20 74 6f 20 6d 61 70 20 74 68 65  empts to map the
31f0: 20 79 65 61 72 20 69 6e 74 6f 20 61 6e 20 65 71   year into an eq
3200: 75 69 76 61 6c 65 6e 74 20 79 65 61 72 20 77 69  uivalent year wi
3210: 74 68 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  thin this.    **
3220: 20 72 61 6e 67 65 2c 20 64 6f 20 74 68 65 20 63   range, do the c
3230: 61 6c 63 75 6c 61 74 69 6f 6e 2c 20 74 68 65 6e  alculation, then
3240: 20 6d 61 70 20 74 68 65 20 79 65 61 72 20 62 61   map the year ba
3250: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 78  ck..    */.    x
3260: 2e 59 20 3d 20 32 30 30 30 3b 0a 20 20 20 20 78  .Y = 2000;.    x
3270: 2e 4d 20 3d 20 31 3b 0a 20 20 20 20 78 2e 44 20  .M = 1;.    x.D 
3280: 3d 20 31 3b 0a 20 20 20 20 78 2e 68 20 3d 20 30  = 1;.    x.h = 0
3290: 3b 0a 20 20 20 20 78 2e 6d 20 3d 20 30 3b 0a 20  ;.    x.m = 0;. 
32a0: 20 20 20 78 2e 73 20 3d 20 30 2e 30 3b 0a 20 20     x.s = 0.0;.  
32b0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 6e 74  } else {.    int
32c0: 20 73 20 3d 20 28 69 6e 74 29 28 78 2e 73 20 2b   s = (int)(x.s +
32d0: 20 30 2e 35 29 3b 0a 20 20 20 20 78 2e 73 20 3d   0.5);.    x.s =
32e0: 20 73 3b 0a 20 20 7d 0a 20 20 78 2e 74 7a 20 3d   s;.  }.  x.tz =
32f0: 20 30 3b 0a 20 20 78 2e 76 61 6c 69 64 4a 44 20   0;.  x.validJD 
3300: 3d 20 30 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44  = 0;.  computeJD
3310: 28 26 78 29 3b 0a 20 20 74 20 3d 20 28 74 69 6d  (&x);.  t = (tim
3320: 65 5f 74 29 28 78 2e 69 4a 44 2f 31 30 30 30 20  e_t)(x.iJD/1000 
3330: 2d 20 32 31 30 38 36 36 37 36 2a 28 69 36 34 29  - 21086676*(i64)
3340: 31 30 30 30 30 29 3b 0a 20 20 69 66 28 20 6f 73  10000);.  if( os
3350: 4c 6f 63 61 6c 74 69 6d 65 28 26 74 2c 20 26 73  Localtime(&t, &s
3360: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 73 71  Local) ){.    sq
3370: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
3380: 6f 72 28 70 43 74 78 2c 20 22 6c 6f 63 61 6c 20  or(pCtx, "local 
3390: 74 69 6d 65 20 75 6e 61 76 61 69 6c 61 62 6c 65  time unavailable
33a0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 2a 70 52 63  ", -1);.    *pRc
33b0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
33c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
33d0: 20 7d 0a 20 20 79 2e 59 20 3d 20 73 4c 6f 63 61   }.  y.Y = sLoca
33e0: 6c 2e 74 6d 5f 79 65 61 72 20 2b 20 31 39 30 30  l.tm_year + 1900
33f0: 3b 0a 20 20 79 2e 4d 20 3d 20 73 4c 6f 63 61 6c  ;.  y.M = sLocal
3400: 2e 74 6d 5f 6d 6f 6e 20 2b 20 31 3b 0a 20 20 79  .tm_mon + 1;.  y
3410: 2e 44 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d  .D = sLocal.tm_m
3420: 64 61 79 3b 0a 20 20 79 2e 68 20 3d 20 73 4c 6f  day;.  y.h = sLo
3430: 63 61 6c 2e 74 6d 5f 68 6f 75 72 3b 0a 20 20 79  cal.tm_hour;.  y
3440: 2e 6d 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d  .m = sLocal.tm_m
3450: 69 6e 3b 0a 20 20 79 2e 73 20 3d 20 73 4c 6f 63  in;.  y.s = sLoc
3460: 61 6c 2e 74 6d 5f 73 65 63 3b 0a 20 20 79 2e 76  al.tm_sec;.  y.v
3470: 61 6c 69 64 59 4d 44 20 3d 20 31 3b 0a 20 20 79  alidYMD = 1;.  y
3480: 2e 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 20  .validHMS = 1;. 
3490: 20 79 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a   y.validJD = 0;.
34a0: 20 20 79 2e 76 61 6c 69 64 54 5a 20 3d 20 30 3b    y.validTZ = 0;
34b0: 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 79 29  .  computeJD(&y)
34c0: 3b 0a 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54  ;.  *pRc = SQLIT
34d0: 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 79  E_OK;.  return y
34e0: 2e 69 4a 44 20 2d 20 78 2e 69 4a 44 3b 0a 7d 0a  .iJD - x.iJD;.}.
34f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3500: 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 20  _OMIT_LOCALTIME 
3510: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  */../*.** Proces
3520: 73 20 61 20 6d 6f 64 69 66 69 65 72 20 74 6f 20  s a modifier to 
3530: 61 20 64 61 74 65 2d 74 69 6d 65 20 73 74 61 6d  a date-time stam
3540: 70 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 72  p.  The modifier
3550: 73 20 61 72 65 0a 2a 2a 20 61 73 20 66 6f 6c 6c  s are.** as foll
3560: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4e  ows:.**.**     N
3570: 4e 4e 20 64 61 79 73 0a 2a 2a 20 20 20 20 20 4e  NN days.**     N
3580: 4e 4e 20 68 6f 75 72 73 0a 2a 2a 20 20 20 20 20  NN hours.**     
3590: 4e 4e 4e 20 6d 69 6e 75 74 65 73 0a 2a 2a 20 20  NNN minutes.**  
35a0: 20 20 20 4e 4e 4e 2e 4e 4e 4e 4e 20 73 65 63 6f     NNN.NNNN seco
35b0: 6e 64 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 6d  nds.**     NNN m
35c0: 6f 6e 74 68 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e  onths.**     NNN
35d0: 20 79 65 61 72 73 0a 2a 2a 20 20 20 20 20 73 74   years.**     st
35e0: 61 72 74 20 6f 66 20 6d 6f 6e 74 68 0a 2a 2a 20  art of month.** 
35f0: 20 20 20 20 73 74 61 72 74 20 6f 66 20 79 65 61      start of yea
3600: 72 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20 6f  r.**     start o
3610: 66 20 77 65 65 6b 0a 2a 2a 20 20 20 20 20 73 74  f week.**     st
3620: 61 72 74 20 6f 66 20 64 61 79 0a 2a 2a 20 20 20  art of day.**   
3630: 20 20 77 65 65 6b 64 61 79 20 4e 0a 2a 2a 20 20    weekday N.**  
3640: 20 20 20 75 6e 69 78 65 70 6f 63 68 0a 2a 2a 20     unixepoch.** 
3650: 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65 0a 2a 2a      localtime.**
3660: 20 20 20 20 20 75 74 63 0a 2a 2a 0a 2a 2a 20 52       utc.**.** R
3670: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
3680: 73 73 20 61 6e 64 20 31 20 69 66 20 74 68 65 72  ss and 1 if ther
3690: 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
36a0: 20 65 72 72 6f 72 2e 20 49 66 20 74 68 65 20 65   error. If the e
36b0: 72 72 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 61 20  rror.** is in a 
36c0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 28 69 2e 65  system call (i.e
36d0: 2e 20 6c 6f 63 61 6c 74 69 6d 65 28 29 29 2c 20  . localtime()), 
36e0: 74 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6d 65  then an error me
36f0: 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
3700: 0a 2a 2a 20 74 6f 20 63 6f 6e 74 65 78 74 20 70  .** to context p
3710: 43 74 78 2e 20 49 66 20 74 68 65 20 65 72 72 6f  Ctx. If the erro
3720: 72 20 69 73 20 61 6e 20 75 6e 72 65 63 6f 67 6e  r is an unrecogn
3730: 69 7a 65 64 20 6d 6f 64 69 66 69 65 72 2c 20 6e  ized modifier, n
3740: 6f 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 77 72  o error is.** wr
3750: 69 74 74 65 6e 20 74 6f 20 70 43 74 78 2e 0a 2a  itten to pCtx..*
3760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72  /.static int par
3770: 73 65 4d 6f 64 69 66 69 65 72 28 73 71 6c 69 74  seModifier(sqlit
3780: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
3790: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
37a0: 6f 64 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29  od, DateTime *p)
37b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a  {.  int rc = 1;.
37c0: 20 20 69 6e 74 20 6e 3b 0a 20 20 64 6f 75 62 6c    int n;.  doubl
37d0: 65 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 2c 20  e r;.  char *z, 
37e0: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 7a 20 3d 20  zBuf[30];.  z = 
37f0: 7a 42 75 66 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  zBuf;.  for(n=0;
3800: 20 6e 3c 41 72 72 61 79 53 69 7a 65 28 7a 42 75   n<ArraySize(zBu
3810: 66 29 2d 31 20 26 26 20 7a 4d 6f 64 5b 6e 5d 3b  f)-1 && zMod[n];
3820: 20 6e 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 5d 20   n++){.    z[n] 
3830: 3d 20 28 63 68 61 72 29 73 71 6c 69 74 65 33 55  = (char)sqlite3U
3840: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 75 38 29  pperToLower[(u8)
3850: 7a 4d 6f 64 5b 6e 5d 5d 3b 0a 20 20 7d 0a 20 20  zMod[n]];.  }.  
3860: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73 77 69 74  z[n] = 0;.  swit
3870: 63 68 28 20 7a 5b 30 5d 20 29 7b 0a 23 69 66 6e  ch( z[0] ){.#ifn
3880: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3890: 4c 4f 43 41 4c 54 49 4d 45 0a 20 20 20 20 63 61  LOCALTIME.    ca
38a0: 73 65 20 27 6c 27 3a 20 7b 0a 20 20 20 20 20 20  se 'l': {.      
38b0: 2f 2a 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65 0a  /*    localtime.
38c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
38d0: 2a 20 41 73 73 75 6d 69 6e 67 20 74 68 65 20 63  * Assuming the c
38e0: 75 72 72 65 6e 74 20 74 69 6d 65 20 76 61 6c 75  urrent time valu
38f0: 65 20 69 73 20 55 54 43 20 28 61 2e 6b 2e 61 2e  e is UTC (a.k.a.
3900: 20 47 4d 54 29 2c 20 73 68 69 66 74 20 69 74 20   GMT), shift it 
3910: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 77  to.      ** show
3920: 20 6c 6f 63 61 6c 20 74 69 6d 65 2e 0a 20 20 20   local time..   
3930: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
3940: 73 74 72 63 6d 70 28 7a 2c 20 22 6c 6f 63 61 6c  strcmp(z, "local
3950: 74 69 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  time")==0 ){.   
3960: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
3970: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a  );.        p->iJ
3980: 44 20 2b 3d 20 6c 6f 63 61 6c 74 69 6d 65 4f 66  D += localtimeOf
3990: 66 73 65 74 28 70 2c 20 70 43 74 78 2c 20 26 72  fset(p, pCtx, &r
39a0: 63 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61  c);.        clea
39b0: 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a  rYMD_HMS_TZ(p);.
39c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
39d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
39e0: 66 0a 20 20 20 20 63 61 73 65 20 27 75 27 3a 20  f.    case 'u': 
39f0: 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20  {.      /*.     
3a00: 20 2a 2a 20 20 20 20 75 6e 69 78 65 70 6f 63 68   **    unixepoch
3a10: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
3a20: 2a 2a 20 54 72 65 61 74 20 74 68 65 20 63 75 72  ** Treat the cur
3a30: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 2d  rent value of p-
3a40: 3e 69 4a 44 20 61 73 20 74 68 65 20 6e 75 6d 62  >iJD as the numb
3a50: 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 73  er of.      ** s
3a60: 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
3a70: 30 2e 20 20 43 6f 6e 76 65 72 74 20 74 6f 20 61  0.  Convert to a
3a80: 20 72 65 61 6c 20 6a 75 6c 69 61 6e 20 64 61 79   real julian day
3a90: 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a   number..      *
3aa0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  /.      if( strc
3ab0: 6d 70 28 7a 2c 20 22 75 6e 69 78 65 70 6f 63 68  mp(z, "unixepoch
3ac0: 22 29 3d 3d 30 20 26 26 20 70 2d 3e 76 61 6c 69  ")==0 && p->vali
3ad0: 64 4a 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dJD ){.        p
3ae0: 2d 3e 69 4a 44 20 3d 20 28 70 2d 3e 69 4a 44 20  ->iJD = (p->iJD 
3af0: 2b 20 34 33 32 30 30 29 2f 38 36 34 30 30 20 2b  + 43200)/86400 +
3b00: 20 32 31 30 38 36 36 37 36 2a 28 69 36 34 29 31   21086676*(i64)1
3b10: 30 30 30 30 30 30 30 3b 0a 20 20 20 20 20 20 20  0000000;.       
3b20: 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a   clearYMD_HMS_TZ
3b30: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (p);.        rc 
3b40: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  = 0;.      }.#if
3b50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3b60: 5f 4c 4f 43 41 4c 54 49 4d 45 0a 20 20 20 20 20  _LOCALTIME.     
3b70: 20 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70   else if( strcmp
3b80: 28 7a 2c 20 22 75 74 63 22 29 3d 3d 30 20 29 7b  (z, "utc")==0 ){
3b90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3ba0: 5f 69 6e 74 36 34 20 63 31 3b 0a 20 20 20 20 20  _int64 c1;.     
3bb0: 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b     computeJD(p);
3bc0: 0a 20 20 20 20 20 20 20 20 63 31 20 3d 20 6c 6f  .        c1 = lo
3bd0: 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 2c  caltimeOffset(p,
3be0: 20 70 43 74 78 2c 20 26 72 63 29 3b 0a 20 20 20   pCtx, &rc);.   
3bf0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
3c00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
3c10: 20 20 20 20 70 2d 3e 69 4a 44 20 2d 3d 20 63 31      p->iJD -= c1
3c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 65 61  ;.          clea
3c30: 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a  rYMD_HMS_TZ(p);.
3c40: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44            p->iJD
3c50: 20 2b 3d 20 63 31 20 2d 20 6c 6f 63 61 6c 74 69   += c1 - localti
3c60: 6d 65 4f 66 66 73 65 74 28 70 2c 20 70 43 74 78  meOffset(p, pCtx
3c70: 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
3c80: 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
3c90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3ca0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27 77 27    }.    case 'w'
3cb0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20  : {.      /*.   
3cc0: 20 20 20 2a 2a 20 20 20 20 77 65 65 6b 64 61 79     **    weekday
3cd0: 20 4e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   N.      **.    
3ce0: 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 61    ** Move the da
3cf0: 74 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  te to the same t
3d00: 69 6d 65 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  ime on the next 
3d10: 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 0a 20 20  occurrence of.  
3d20: 20 20 20 20 2a 2a 20 77 65 65 6b 64 61 79 20 4e      ** weekday N
3d30: 20 77 68 65 72 65 20 30 3d 3d 53 75 6e 64 61 79   where 0==Sunday
3d40: 2c 20 31 3d 3d 4d 6f 6e 64 61 79 2c 20 61 6e 64  , 1==Monday, and
3d50: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
3d60: 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 65  he.      ** date
3d70: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74   is already on t
3d80: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 77  he appropriate w
3d90: 65 65 6b 64 61 79 2c 20 74 68 69 73 20 69 73 20  eekday, this is 
3da0: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a  a no-op..      *
3db0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  /.      if( strn
3dc0: 63 6d 70 28 7a 2c 20 22 77 65 65 6b 64 61 79 20  cmp(z, "weekday 
3dd0: 22 2c 20 38 29 3d 3d 30 0a 20 20 20 20 20 20 20  ", 8)==0.       
3de0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
3df0: 65 33 41 74 6f 46 28 26 7a 5b 38 5d 2c 20 26 72  e3AtoF(&z[8], &r
3e00: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
3e10: 30 28 26 7a 5b 38 5d 29 2c 20 53 51 4c 49 54 45  0(&z[8]), SQLITE
3e20: 5f 55 54 46 38 29 0a 20 20 20 20 20 20 20 20 20  _UTF8).         
3e30: 20 20 20 20 20 20 26 26 20 28 6e 3d 28 69 6e 74        && (n=(int
3e40: 29 72 29 3d 3d 72 20 26 26 20 6e 3e 3d 30 20 26  )r)==r && n>=0 &
3e50: 26 20 72 3c 37 20 29 7b 0a 20 20 20 20 20 20 20  & r<7 ){.       
3e60: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 5a   sqlite3_int64 Z
3e70: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
3e80: 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a 20 20 20  eYMD_HMS(p);.   
3e90: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20       p->validTZ 
3ea0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
3eb0: 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20  validJD = 0;.   
3ec0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
3ed0: 29 3b 0a 20 20 20 20 20 20 20 20 5a 20 3d 20 28  );.        Z = (
3ee0: 28 70 2d 3e 69 4a 44 20 2b 20 31 32 39 36 30 30  (p->iJD + 129600
3ef0: 30 30 30 29 2f 38 36 34 30 30 30 30 30 29 20 25  000)/86400000) %
3f00: 20 37 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   7;.        if( 
3f10: 5a 3e 6e 20 29 20 5a 20 2d 3d 20 37 3b 0a 20 20  Z>n ) Z -= 7;.  
3f20: 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20        p->iJD += 
3f30: 28 6e 20 2d 20 5a 29 2a 38 36 34 30 30 30 30 30  (n - Z)*86400000
3f40: 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72 59  ;.        clearY
3f50: 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20  MD_HMS_TZ(p);.  
3f60: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
3f70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
3f80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3f90: 65 20 27 73 27 3a 20 7b 0a 20 20 20 20 20 20 2f  e 's': {.      /
3fa0: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 73 74  *.      **    st
3fb0: 61 72 74 20 6f 66 20 54 54 54 54 54 0a 20 20 20  art of TTTTT.   
3fc0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4d     **.      ** M
3fd0: 6f 76 65 20 74 68 65 20 64 61 74 65 20 62 61 63  ove the date bac
3fe0: 6b 77 61 72 64 73 20 74 6f 20 74 68 65 20 62 65  kwards to the be
3ff0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
4000: 75 72 72 65 6e 74 20 64 61 79 2c 0a 20 20 20 20  urrent day,.    
4010: 20 20 2a 2a 20 6f 72 20 6d 6f 6e 74 68 20 6f 72    ** or month or
4020: 20 79 65 61 72 2e 0a 20 20 20 20 20 20 2a 2f 0a   year..      */.
4030: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
4040: 70 28 7a 2c 20 22 73 74 61 72 74 20 6f 66 20 22  p(z, "start of "
4050: 2c 20 39 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  , 9)!=0 ) break;
4060: 0a 20 20 20 20 20 20 7a 20 2b 3d 20 39 3b 0a 20  .      z += 9;. 
4070: 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 28       computeYMD(
4080: 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c  p);.      p->val
4090: 69 64 48 4d 53 20 3d 20 31 3b 0a 20 20 20 20 20  idHMS = 1;.     
40a0: 20 70 2d 3e 68 20 3d 20 70 2d 3e 6d 20 3d 20 30   p->h = p->m = 0
40b0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 20 3d 20 30  ;.      p->s = 0
40c0: 2e 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c  .0;.      p->val
40d0: 69 64 54 5a 20 3d 20 30 3b 0a 20 20 20 20 20 20  idTZ = 0;.      
40e0: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a  p->validJD = 0;.
40f0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
4100: 28 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d 30 20 29  (z,"month")==0 )
4110: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 44 20 3d  {.        p->D =
4120: 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
4130: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
4140: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 79 65  if( strcmp(z,"ye
4150: 61 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ar")==0 ){.     
4160: 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 28 70 29     computeYMD(p)
4170: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 4d 20 3d  ;.        p->M =
4180: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 44   1;.        p->D
4190: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63   = 1;.        rc
41a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
41b0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
41c0: 64 61 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  day")==0 ){.    
41d0: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
41e0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
41f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4200: 27 2b 27 3a 0a 20 20 20 20 63 61 73 65 20 27 2d  '+':.    case '-
4210: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 30 27 3a  ':.    case '0':
4220: 0a 20 20 20 20 63 61 73 65 20 27 31 27 3a 0a 20  .    case '1':. 
4230: 20 20 20 63 61 73 65 20 27 32 27 3a 0a 20 20 20     case '2':.   
4240: 20 63 61 73 65 20 27 33 27 3a 0a 20 20 20 20 63   case '3':.    c
4250: 61 73 65 20 27 34 27 3a 0a 20 20 20 20 63 61 73  ase '4':.    cas
4260: 65 20 27 35 27 3a 0a 20 20 20 20 63 61 73 65 20  e '5':.    case 
4270: 27 36 27 3a 0a 20 20 20 20 63 61 73 65 20 27 37  '6':.    case '7
4280: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 38 27 3a  ':.    case '8':
4290: 0a 20 20 20 20 63 61 73 65 20 27 39 27 3a 20 7b  .    case '9': {
42a0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 52  .      double rR
42b0: 6f 75 6e 64 65 72 3b 0a 20 20 20 20 20 20 66 6f  ounder;.      fo
42c0: 72 28 6e 3d 31 3b 20 7a 5b 6e 5d 20 26 26 20 7a  r(n=1; z[n] && z
42d0: 5b 6e 5d 21 3d 27 3a 27 20 26 26 20 21 73 71 6c  [n]!=':' && !sql
42e0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 5d  ite3Isspace(z[n]
42f0: 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ); n++){}.      
4300: 69 66 28 20 21 73 71 6c 69 74 65 33 41 74 6f 46  if( !sqlite3AtoF
4310: 28 7a 2c 20 26 72 2c 20 6e 2c 20 53 51 4c 49 54  (z, &r, n, SQLIT
4320: 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20  E_UTF8) ){.     
4330: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
4340: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4350: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d  }.      if( z[n]
4360: 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20  ==':' ){.       
4370: 20 2f 2a 20 41 20 6d 6f 64 69 66 69 65 72 20 6f   /* A modifier o
4380: 66 20 74 68 65 20 66 6f 72 6d 20 28 2b 7c 2d 29  f the form (+|-)
4390: 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 20 61 64 64  HH:MM:SS.FFF add
43a0: 73 20 28 6f 72 20 73 75 62 74 72 61 63 74 73 29  s (or subtracts)
43b0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
43c0: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
43d0: 20 6f 66 20 68 6f 75 72 73 2c 20 6d 69 6e 75 74   of hours, minut
43e0: 65 73 2c 20 73 65 63 6f 6e 64 73 2c 20 61 6e 64  es, seconds, and
43f0: 20 66 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f   fractional seco
4400: 6e 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  nds.        ** t
4410: 6f 20 74 68 65 20 74 69 6d 65 2e 20 20 54 68 65  o the time.  The
4420: 20 22 2e 46 46 46 22 20 6d 61 79 20 62 65 20 6f   ".FFF" may be o
4430: 6d 69 74 74 65 64 2e 20 20 54 68 65 20 22 3a 53  mitted.  The ":S
4440: 53 2e 46 46 46 22 20 6d 61 79 20 62 65 0a 20 20  S.FFF" may be.  
4450: 20 20 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64        ** omitted
4460: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
4470: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
4480: 2a 7a 32 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20  *z2 = z;.       
4490: 20 44 61 74 65 54 69 6d 65 20 74 78 3b 0a 20 20   DateTime tx;.  
44a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
44b0: 74 36 34 20 64 61 79 3b 0a 20 20 20 20 20 20 20  t64 day;.       
44c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 64   if( !sqlite3Isd
44d0: 69 67 69 74 28 2a 7a 32 29 20 29 20 7a 32 2b 2b  igit(*z2) ) z2++
44e0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
44f0: 28 26 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&tx, 0, sizeof(
4500: 74 78 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  tx));.        if
4510: 28 20 70 61 72 73 65 48 68 4d 6d 53 73 28 7a 32  ( parseHhMmSs(z2
4520: 2c 20 26 74 78 29 20 29 20 62 72 65 61 6b 3b 0a  , &tx) ) break;.
4530: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
4540: 44 28 26 74 78 29 3b 0a 20 20 20 20 20 20 20 20  D(&tx);.        
4550: 74 78 2e 69 4a 44 20 2d 3d 20 34 33 32 30 30 30  tx.iJD -= 432000
4560: 30 30 3b 0a 20 20 20 20 20 20 20 20 64 61 79 20  00;.        day 
4570: 3d 20 74 78 2e 69 4a 44 2f 38 36 34 30 30 30 30  = tx.iJD/8640000
4580: 30 3b 0a 20 20 20 20 20 20 20 20 74 78 2e 69 4a  0;.        tx.iJ
4590: 44 20 2d 3d 20 64 61 79 2a 38 36 34 30 30 30 30  D -= day*8640000
45a0: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  0;.        if( z
45b0: 5b 30 5d 3d 3d 27 2d 27 20 29 20 74 78 2e 69 4a  [0]=='-' ) tx.iJ
45c0: 44 20 3d 20 2d 74 78 2e 69 4a 44 3b 0a 20 20 20  D = -tx.iJD;.   
45d0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
45e0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72  );.        clear
45f0: 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20  YMD_HMS_TZ(p);. 
4600: 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d         p->iJD +=
4610: 20 74 78 2e 69 4a 44 3b 0a 20 20 20 20 20 20 20   tx.iJD;.       
4620: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   rc = 0;.       
4630: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4640: 20 20 20 20 20 20 7a 20 2b 3d 20 6e 3b 0a 20 20        z += n;.  
4650: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
4660: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
4670: 7a 2b 2b 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  z++;.      n = s
4680: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4690: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 31  );.      if( n>1
46a0: 30 20 7c 7c 20 6e 3c 33 20 29 20 62 72 65 61 6b  0 || n<3 ) break
46b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 2d  ;.      if( z[n-
46c0: 31 5d 3d 3d 27 73 27 20 29 7b 20 7a 5b 6e 2d 31  1]=='s' ){ z[n-1
46d0: 5d 20 3d 20 30 3b 20 6e 2d 2d 3b 20 7d 0a 20 20  ] = 0; n--; }.  
46e0: 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29      computeJD(p)
46f0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  ;.      rc = 0;.
4700: 20 20 20 20 20 20 72 52 6f 75 6e 64 65 72 20 3d        rRounder =
4710: 20 72 3c 30 20 3f 20 2d 30 2e 35 20 3a 20 2b 30   r<0 ? -0.5 : +0
4720: 2e 35 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  .5;.      if( n=
4730: 3d 33 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22  =3 && strcmp(z,"
4740: 64 61 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  day")==0 ){.    
4750: 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73      p->iJD += (s
4760: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a  qlite3_int64)(r*
4770: 38 36 34 30 30 30 30 30 2e 30 20 2b 20 72 52 6f  86400000.0 + rRo
4780: 75 6e 64 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  under);.      }e
4790: 6c 73 65 20 69 66 28 20 6e 3d 3d 34 20 26 26 20  lse if( n==4 && 
47a0: 73 74 72 63 6d 70 28 7a 2c 22 68 6f 75 72 22 29  strcmp(z,"hour")
47b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
47c0: 2d 3e 69 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65  ->iJD += (sqlite
47d0: 33 5f 69 6e 74 36 34 29 28 72 2a 28 38 36 34 30  3_int64)(r*(8640
47e0: 30 30 30 30 2e 30 2f 32 34 2e 30 29 20 2b 20 72  0000.0/24.0) + r
47f0: 52 6f 75 6e 64 65 72 29 3b 0a 20 20 20 20 20 20  Rounder);.      
4800: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20 26  }else if( n==6 &
4810: 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d 69 6e 75  & strcmp(z,"minu
4820: 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  te")==0 ){.     
4830: 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73 71     p->iJD += (sq
4840: 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 28  lite3_int64)(r*(
4850: 38 36 34 30 30 30 30 30 2e 30 2f 28 32 34 2e 30  86400000.0/(24.0
4860: 2a 36 30 2e 30 29 29 20 2b 20 72 52 6f 75 6e 64  *60.0)) + rRound
4870: 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
4880: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 73 74 72   if( n==6 && str
4890: 63 6d 70 28 7a 2c 22 73 65 63 6f 6e 64 22 29 3d  cmp(z,"second")=
48a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
48b0: 3e 69 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65 33  >iJD += (sqlite3
48c0: 5f 69 6e 74 36 34 29 28 72 2a 28 38 36 34 30 30  _int64)(r*(86400
48d0: 30 30 30 2e 30 2f 28 32 34 2e 30 2a 36 30 2e 30  000.0/(24.0*60.0
48e0: 2a 36 30 2e 30 29 29 20 2b 20 72 52 6f 75 6e 64  *60.0)) + rRound
48f0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
4900: 20 69 66 28 20 6e 3d 3d 35 20 26 26 20 73 74 72   if( n==5 && str
4910: 63 6d 70 28 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d  cmp(z,"month")==
4920: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
4930: 20 78 2c 20 79 3b 0a 20 20 20 20 20 20 20 20 63   x, y;.        c
4940: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29  omputeYMD_HMS(p)
4950: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 4d 20 2b  ;.        p->M +
4960: 3d 20 28 69 6e 74 29 72 3b 0a 20 20 20 20 20 20  = (int)r;.      
4970: 20 20 78 20 3d 20 70 2d 3e 4d 3e 30 20 3f 20 28    x = p->M>0 ? (
4980: 70 2d 3e 4d 2d 31 29 2f 31 32 20 3a 20 28 70 2d  p->M-1)/12 : (p-
4990: 3e 4d 2d 31 32 29 2f 31 32 3b 0a 20 20 20 20 20  >M-12)/12;.     
49a0: 20 20 20 70 2d 3e 59 20 2b 3d 20 78 3b 0a 20 20     p->Y += x;.  
49b0: 20 20 20 20 20 20 70 2d 3e 4d 20 2d 3d 20 78 2a        p->M -= x*
49c0: 31 32 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 76  12;.        p->v
49d0: 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20  alidJD = 0;.    
49e0: 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29      computeJD(p)
49f0: 3b 0a 20 20 20 20 20 20 20 20 79 20 3d 20 28 69  ;.        y = (i
4a00: 6e 74 29 72 3b 0a 20 20 20 20 20 20 20 20 69 66  nt)r;.        if
4a10: 28 20 79 21 3d 72 20 29 7b 0a 20 20 20 20 20 20  ( y!=r ){.      
4a20: 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73      p->iJD += (s
4a30: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 28 72  qlite3_int64)((r
4a40: 20 2d 20 79 29 2a 33 30 2e 30 2a 38 36 34 30 30   - y)*30.0*86400
4a50: 30 30 30 2e 30 20 2b 20 72 52 6f 75 6e 64 65 72  000.0 + rRounder
4a60: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4a70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d     }else if( n==
4a80: 34 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 79  4 && strcmp(z,"y
4a90: 65 61 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ear")==0 ){.    
4aa0: 20 20 20 20 69 6e 74 20 79 20 3d 20 28 69 6e 74      int y = (int
4ab0: 29 72 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70  )r;.        comp
4ac0: 75 74 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a 20  uteYMD_HMS(p);. 
4ad0: 20 20 20 20 20 20 20 70 2d 3e 59 20 2b 3d 20 79         p->Y += y
4ae0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 76 61 6c  ;.        p->val
4af0: 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20  idJD = 0;.      
4b00: 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a    computeJD(p);.
4b10: 20 20 20 20 20 20 20 20 69 66 28 20 79 21 3d 72          if( y!=r
4b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
4b30: 3e 69 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65 33  >iJD += (sqlite3
4b40: 5f 69 6e 74 36 34 29 28 28 72 20 2d 20 79 29 2a  _int64)((r - y)*
4b50: 33 36 35 2e 30 2a 38 36 34 30 30 30 30 30 2e 30  365.0*86400000.0
4b60: 20 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20   + rRounder);.  
4b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
4b80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
4b90: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
4ba0: 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f     clearYMD_HMS_
4bb0: 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 62 72 65  TZ(p);.      bre
4bc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
4bd0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62  fault: {.      b
4be0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4bf0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4c00: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 74 69  /*.** Process ti
4c10: 6d 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  me function argu
4c20: 6d 65 6e 74 73 2e 20 20 61 72 67 76 5b 30 5d 20  ments.  argv[0] 
4c30: 69 73 20 61 20 64 61 74 65 2d 74 69 6d 65 20 73  is a date-time s
4c40: 74 61 6d 70 2e 0a 2a 2a 20 61 72 67 76 5b 31 5d  tamp..** argv[1]
4c50: 20 61 6e 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   and following a
4c60: 72 65 20 6d 6f 64 69 66 69 65 72 73 2e 20 20 50  re modifiers.  P
4c70: 61 72 73 65 20 74 68 65 6d 20 61 6c 6c 20 61 6e  arse them all an
4c80: 64 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 72  d write.** the r
4c90: 65 73 75 6c 74 69 6e 67 20 74 69 6d 65 20 69 6e  esulting time in
4ca0: 74 6f 20 74 68 65 20 44 61 74 65 54 69 6d 65 20  to the DateTime 
4cb0: 73 74 72 75 63 74 75 72 65 20 70 2e 20 20 52 65  structure p.  Re
4cc0: 74 75 72 6e 20 30 0a 2a 2a 20 6f 6e 20 73 75 63  turn 0.** on suc
4cd0: 63 65 73 73 20 61 6e 64 20 31 20 69 66 20 74 68  cess and 1 if th
4ce0: 65 72 65 20 61 72 65 20 61 6e 79 20 65 72 72 6f  ere are any erro
4cf0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
4d00: 72 65 20 61 72 65 20 7a 65 72 6f 20 70 61 72 61  re are zero para
4d10: 6d 65 74 65 72 73 20 28 69 66 20 65 76 65 6e 20  meters (if even 
4d20: 61 72 67 76 5b 30 5d 20 69 73 20 75 6e 64 65 66  argv[0] is undef
4d30: 69 6e 65 64 29 0a 2a 2a 20 74 68 65 6e 20 61 73  ined).** then as
4d40: 73 75 6d 65 20 61 20 64 65 66 61 75 6c 74 20 76  sume a default v
4d50: 61 6c 75 65 20 6f 66 20 22 6e 6f 77 22 20 66 6f  alue of "now" fo
4d60: 72 20 61 72 67 76 5b 30 5d 2e 0a 2a 2f 0a 73 74  r argv[0]..*/.st
4d70: 61 74 69 63 20 69 6e 74 20 69 73 44 61 74 65 28  atic int isDate(
4d80: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
4d90: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20  xt *context, .  
4da0: 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c  int argc, .  sql
4db0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
4dc0: 76 2c 20 0a 20 20 44 61 74 65 54 69 6d 65 20 2a  v, .  DateTime *
4dd0: 70 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p.){.  int i;.  
4de0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4df0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 65 54  har *z;.  int eT
4e00: 79 70 65 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  ype;.  memset(p,
4e10: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
4e20: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
4e30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 65 74  {.    return set
4e40: 44 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65 6e  DateTimeToCurren
4e50: 74 28 63 6f 6e 74 65 78 74 2c 20 70 29 3b 0a 20  t(context, p);. 
4e60: 20 7d 0a 20 20 69 66 28 20 28 65 54 79 70 65 20   }.  if( (eType 
4e70: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4e80: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29 3d 3d  type(argv[0]))==
4e90: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 0a 20 20 20  SQLITE_FLOAT.   
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
4ec0: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
4ed0: 70 2d 3e 69 4a 44 20 3d 20 28 73 71 6c 69 74 65  p->iJD = (sqlite
4ee0: 33 5f 69 6e 74 36 34 29 28 73 71 6c 69 74 65 33  3_int64)(sqlite3
4ef0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
4f00: 67 76 5b 30 5d 29 2a 38 36 34 30 30 30 30 30 2e  gv[0])*86400000.
4f10: 30 20 2b 20 30 2e 35 29 3b 0a 20 20 20 20 70 2d  0 + 0.5);.    p-
4f20: 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 20 20  >validJD = 1;.  
4f30: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
4f40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4f50: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
4f60: 69 66 28 20 21 7a 20 7c 7c 20 70 61 72 73 65 44  if( !z || parseD
4f70: 61 74 65 4f 72 54 69 6d 65 28 63 6f 6e 74 65 78  ateOrTime(contex
4f80: 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 70 29 20  t, (char*)z, p) 
4f90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4fa0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  1;.    }.  }.  f
4fb0: 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20  or(i=1; i<argc; 
4fc0: 69 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71  i++){.    z = sq
4fd0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
4fe0: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69  (argv[i]);.    i
4ff0: 66 28 20 7a 3d 3d 30 20 7c 7c 20 70 61 72 73 65  f( z==0 || parse
5000: 4d 6f 64 69 66 69 65 72 28 63 6f 6e 74 65 78 74  Modifier(context
5010: 2c 20 28 63 68 61 72 2a 29 7a 2c 20 70 29 20 29  , (char*)z, p) )
5020: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
5030: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
5040: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
5050: 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  ng routines impl
5060: 65 6d 65 6e 74 20 74 68 65 20 76 61 72 69 6f 75  ement the variou
5070: 73 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20  s date and time 
5080: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  functions.** of 
5090: 53 51 4c 69 74 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  SQLite..*/../*.*
50a0: 2a 20 20 20 20 6a 75 6c 69 61 6e 64 61 79 28 20  *    julianday( 
50b0: 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c  TIMESTRING, MOD,
50c0: 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a   MOD, ...).**.**
50d0: 20 52 65 74 75 72 6e 20 74 68 65 20 6a 75 6c 69   Return the juli
50e0: 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 20 6f 66  an day number of
50f0: 20 74 68 65 20 64 61 74 65 20 73 70 65 63 69 66   the date specif
5100: 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ied in the argum
5110: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
5120: 6f 69 64 20 6a 75 6c 69 61 6e 64 61 79 46 75 6e  oid juliandayFun
5130: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5140: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
5150: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
5160: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5170: 76 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20  v.){.  DateTime 
5180: 78 3b 0a 20 20 69 66 28 20 69 73 44 61 74 65 28  x;.  if( isDate(
5190: 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61  context, argc, a
51a0: 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20  rgv, &x)==0 ){. 
51b0: 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 29     computeJD(&x)
51c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
51d0: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74  sult_double(cont
51e0: 65 78 74 2c 20 78 2e 69 4a 44 2f 38 36 34 30 30  ext, x.iJD/86400
51f0: 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  000.0);.  }.}../
5200: 2a 0a 2a 2a 20 20 20 20 64 61 74 65 74 69 6d 65  *.**    datetime
5210: 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f  ( TIMESTRING, MO
5220: 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a  D, MOD, ...).**.
5230: 2a 2a 20 52 65 74 75 72 6e 20 59 59 59 59 2d 4d  ** Return YYYY-M
5240: 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2f  M-DD HH:MM:SS.*/
5250: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 61 74  .static void dat
5260: 65 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c  etimeFunc(.  sql
5270: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
5280: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
5290: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
52a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44  ue **argv.){.  D
52b0: 61 74 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28  ateTime x;.  if(
52c0: 20 69 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c   isDate(context,
52d0: 20 61 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29   argc, argv, &x)
52e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
52f0: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63  zBuf[100];.    c
5300: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78  omputeYMD_HMS(&x
5310: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
5320: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
5330: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 30 34  Buf), zBuf, "%04
5340: 64 2d 25 30 32 64 2d 25 30 32 64 20 25 30 32 64  d-%02d-%02d %02d
5350: 3a 25 30 32 64 3a 25 30 32 64 22 2c 0a 20 20 20  :%02d:%02d",.   
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 78 2e 59 2c 20 78 2e 4d 2c 20 78 2e 44 2c    x.Y, x.M, x.D,
5380: 20 78 2e 68 2c 20 78 2e 6d 2c 20 28 69 6e 74 29   x.h, x.m, (int)
5390: 28 78 2e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69  (x.s));.    sqli
53a0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
53b0: 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d  context, zBuf, -
53c0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
53d0: 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ENT);.  }.}../*.
53e0: 2a 2a 20 20 20 20 74 69 6d 65 28 20 54 49 4d 45  **    time( TIME
53f0: 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44  STRING, MOD, MOD
5400: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74  , ...).**.** Ret
5410: 75 72 6e 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2f 0a  urn HH:MM:SS.*/.
5420: 73 74 61 74 69 63 20 76 6f 69 64 20 74 69 6d 65  static void time
5430: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
5440: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
5450: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
5460: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5470: 61 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69  argv.){.  DateTi
5480: 6d 65 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61  me x;.  if( isDa
5490: 74 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  te(context, argc
54a0: 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d 30 20 29  , argv, &x)==0 )
54b0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
54c0: 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6d 70 75 74  100];.    comput
54d0: 65 48 4d 53 28 26 78 29 3b 0a 20 20 20 20 73 71  eHMS(&x);.    sq
54e0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
54f0: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
5500: 66 2c 20 22 25 30 32 64 3a 25 30 32 64 3a 25 30  f, "%02d:%02d:%0
5510: 32 64 22 2c 20 78 2e 68 2c 20 78 2e 6d 2c 20 28  2d", x.h, x.m, (
5520: 69 6e 74 29 78 2e 73 29 3b 0a 20 20 20 20 73 71  int)x.s);.    sq
5530: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
5540: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c  t(context, zBuf,
5550: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
5560: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  SIENT);.  }.}../
5570: 2a 0a 2a 2a 20 20 20 20 64 61 74 65 28 20 54 49  *.**    date( TI
5580: 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d  MESTRING, MOD, M
5590: 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52  OD, ...).**.** R
55a0: 65 74 75 72 6e 20 59 59 59 59 2d 4d 4d 2d 44 44  eturn YYYY-MM-DD
55b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
55c0: 64 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  dateFunc(.  sqli
55d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
55e0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
55f0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5600: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61  e **argv.){.  Da
5610: 74 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20  teTime x;.  if( 
5620: 69 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20  isDate(context, 
5630: 61 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d  argc, argv, &x)=
5640: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
5650: 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f  Buf[100];.    co
5660: 6d 70 75 74 65 59 4d 44 28 26 78 29 3b 0a 20 20  mputeYMD(&x);.  
5670: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
5680: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
5690: 20 7a 42 75 66 2c 20 22 25 30 34 64 2d 25 30 32   zBuf, "%04d-%02
56a0: 64 2d 25 30 32 64 22 2c 20 78 2e 59 2c 20 78 2e  d-%02d", x.Y, x.
56b0: 4d 2c 20 78 2e 44 29 3b 0a 20 20 20 20 73 71 6c  M, x.D);.    sql
56c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
56d0: 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20  (context, zBuf, 
56e0: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
56f0: 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  IENT);.  }.}../*
5700: 0a 2a 2a 20 20 20 20 73 74 72 66 74 69 6d 65 28  .**    strftime(
5710: 20 46 4f 52 4d 41 54 2c 20 54 49 4d 45 53 54 52   FORMAT, TIMESTR
5720: 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e  ING, MOD, MOD, .
5730: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ..).**.** Return
5740: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
5750: 62 65 64 20 62 79 20 46 4f 52 4d 41 54 2e 20 20  bed by FORMAT.  
5760: 43 6f 6e 76 65 72 73 69 6f 6e 73 20 61 73 20 66  Conversions as f
5770: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
5780: 25 64 20 20 64 61 79 20 6f 66 20 6d 6f 6e 74 68  %d  day of month
5790: 0a 2a 2a 20 20 20 25 66 20 20 2a 2a 20 66 72 61  .**   %f  ** fra
57a0: 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 20  ctional seconds 
57b0: 20 53 53 2e 53 53 53 0a 2a 2a 20 20 20 25 48 20   SS.SSS.**   %H 
57c0: 20 68 6f 75 72 20 30 30 2d 32 34 0a 2a 2a 20 20   hour 00-24.**  
57d0: 20 25 6a 20 20 64 61 79 20 6f 66 20 79 65 61 72   %j  day of year
57e0: 20 30 30 30 2d 33 36 36 0a 2a 2a 20 20 20 25 4a   000-366.**   %J
57f0: 20 20 2a 2a 20 4a 75 6c 69 61 6e 20 64 61 79 20    ** Julian day 
5800: 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 25 6d 20 20  number.**   %m  
5810: 6d 6f 6e 74 68 20 30 31 2d 31 32 0a 2a 2a 20 20  month 01-12.**  
5820: 20 25 4d 20 20 6d 69 6e 75 74 65 20 30 30 2d 35   %M  minute 00-5
5830: 39 0a 2a 2a 20 20 20 25 73 20 20 73 65 63 6f 6e  9.**   %s  secon
5840: 64 73 20 73 69 6e 63 65 20 31 39 37 30 2d 30 31  ds since 1970-01
5850: 2d 30 31 0a 2a 2a 20 20 20 25 53 20 20 73 65 63  -01.**   %S  sec
5860: 6f 6e 64 73 20 30 30 2d 35 39 0a 2a 2a 20 20 20  onds 00-59.**   
5870: 25 77 20 20 64 61 79 20 6f 66 20 77 65 65 6b 20  %w  day of week 
5880: 30 2d 36 20 20 73 75 6e 64 61 79 3d 3d 30 0a 2a  0-6  sunday==0.*
5890: 2a 20 20 20 25 57 20 20 77 65 65 6b 20 6f 66 20  *   %W  week of 
58a0: 79 65 61 72 20 30 30 2d 35 33 0a 2a 2a 20 20 20  year 00-53.**   
58b0: 25 59 20 20 79 65 61 72 20 30 30 30 30 2d 39 39  %Y  year 0000-99
58c0: 39 39 0a 2a 2a 20 20 20 25 25 20 20 25 0a 2a 2f  99.**   %%  %.*/
58d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 72  .static void str
58e0: 66 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c  ftimeFunc(.  sql
58f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
5900: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
5910: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
5920: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44  ue **argv.){.  D
5930: 61 74 65 54 69 6d 65 20 78 3b 0a 20 20 75 36 34  ateTime x;.  u64
5940: 20 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 6a   n;.  size_t i,j
5950: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73  ;.  char *z;.  s
5960: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
5970: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d  nst char *zFmt =
5980: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
5990: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
59a0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 68 61  (argv[0]);.  cha
59b0: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69  r zBuf[100];.  i
59c0: 66 28 20 7a 46 6d 74 3d 3d 30 20 7c 7c 20 69 73  f( zFmt==0 || is
59d0: 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  Date(context, ar
59e0: 67 63 2d 31 2c 20 61 72 67 76 2b 31 2c 20 26 78  gc-1, argv+1, &x
59f0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
5a00: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
5a10: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
5a20: 74 65 78 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30  text);.  for(i=0
5a30: 2c 20 6e 3d 31 3b 20 7a 46 6d 74 5b 69 5d 3b 20  , n=1; zFmt[i]; 
5a40: 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20 20 20 20 69  i++, n++){.    i
5a50: 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27 25 27 20  f( zFmt[i]=='%' 
5a60: 29 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  ){.      switch(
5a70: 20 7a 46 6d 74 5b 69 2b 31 5d 20 29 7b 0a 20 20   zFmt[i+1] ){.  
5a80: 20 20 20 20 20 20 63 61 73 65 20 27 64 27 3a 0a        case 'd':.
5a90: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 48 27          case 'H'
5aa0: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  :.        case '
5ab0: 6d 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  m':.        case
5ac0: 20 27 4d 27 3a 0a 20 20 20 20 20 20 20 20 63 61   'M':.        ca
5ad0: 73 65 20 27 53 27 3a 0a 20 20 20 20 20 20 20 20  se 'S':.        
5ae0: 63 61 73 65 20 27 57 27 3a 0a 20 20 20 20 20 20  case 'W':.      
5af0: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20      n++;.       
5b00: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
5b10: 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  */.        case 
5b20: 27 77 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73  'w':.        cas
5b30: 65 20 27 25 27 3a 0a 20 20 20 20 20 20 20 20 20  e '%':.         
5b40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5b50: 63 61 73 65 20 27 66 27 3a 0a 20 20 20 20 20 20  case 'f':.      
5b60: 20 20 20 20 6e 20 2b 3d 20 38 3b 0a 20 20 20 20      n += 8;.    
5b70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5b80: 20 20 20 20 20 63 61 73 65 20 27 6a 27 3a 0a 20       case 'j':. 
5b90: 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 33 3b           n += 3;
5ba0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5bb0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
5bc0: 59 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 20  Y':.          n 
5bd0: 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 20 20  += 8;.          
5be0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
5bf0: 61 73 65 20 27 73 27 3a 0a 20 20 20 20 20 20 20  ase 's':.       
5c00: 20 63 61 73 65 20 27 4a 27 3a 0a 20 20 20 20 20   case 'J':.     
5c10: 20 20 20 20 20 6e 20 2b 3d 20 35 30 3b 0a 20 20       n += 50;.  
5c20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5c30: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
5c40: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5c50: 3b 20 20 2f 2a 20 45 52 52 4f 52 2e 20 20 72 65  ;  /* ERROR.  re
5c60: 74 75 72 6e 20 61 20 4e 55 4c 4c 20 2a 2f 0a 20  turn a NULL */. 
5c70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 2b 2b       }.      i++
5c80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 65  ;.    }.  }.  te
5c90: 73 74 63 61 73 65 28 20 6e 3d 3d 73 69 7a 65 6f  stcase( n==sizeo
5ca0: 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a 20 20 74  f(zBuf)-1 );.  t
5cb0: 65 73 74 63 61 73 65 28 20 6e 3d 3d 73 69 7a 65  estcase( n==size
5cc0: 6f 66 28 7a 42 75 66 29 20 29 3b 0a 20 20 74 65  of(zBuf) );.  te
5cd0: 73 74 63 61 73 65 28 20 6e 3d 3d 28 75 36 34 29  stcase( n==(u64)
5ce0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
5cf0: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 2b  E_LIMIT_LENGTH]+
5d00: 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
5d10: 20 6e 3d 3d 28 75 36 34 29 64 62 2d 3e 61 4c 69   n==(u64)db->aLi
5d20: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5d30: 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20 20 69 66  _LENGTH] );.  if
5d40: 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29  ( n<sizeof(zBuf)
5d50: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66   ){.    z = zBuf
5d60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e  ;.  }else if( n>
5d70: 28 75 36 34 29 64 62 2d 3e 61 4c 69 6d 69 74 5b  (u64)db->aLimit[
5d80: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
5d90: 47 54 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  GTH] ){.    sqli
5da0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
5db0: 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29  _toobig(context)
5dc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
5dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
5de0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
5df0: 77 28 64 62 2c 20 28 69 6e 74 29 6e 29 3b 0a 20  w(db, (int)n);. 
5e00: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
5e10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5e20: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
5e30: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
5e40: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
5e50: 7d 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78  }.  computeJD(&x
5e60: 29 3b 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f  );.  computeYMD_
5e70: 48 4d 53 28 26 78 29 3b 0a 20 20 66 6f 72 28 69  HMS(&x);.  for(i
5e80: 3d 6a 3d 30 3b 20 7a 46 6d 74 5b 69 5d 3b 20 69  =j=0; zFmt[i]; i
5e90: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6d  ++){.    if( zFm
5ea0: 74 5b 69 5d 21 3d 27 25 27 20 29 7b 0a 20 20 20  t[i]!='%' ){.   
5eb0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 46 6d 74     z[j++] = zFmt
5ec0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
5ed0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
5ee0: 20 73 77 69 74 63 68 28 20 7a 46 6d 74 5b 69 5d   switch( zFmt[i]
5ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
5f00: 20 27 64 27 3a 20 20 73 71 6c 69 74 65 33 5f 73   'd':  sqlite3_s
5f10: 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d  nprintf(3, &z[j]
5f20: 2c 22 25 30 32 64 22 2c 78 2e 44 29 3b 20 6a 2b  ,"%02d",x.D); j+
5f30: 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  =2; break;.     
5f40: 20 20 20 63 61 73 65 20 27 66 27 3a 20 7b 0a 20     case 'f': {. 
5f50: 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20           double 
5f60: 73 20 3d 20 78 2e 73 3b 0a 20 20 20 20 20 20 20  s = x.s;.       
5f70: 20 20 20 69 66 28 20 73 3e 35 39 2e 39 39 39 20     if( s>59.999 
5f80: 29 20 73 20 3d 20 35 39 2e 39 39 39 3b 0a 20 20  ) s = 59.999;.  
5f90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5fa0: 73 6e 70 72 69 6e 74 66 28 37 2c 20 26 7a 5b 6a  snprintf(7, &z[j
5fb0: 5d 2c 22 25 30 36 2e 33 66 22 2c 20 73 29 3b 0a  ],"%06.3f", s);.
5fc0: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 73            j += s
5fd0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
5fe0: 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[j]);.         
5ff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6000: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  }.        case '
6010: 48 27 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  H':  sqlite3_snp
6020: 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22  rintf(3, &z[j],"
6030: 25 30 32 64 22 2c 78 2e 68 29 3b 20 6a 2b 3d 32  %02d",x.h); j+=2
6040: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
6050: 20 63 61 73 65 20 27 57 27 3a 20 2f 2a 20 46 61   case 'W': /* Fa
6060: 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20  ll thru */.     
6070: 20 20 20 63 61 73 65 20 27 6a 27 3a 20 7b 0a 20     case 'j': {. 
6080: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 61           int nDa
6090: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
60a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 79 73  * Number of days
60b0: 20 73 69 6e 63 65 20 31 73 74 20 64 61 79 20 6f   since 1st day o
60c0: 66 20 79 65 61 72 20 2a 2f 0a 20 20 20 20 20 20  f year */.      
60d0: 20 20 20 20 44 61 74 65 54 69 6d 65 20 79 20 3d      DateTime y =
60e0: 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 79 2e   x;.          y.
60f0: 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20  validJD = 0;.   
6100: 20 20 20 20 20 20 20 79 2e 4d 20 3d 20 31 3b 0a         y.M = 1;.
6110: 20 20 20 20 20 20 20 20 20 20 79 2e 44 20 3d 20            y.D = 
6120: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d  1;.          com
6130: 70 75 74 65 4a 44 28 26 79 29 3b 0a 20 20 20 20  puteJD(&y);.    
6140: 20 20 20 20 20 20 6e 44 61 79 20 3d 20 28 69 6e        nDay = (in
6150: 74 29 28 28 78 2e 69 4a 44 2d 79 2e 69 4a 44 2b  t)((x.iJD-y.iJD+
6160: 34 33 32 30 30 30 30 30 29 2f 38 36 34 30 30 30  43200000)/864000
6170: 30 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  00);.          i
6180: 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27 57 27 20  f( zFmt[i]=='W' 
6190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
61a0: 6e 74 20 77 64 3b 20 20 20 2f 2a 20 30 3d 4d 6f  nt wd;   /* 0=Mo
61b0: 6e 64 61 79 2c 20 31 3d 54 75 65 73 64 61 79 2c  nday, 1=Tuesday,
61c0: 20 2e 2e 2e 20 36 3d 53 75 6e 64 61 79 20 2a 2f   ... 6=Sunday */
61d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 64 20  .            wd 
61e0: 3d 20 28 69 6e 74 29 28 28 28 78 2e 69 4a 44 2b  = (int)(((x.iJD+
61f0: 34 33 32 30 30 30 30 30 29 2f 38 36 34 30 30 30  43200000)/864000
6200: 30 30 29 25 37 29 3b 0a 20 20 20 20 20 20 20 20  00)%7);.        
6210: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6220: 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25  intf(3, &z[j],"%
6230: 30 32 64 22 2c 28 6e 44 61 79 2b 37 2d 77 64 29  02d",(nDay+7-wd)
6240: 2f 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  /7);.           
6250: 20 6a 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   j += 2;.       
6260: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6280: 70 72 69 6e 74 66 28 34 2c 20 26 7a 5b 6a 5d 2c  printf(4, &z[j],
6290: 22 25 30 33 64 22 2c 6e 44 61 79 2b 31 29 3b 0a  "%03d",nDay+1);.
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d              j +=
62b0: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   3;.          }.
62c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
62d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
62e0: 20 20 20 63 61 73 65 20 27 4a 27 3a 20 7b 0a 20     case 'J': {. 
62f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6300: 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 20 26 7a  _snprintf(20, &z
6310: 5b 6a 5d 2c 22 25 2e 31 36 67 22 2c 78 2e 69 4a  [j],"%.16g",x.iJ
6320: 44 2f 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20  D/86400000.0);. 
6330: 20 20 20 20 20 20 20 20 20 6a 2b 3d 73 71 6c 69           j+=sqli
6340: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 5b 6a  te3Strlen30(&z[j
6350: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ]);.          br
6360: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
6370: 20 20 20 20 20 20 20 63 61 73 65 20 27 6d 27 3a         case 'm':
6380: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6390: 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32  tf(3, &z[j],"%02
63a0: 64 22 2c 78 2e 4d 29 3b 20 6a 2b 3d 32 3b 20 62  d",x.M); j+=2; b
63b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
63c0: 73 65 20 27 4d 27 3a 20 20 73 71 6c 69 74 65 33  se 'M':  sqlite3
63d0: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b  _snprintf(3, &z[
63e0: 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 6d 29 3b 20  j],"%02d",x.m); 
63f0: 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20  j+=2; break;.   
6400: 20 20 20 20 20 63 61 73 65 20 27 73 27 3a 20 7b       case 's': {
6410: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6420: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 26  e3_snprintf(30,&
6430: 7a 5b 6a 5d 2c 22 25 6c 6c 64 22 2c 0a 20 20 20  z[j],"%lld",.   
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6450: 20 20 20 20 20 20 20 20 28 69 36 34 29 28 78 2e          (i64)(x.
6460: 69 4a 44 2f 31 30 30 30 20 2d 20 32 31 30 38 36  iJD/1000 - 21086
6470: 36 37 36 2a 28 69 36 34 29 31 30 30 30 30 29 29  676*(i64)10000))
6480: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d  ;.          j +=
6490: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
64a0: 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  (&z[j]);.       
64b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
64c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
64d0: 20 27 53 27 3a 20 20 73 71 6c 69 74 65 33 5f 73   'S':  sqlite3_s
64e0: 6e 70 72 69 6e 74 66 28 33 2c 26 7a 5b 6a 5d 2c  nprintf(3,&z[j],
64f0: 22 25 30 32 64 22 2c 28 69 6e 74 29 78 2e 73 29  "%02d",(int)x.s)
6500: 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20  ; j+=2; break;. 
6510: 20 20 20 20 20 20 20 63 61 73 65 20 27 77 27 3a         case 'w':
6520: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a   {.          z[j
6530: 2b 2b 5d 20 3d 20 28 63 68 61 72 29 28 28 28 78  ++] = (char)(((x
6540: 2e 69 4a 44 2b 31 32 39 36 30 30 30 30 30 29 2f  .iJD+129600000)/
6550: 38 36 34 30 30 30 30 30 29 20 25 20 37 29 20 2b  86400000) % 7) +
6560: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
6570: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
6580: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 59  .        case 'Y
6590: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ': {.          s
65a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
65b0: 35 2c 26 7a 5b 6a 5d 2c 22 25 30 34 64 22 2c 78  5,&z[j],"%04d",x
65c0: 2e 59 29 3b 20 6a 2b 3d 73 71 6c 69 74 65 33 53  .Y); j+=sqlite3S
65d0: 74 72 6c 65 6e 33 30 28 26 7a 5b 6a 5d 29 3b 0a  trlen30(&z[j]);.
65e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
65f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6600: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 7a 5b     default:   z[
6610: 6a 2b 2b 5d 20 3d 20 27 25 27 3b 20 62 72 65 61  j++] = '%'; brea
6620: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6630: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
6640: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6650: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6660: 7a 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  z, -1,.         
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 3d 3d               z==
6680: 7a 42 75 66 20 3f 20 53 51 4c 49 54 45 5f 54 52  zBuf ? SQLITE_TR
6690: 41 4e 53 49 45 4e 54 20 3a 20 53 51 4c 49 54 45  ANSIENT : SQLITE
66a0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 7d 0a 0a 2f 2a  _DYNAMIC);.}../*
66b0: 0a 2a 2a 20 63 75 72 72 65 6e 74 5f 74 69 6d 65  .** current_time
66c0: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ().**.** This fu
66d0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
66e0: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
66f0: 20 74 69 6d 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f   time('now')..*/
6700: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 74 69  .static void cti
6710: 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  meFunc(.  sqlite
6720: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6730: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
6740: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
6750: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
6760: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6770: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
6780: 74 55 73 65 64 32 29 3b 0a 20 20 74 69 6d 65 46  tUsed2);.  timeF
6790: 75 6e 63 28 63 6f 6e 74 65 78 74 2c 20 30 2c 20  unc(context, 0, 
67a0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72  0);.}../*.** cur
67b0: 72 65 6e 74 5f 64 61 74 65 28 29 0a 2a 2a 0a 2a  rent_date().**.*
67c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
67d0: 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65  returns the same
67e0: 20 76 61 6c 75 65 20 61 73 20 64 61 74 65 28 27   value as date('
67f0: 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  now')..*/.static
6800: 20 76 6f 69 64 20 63 64 61 74 65 46 75 6e 63 28   void cdateFunc(
6810: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
6820: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
6830: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
6840: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f  lite3_value **No
6850: 74 55 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53  tUsed2.){.  UNUS
6860: 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
6870: 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
6880: 3b 0a 20 20 64 61 74 65 46 75 6e 63 28 63 6f 6e  ;.  dateFunc(con
6890: 74 65 78 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  text, 0, 0);.}..
68a0: 2f 2a 0a 2a 2a 20 63 75 72 72 65 6e 74 5f 74 69  /*.** current_ti
68b0: 6d 65 73 74 61 6d 70 28 29 0a 2a 2a 0a 2a 2a 20  mestamp().**.** 
68c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
68d0: 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 76  turns the same v
68e0: 61 6c 75 65 20 61 73 20 64 61 74 65 74 69 6d 65  alue as datetime
68f0: 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74 61 74  ('now')..*/.stat
6900: 69 63 20 76 6f 69 64 20 63 74 69 6d 65 73 74 61  ic void ctimesta
6910: 6d 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  mpFunc(.  sqlite
6920: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
6930: 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65  xt,.  int NotUse
6940: 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  d,.  sqlite3_val
6950: 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b  ue **NotUsed2.){
6960: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6970: 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
6980: 74 55 73 65 64 32 29 3b 0a 20 20 64 61 74 65 74  tUsed2);.  datet
6990: 69 6d 65 46 75 6e 63 28 63 6f 6e 74 65 78 74 2c  imeFunc(context,
69a0: 20 30 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66   0, 0);.}.#endif
69b0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
69c0: 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d  ITE_OMIT_DATETIM
69d0: 45 5f 46 55 4e 43 53 29 20 2a 2f 0a 0a 23 69 66  E_FUNCS) */..#if
69e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
69f0: 44 41 54 45 54 49 4d 45 5f 46 55 4e 43 53 0a 2f  DATETIME_FUNCS./
6a00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 69 62 72  *.** If the libr
6a10: 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ary is compiled 
6a20: 74 6f 20 6f 6d 69 74 20 74 68 65 20 66 75 6c 6c  to omit the full
6a30: 2d 73 63 61 6c 65 20 64 61 74 65 20 61 6e 64 20  -scale date and 
6a40: 74 69 6d 65 0a 2a 2a 20 68 61 6e 64 6c 69 6e 67  time.** handling
6a50: 20 28 74 6f 20 67 65 74 20 61 20 73 6d 61 6c 6c   (to get a small
6a60: 65 72 20 62 69 6e 61 72 79 29 2c 20 74 68 65 20  er binary), the 
6a70: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 69 6e 69 6d 61  following minima
6a80: 6c 20 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20  l version.** of 
6a90: 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 63 75  the functions cu
6aa0: 72 72 65 6e 74 5f 74 69 6d 65 28 29 2c 20 63 75  rrent_time(), cu
6ab0: 72 72 65 6e 74 5f 64 61 74 65 28 29 20 61 6e 64  rrent_date() and
6ac0: 20 63 75 72 72 65 6e 74 5f 74 69 6d 65 73 74 61   current_timesta
6ad0: 6d 70 28 29 0a 2a 2a 20 61 72 65 20 69 6e 63 6c  mp().** are incl
6ae0: 75 64 65 64 20 69 6e 73 74 65 61 64 2e 20 54 68  uded instead. Th
6af0: 69 73 20 69 73 20 74 6f 20 73 75 70 70 6f 72 74  is is to support
6b00: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
6b10: 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20 69 6e 63  ions that.** inc
6b20: 6c 75 64 65 20 22 44 45 46 41 55 4c 54 20 43 55  lude "DEFAULT CU
6b30: 52 52 45 4e 54 5f 54 49 4d 45 22 20 65 74 63 2e  RRENT_TIME" etc.
6b40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6b50: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 43 2d  tion uses the C-
6b60: 6c 69 62 72 61 72 79 20 66 75 6e 63 74 69 6f 6e  library function
6b70: 73 20 74 69 6d 65 28 29 2c 20 67 6d 74 69 6d 65  s time(), gmtime
6b80: 28 29 0a 2a 2a 20 61 6e 64 20 73 74 72 66 74 69  ().** and strfti
6b90: 6d 65 28 29 2e 20 54 68 65 20 66 6f 72 6d 61 74  me(). The format
6ba0: 20 73 74 72 69 6e 67 20 74 6f 20 70 61 73 73 20   string to pass 
6bb0: 74 6f 20 73 74 72 66 74 69 6d 65 28 29 20 69 73  to strftime() is
6bc0: 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 61 73 20   supplied.** as 
6bd0: 74 68 65 20 75 73 65 72 2d 64 61 74 61 20 66 6f  the user-data fo
6be0: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  r the function..
6bf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
6c00: 75 72 72 65 6e 74 54 69 6d 65 46 75 6e 63 28 0a  urrentTimeFunc(.
6c10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6c20: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
6c30: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
6c40: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6c50: 7b 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  {.  time_t t;.  
6c60: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20  char *zFormat = 
6c70: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
6c80: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
6c90: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t);.  sqlite3 *d
6ca0: 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  b;.  sqlite3_int
6cb0: 36 34 20 69 54 3b 0a 20 20 73 74 72 75 63 74 20  64 iT;.  struct 
6cc0: 74 6d 20 2a 70 54 6d 3b 0a 20 20 73 74 72 75 63  tm *pTm;.  struc
6cd0: 74 20 74 6d 20 73 4e 6f 77 3b 0a 20 20 63 68 61  t tm sNow;.  cha
6ce0: 72 20 7a 42 75 66 5b 32 30 5d 3b 0a 0a 20 20 55  r zBuf[20];..  U
6cf0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6d00: 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
6d10: 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b  PARAMETER(argv);
6d20: 0a 0a 20 20 69 54 20 3d 20 73 71 6c 69 74 65 33  ..  iT = sqlite3
6d30: 53 74 6d 74 43 75 72 72 65 6e 74 54 69 6d 65 28  StmtCurrentTime(
6d40: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 66 28 20  context);.  if( 
6d50: 69 54 3c 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  iT<=0 ) return;.
6d60: 20 20 74 20 3d 20 69 54 2f 31 30 30 30 20 2d 20    t = iT/1000 - 
6d70: 31 30 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69  10000*(sqlite3_i
6d80: 6e 74 36 34 29 32 31 30 38 36 36 37 36 3b 0a 23  nt64)21086676;.#
6d90: 69 66 64 65 66 20 48 41 56 45 5f 47 4d 54 49 4d  ifdef HAVE_GMTIM
6da0: 45 5f 52 0a 20 20 70 54 6d 20 3d 20 67 6d 74 69  E_R.  pTm = gmti
6db0: 6d 65 5f 72 28 26 74 2c 20 26 73 4e 6f 77 29 3b  me_r(&t, &sNow);
6dc0: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
6dd0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
6de0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
6df0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6e00: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 20 20 70  IC_MASTER));.  p
6e10: 54 6d 20 3d 20 67 6d 74 69 6d 65 28 26 74 29 3b  Tm = gmtime(&t);
6e20: 0a 20 20 69 66 28 20 70 54 6d 20 29 20 6d 65 6d  .  if( pTm ) mem
6e30: 63 70 79 28 26 73 4e 6f 77 2c 20 70 54 6d 2c 20  cpy(&sNow, pTm, 
6e40: 73 69 7a 65 6f 66 28 73 4e 6f 77 29 29 3b 0a 20  sizeof(sNow));. 
6e50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
6e60: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
6e70: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
6e80: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
6e90: 52 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  R));.#endif.  if
6ea0: 28 20 70 54 6d 20 29 7b 0a 20 20 20 20 73 74 72  ( pTm ){.    str
6eb0: 66 74 69 6d 65 28 7a 42 75 66 2c 20 32 30 2c 20  ftime(zBuf, 20, 
6ec0: 7a 46 6f 72 6d 61 74 2c 20 26 73 4e 6f 77 29 3b  zFormat, &sNow);
6ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
6ee0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
6ef0: 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49  , zBuf, -1, SQLI
6f00: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
6f10: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
6f20: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6f30: 20 72 65 67 69 73 74 65 72 65 64 20 61 6c 6c 20   registered all 
6f40: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 43 20 66  of the above C f
6f50: 75 6e 63 74 69 6f 6e 73 20 61 73 20 53 51 4c 0a  unctions as SQL.
6f60: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  ** functions.  T
6f70: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  his should be th
6f80: 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69  e only routine i
6f90: 6e 20 74 68 69 73 20 66 69 6c 65 20 77 69 74 68  n this file with
6fa0: 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e  .** external lin
6fb0: 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  kage..*/.void sq
6fc0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 44 61 74  lite3RegisterDat
6fd0: 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e 73 28 76  eTimeFunctions(v
6fe0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 53  oid){.  static S
6ff0: 51 4c 49 54 45 5f 57 53 44 20 46 75 6e 63 44 65  QLITE_WSD FuncDe
7000: 66 20 61 44 61 74 65 54 69 6d 65 46 75 6e 63 73  f aDateTimeFuncs
7010: 5b 5d 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 53  [] = {.#ifndef S
7020: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54  QLITE_OMIT_DATET
7030: 49 4d 45 5f 46 55 4e 43 53 0a 20 20 20 20 46 55  IME_FUNCS.    FU
7040: 4e 43 54 49 4f 4e 28 6a 75 6c 69 61 6e 64 61 79  NCTION(julianday
7050: 2c 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20  ,        -1, 0, 
7060: 30 2c 20 6a 75 6c 69 61 6e 64 61 79 46 75 6e 63  0, juliandayFunc
7070: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
7080: 28 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  (date,          
7090: 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 64 61 74     -1, 0, 0, dat
70a0: 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20  eFunc      ),.  
70b0: 20 20 46 55 4e 43 54 49 4f 4e 28 74 69 6d 65 2c    FUNCTION(time,
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
70d0: 20 30 2c 20 30 2c 20 74 69 6d 65 46 75 6e 63 20   0, 0, timeFunc 
70e0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
70f0: 54 49 4f 4e 28 64 61 74 65 74 69 6d 65 2c 20 20  TION(datetime,  
7100: 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c         -1, 0, 0,
7110: 20 64 61 74 65 74 69 6d 65 46 75 6e 63 20 20 29   datetimeFunc  )
7120: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  ,.    FUNCTION(s
7130: 74 72 66 74 69 6d 65 2c 20 20 20 20 20 20 20 20  trftime,        
7140: 20 2d 31 2c 20 30 2c 20 30 2c 20 73 74 72 66 74   -1, 0, 0, strft
7150: 69 6d 65 46 75 6e 63 20 20 29 2c 0a 20 20 20 20  imeFunc  ),.    
7160: 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 6e 74  FUNCTION(current
7170: 5f 74 69 6d 65 2c 20 20 20 20 20 20 30 2c 20 30  _time,      0, 0
7180: 2c 20 30 2c 20 63 74 69 6d 65 46 75 6e 63 20 20  , 0, ctimeFunc  
7190: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
71a0: 4f 4e 28 63 75 72 72 65 6e 74 5f 74 69 6d 65 73  ON(current_times
71b0: 74 61 6d 70 2c 20 30 2c 20 30 2c 20 30 2c 20 63  tamp, 0, 0, 0, c
71c0: 74 69 6d 65 73 74 61 6d 70 46 75 6e 63 29 2c 0a  timestampFunc),.
71d0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 75 72      FUNCTION(cur
71e0: 72 65 6e 74 5f 64 61 74 65 2c 20 20 20 20 20 20  rent_date,      
71f0: 30 2c 20 30 2c 20 30 2c 20 63 64 61 74 65 46 75  0, 0, 0, cdateFu
7200: 6e 63 20 20 20 20 20 29 2c 0a 23 65 6c 73 65 0a  nc     ),.#else.
7210: 20 20 20 20 53 54 52 5f 46 55 4e 43 54 49 4f 4e      STR_FUNCTION
7220: 28 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 20  (current_time,  
7230: 20 20 20 20 30 2c 20 22 25 48 3a 25 4d 3a 25 53      0, "%H:%M:%S
7240: 22 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20 63  ",          0, c
7250: 75 72 72 65 6e 74 54 69 6d 65 46 75 6e 63 29 2c  urrentTimeFunc),
7260: 0a 20 20 20 20 53 54 52 5f 46 55 4e 43 54 49 4f  .    STR_FUNCTIO
7270: 4e 28 63 75 72 72 65 6e 74 5f 64 61 74 65 2c 20  N(current_date, 
7280: 20 20 20 20 20 30 2c 20 22 25 59 2d 25 6d 2d 25       0, "%Y-%m-%
7290: 64 22 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20  d",          0, 
72a0: 63 75 72 72 65 6e 74 54 69 6d 65 46 75 6e 63 29  currentTimeFunc)
72b0: 2c 0a 20 20 20 20 53 54 52 5f 46 55 4e 43 54 49  ,.    STR_FUNCTI
72c0: 4f 4e 28 63 75 72 72 65 6e 74 5f 74 69 6d 65 73  ON(current_times
72d0: 74 61 6d 70 2c 20 30 2c 20 22 25 59 2d 25 6d 2d  tamp, 0, "%Y-%m-
72e0: 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 30 2c  %d %H:%M:%S", 0,
72f0: 20 63 75 72 72 65 6e 74 54 69 6d 65 46 75 6e 63   currentTimeFunc
7300: 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  ),.#endif.  };. 
7310: 20 69 6e 74 20 69 3b 0a 20 20 46 75 6e 63 44 65   int i;.  FuncDe
7320: 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26  fHash *pHash = &
7330: 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61  GLOBAL(FuncDefHa
7340: 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  sh, sqlite3Globa
7350: 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 46  lFunctions);.  F
7360: 75 6e 63 44 65 66 20 2a 61 46 75 6e 63 20 3d 20  uncDef *aFunc = 
7370: 28 46 75 6e 63 44 65 66 2a 29 26 47 4c 4f 42 41  (FuncDef*)&GLOBA
7380: 4c 28 46 75 6e 63 44 65 66 2c 20 61 44 61 74 65  L(FuncDef, aDate
7390: 54 69 6d 65 46 75 6e 63 73 29 3b 0a 0a 20 20 66  TimeFuncs);..  f
73a0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
73b0: 69 7a 65 28 61 44 61 74 65 54 69 6d 65 46 75 6e  ize(aDateTimeFun
73c0: 63 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  cs); i++){.    s
73d0: 71 6c 69 74 65 33 46 75 6e 63 44 65 66 49 6e 73  qlite3FuncDefIns
73e0: 65 72 74 28 70 48 61 73 68 2c 20 26 61 46 75 6e  ert(pHash, &aFun
73f0: 63 5b 69 5d 29 3b 0a 20 20 7d 0a 7d 0a           c[i]);.  }.}.