/ Hex Artifact Content
Login

Artifact e841168e5520bbbb2a1cbcdce7531d8b23017b4d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 4f 63 74 6f 62  /*.** 2003 Octob
0010: 65 72 20 33 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 31.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  e contains the C
0190: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
01a0: 69 6d 70 6c 65 6d 65 6e 74 20 64 61 74 65 20 61  implement date a
01b0: 6e 64 20 74 69 6d 65 0a 2a 2a 20 66 75 6e 63 74  nd time.** funct
01c0: 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 2e  ions for SQLite.
01d0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69    .**.** There i
01e0: 73 20 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72  s only one expor
01f0: 74 65 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  ted symbol in th
0200: 69 73 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75  is file - the fu
0210: 6e 63 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65  nction.** sqlite
0220: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
0230: 65 46 75 6e 63 74 69 6f 6e 73 28 29 20 66 6f 75  eFunctions() fou
0240: 6e 64 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  nd at the bottom
0250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   of the file..**
0260: 20 41 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   All other code 
0270: 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 2e 0a  has file scope..
0280: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64 61 74 65 2e  **.** $Id: date.
0290: 63 2c 76 20 31 2e 38 35 20 32 30 30 38 2f 30 36  c,v 1.85 2008/06
02a0: 2f 31 38 20 31 37 3a 30 39 3a 31 30 20 64 61 6e  /18 17:09:10 dan
02b0: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a  ielk1977 Exp $.*
02c0: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 70 72 6f 63  *.** SQLite proc
02d0: 65 73 73 65 73 20 61 6c 6c 20 74 69 6d 65 73 20  esses all times 
02e0: 61 6e 64 20 64 61 74 65 73 20 61 73 20 4a 75 6c  and dates as Jul
02f0: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 73 2e  ian Day numbers.
0300: 20 20 54 68 65 0a 2a 2a 20 64 61 74 65 73 20 61    The.** dates a
0310: 6e 64 20 74 69 6d 65 73 20 61 72 65 20 73 74 6f  nd times are sto
0320: 72 65 64 20 61 73 20 74 68 65 20 6e 75 6d 62 65  red as the numbe
0330: 72 20 6f 66 20 64 61 79 73 20 73 69 6e 63 65 20  r of days since 
0340: 6e 6f 6f 6e 0a 2a 2a 20 69 6e 20 47 72 65 65 6e  noon.** in Green
0350: 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
0360: 20 32 34 2c 20 34 37 31 34 20 42 2e 43 2e 20 61   24, 4714 B.C. a
0370: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
0380: 47 72 65 67 6f 72 69 61 6e 0a 2a 2a 20 63 61 6c  Gregorian.** cal
0390: 65 6e 64 61 72 20 73 79 73 74 65 6d 2e 20 0a 2a  endar system. .*
03a0: 2a 0a 2a 2a 20 31 39 37 30 2d 30 31 2d 30 31 20  *.** 1970-01-01 
03b0: 30 30 3a 30 30 3a 30 30 20 69 73 20 4a 44 20 32  00:00:00 is JD 2
03c0: 34 34 30 35 38 37 2e 35 0a 2a 2a 20 32 30 30 30  440587.5.** 2000
03d0: 2d 30 31 2d 30 31 20 30 30 3a 30 30 3a 30 30 20  -01-01 00:00:00 
03e0: 69 73 20 4a 44 20 32 34 35 31 35 34 34 2e 35 0a  is JD 2451544.5.
03f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c 65  **.** This imple
0400: 6d 65 6e 74 69 6f 6e 20 72 65 71 75 69 72 65 73  mention requires
0410: 20 79 65 61 72 73 20 74 6f 20 62 65 20 65 78 70   years to be exp
0420: 72 65 73 73 65 64 20 61 73 20 61 20 34 2d 64 69  ressed as a 4-di
0430: 67 69 74 20 6e 75 6d 62 65 72 0a 2a 2a 20 77 68  git number.** wh
0440: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ich means that o
0450: 6e 6c 79 20 64 61 74 65 73 20 62 65 74 77 65 65  nly dates betwee
0460: 6e 20 30 30 30 30 2d 30 31 2d 30 31 20 61 6e 64  n 0000-01-01 and
0470: 20 39 39 39 39 2d 31 32 2d 33 31 20 63 61 6e 0a   9999-12-31 can.
0480: 2a 2a 20 62 65 20 72 65 70 72 65 73 65 6e 74 65  ** be represente
0490: 64 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 6a  d, even though j
04a0: 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72  ulian day number
04b0: 73 20 61 6c 6c 6f 77 20 61 20 6d 75 63 68 20 77  s allow a much w
04c0: 69 64 65 72 0a 2a 2a 20 72 61 6e 67 65 20 6f 66  ider.** range of
04d0: 20 64 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   dates..**.** Th
04e0: 65 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  e Gregorian cale
04f0: 6e 64 61 72 20 73 79 73 74 65 6d 20 69 73 20 75  ndar system is u
0500: 73 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 65  sed for all date
0510: 73 20 61 6e 64 20 74 69 6d 65 73 2c 0a 2a 2a 20  s and times,.** 
0520: 65 76 65 6e 20 74 68 6f 73 65 20 74 68 61 74 20  even those that 
0530: 70 72 65 64 61 74 65 20 74 68 65 20 47 72 65 67  predate the Greg
0540: 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 20  orian calendar. 
0550: 20 48 69 73 74 6f 72 69 61 6e 73 20 75 73 75 61   Historians usua
0560: 6c 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 4a  lly.** use the J
0570: 75 6c 69 61 6e 20 63 61 6c 65 6e 64 61 72 20 66  ulian calendar f
0580: 6f 72 20 64 61 74 65 73 20 70 72 69 6f 72 20 74  or dates prior t
0590: 6f 20 31 35 38 32 2d 31 30 2d 31 35 20 61 6e 64  o 1582-10-15 and
05a0: 20 66 6f 72 20 73 6f 6d 65 0a 2a 2a 20 64 61 74   for some.** dat
05b0: 65 73 20 61 66 74 65 72 77 61 72 64 73 2c 20 64  es afterwards, d
05c0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 6c 6f 63 61  epending on loca
05d0: 6c 65 2e 20 20 42 65 77 61 72 65 20 6f 66 20 74  le.  Beware of t
05e0: 68 69 73 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  his difference..
05f0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 76 65 72  **.** The conver
0600: 73 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  sion algorithms 
0610: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
0620: 62 61 73 65 64 20 6f 6e 20 64 65 73 63 72 69 70  based on descrip
0630: 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  tions.** in the 
0640: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 3a 0a  following text:.
0650: 2a 2a 0a 2a 2a 20 20 20 20 20 20 4a 65 61 6e 20  **.**      Jean 
0660: 4d 65 65 75 73 0a 2a 2a 20 20 20 20 20 20 41 73  Meeus.**      As
0670: 74 72 6f 6e 6f 6d 69 63 61 6c 20 41 6c 67 6f 72  tronomical Algor
0680: 69 74 68 6d 73 2c 20 32 6e 64 20 45 64 69 74 69  ithms, 2nd Editi
0690: 6f 6e 2c 20 31 39 39 38 0a 2a 2a 20 20 20 20 20  on, 1998.**     
06a0: 20 49 53 42 4d 20 30 2d 39 34 33 33 39 36 2d 36   ISBM 0-943396-6
06b0: 31 2d 31 0a 2a 2a 20 20 20 20 20 20 57 69 6c 6c  1-1.**      Will
06c0: 6d 61 6e 6e 2d 42 65 6c 6c 2c 20 49 6e 63 0a 2a  mann-Bell, Inc.*
06d0: 2a 20 20 20 20 20 20 52 69 63 68 6d 6f 6e 64 2c  *      Richmond,
06e0: 20 56 69 72 67 69 6e 69 61 20 28 55 53 41 29 0a   Virginia (USA).
06f0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0700: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0710: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e  de <ctype.h>.#in
0720: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
0730: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0740: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74  t.h>.#include <t
0750: 69 6d 65 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20  ime.h>..#ifndef 
0760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45  SQLITE_OMIT_DATE
0770: 54 49 4d 45 5f 46 55 4e 43 53 0a 0a 2f 2a 0a 2a  TIME_FUNCS../*.*
0780: 2a 20 4f 6e 20 72 65 63 65 6e 74 20 57 69 6e 64  * On recent Wind
0790: 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 2c 20 74  ows platforms, t
07a0: 68 65 20 6c 6f 63 61 6c 74 69 6d 65 5f 73 28 29  he localtime_s()
07b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61   function is ava
07c0: 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 70 61 72  ilable.** as par
07d0: 74 20 6f 66 20 74 68 65 20 22 53 65 63 75 72 65  t of the "Secure
07e0: 20 43 52 54 22 2e 20 49 74 20 69 73 20 65 73 73   CRT". It is ess
07f0: 65 6e 74 69 61 6c 6c 79 20 65 71 75 69 76 61 6c  entially equival
0800: 65 6e 74 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 6c  ent to .** local
0810: 74 69 6d 65 5f 72 28 29 20 61 76 61 69 6c 61 62  time_r() availab
0820: 6c 65 20 75 6e 64 65 72 20 6d 6f 73 74 20 50 4f  le under most PO
0830: 53 49 58 20 70 6c 61 74 66 6f 72 6d 73 2c 20 65  SIX platforms, e
0840: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 0a  xcept that the .
0850: 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20  ** order of the 
0860: 70 61 72 61 6d 65 74 65 72 73 20 69 73 20 72 65  parameters is re
0870: 76 65 72 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65  versed..**.** Se
0880: 65 20 68 74 74 70 3a 2f 2f 6d 73 64 6e 2e 6d 69  e http://msdn.mi
0890: 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 65 6e 2d 75  crosoft.com/en-u
08a0: 73 2f 6c 69 62 72 61 72 79 2f 61 34 34 32 78 33  s/library/a442x3
08b0: 79 65 28 56 53 2e 38 30 29 2e 61 73 70 78 2e 0a  ye(VS.80).aspx..
08c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65  **.** If the use
08d0: 72 20 68 61 73 20 6e 6f 74 20 69 6e 64 69 63 61  r has not indica
08e0: 74 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 61 6c  ted to use local
08f0: 74 69 6d 65 5f 72 28 29 20 6f 72 20 6c 6f 63 61  time_r() or loca
0900: 6c 74 69 6d 65 5f 73 28 29 0a 2a 2a 20 61 6c 72  ltime_s().** alr
0910: 65 61 64 79 2c 20 63 68 65 63 6b 20 66 6f 72 20  eady, check for 
0920: 61 6e 20 4d 53 56 43 20 62 75 69 6c 64 20 65 6e  an MSVC build en
0930: 76 69 72 6f 6e 6d 65 6e 74 20 74 68 61 74 20 70  vironment that p
0940: 72 6f 76 69 64 65 73 20 0a 2a 2a 20 6c 6f 63 61  rovides .** loca
0950: 6c 74 69 6d 65 5f 73 28 29 2e 0a 2a 2f 0a 23 69  ltime_s()..*/.#i
0960: 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f  f !defined(HAVE_
0970: 4c 4f 43 41 4c 54 49 4d 45 5f 52 29 20 26 26 20  LOCALTIME_R) && 
0980: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 4f  !defined(HAVE_LO
0990: 43 41 4c 54 49 4d 45 5f 53 29 20 26 26 20 5c 0a  CALTIME_S) && \.
09a0: 20 20 20 20 20 64 65 66 69 6e 65 64 28 5f 4d 53       defined(_MS
09b0: 43 5f 56 45 52 29 20 26 26 20 64 65 66 69 6e 65  C_VER) && define
09c0: 64 28 5f 43 52 54 5f 49 4e 53 45 43 55 52 45 5f  d(_CRT_INSECURE_
09d0: 44 45 50 52 45 43 41 54 45 29 0a 23 64 65 66 69  DEPRECATE).#defi
09e0: 6e 65 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d  ne HAVE_LOCALTIM
09f0: 45 5f 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  E_S 1.#endif../*
0a00: 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20  .** A structure 
0a10: 66 6f 72 20 68 6f 6c 64 69 6e 67 20 61 20 73 69  for holding a si
0a20: 6e 67 6c 65 20 64 61 74 65 20 61 6e 64 20 74 69  ngle date and ti
0a30: 6d 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  me..*/.typedef s
0a40: 74 72 75 63 74 20 44 61 74 65 54 69 6d 65 20 44  truct DateTime D
0a50: 61 74 65 54 69 6d 65 3b 0a 73 74 72 75 63 74 20  ateTime;.struct 
0a60: 44 61 74 65 54 69 6d 65 20 7b 0a 20 20 73 71 6c  DateTime {.  sql
0a70: 69 74 65 33 5f 69 6e 74 36 34 20 69 4a 44 3b 20  ite3_int64 iJD; 
0a80: 2f 2a 20 54 68 65 20 6a 75 6c 69 61 6e 20 64 61  /* The julian da
0a90: 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
0aa0: 36 34 30 30 30 30 30 20 2a 2f 0a 20 20 69 6e 74  6400000 */.  int
0ab0: 20 59 2c 20 4d 2c 20 44 3b 20 20 20 20 20 20 20   Y, M, D;       
0ac0: 2f 2a 20 59 65 61 72 2c 20 6d 6f 6e 74 68 2c 20  /* Year, month, 
0ad0: 61 6e 64 20 64 61 79 20 2a 2f 0a 20 20 69 6e 74  and day */.  int
0ae0: 20 68 2c 20 6d 3b 20 20 20 20 20 20 20 20 20 20   h, m;          
0af0: 2f 2a 20 48 6f 75 72 20 61 6e 64 20 6d 69 6e 75  /* Hour and minu
0b00: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 74 7a 3b  tes */.  int tz;
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b20: 69 6d 65 7a 6f 6e 65 20 6f 66 66 73 65 74 20 69  imezone offset i
0b30: 6e 20 6d 69 6e 75 74 65 73 20 2a 2f 0a 20 20 64  n minutes */.  d
0b40: 6f 75 62 6c 65 20 73 3b 20 20 20 20 20 20 20 20  ouble s;        
0b50: 20 20 2f 2a 20 53 65 63 6f 6e 64 73 20 2a 2f 0a    /* Seconds */.
0b60: 20 20 63 68 61 72 20 76 61 6c 69 64 59 4d 44 3b    char validYMD;
0b70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0b80: 59 2c 4d 2c 44 20 61 72 65 20 76 61 6c 69 64 20  Y,M,D are valid 
0b90: 2a 2f 0a 20 20 63 68 61 72 20 76 61 6c 69 64 48  */.  char validH
0ba0: 4d 53 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  MS;     /* True 
0bb0: 69 66 20 68 2c 6d 2c 73 20 61 72 65 20 76 61 6c  if h,m,s are val
0bc0: 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 76 61 6c  id */.  char val
0bd0: 69 64 4a 44 3b 20 20 20 20 20 20 2f 2a 20 54 72  idJD;      /* Tr
0be0: 75 65 20 69 66 20 69 4a 44 20 69 73 20 76 61 6c  ue if iJD is val
0bf0: 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 76 61 6c  id */.  char val
0c00: 69 64 54 5a 3b 20 20 20 20 20 20 2f 2a 20 54 72  idTZ;      /* Tr
0c10: 75 65 20 69 66 20 74 7a 20 69 73 20 76 61 6c 69  ue if tz is vali
0c20: 64 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  d */.};.../*.** 
0c30: 43 6f 6e 76 65 72 74 20 7a 44 61 74 65 20 69 6e  Convert zDate in
0c40: 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  to one or more i
0c50: 6e 74 65 67 65 72 73 2e 20 20 41 64 64 69 74 69  ntegers.  Additi
0c60: 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 0a 2a  onal arguments.*
0c70: 2a 20 63 6f 6d 65 20 69 6e 20 67 72 6f 75 70 73  * come in groups
0c80: 20 6f 66 20 35 20 61 73 20 66 6f 6c 6c 6f 77 73   of 5 as follows
0c90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4e 20  :.**.**       N 
0ca0: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
0cb0: 64 69 67 69 74 73 20 69 6e 20 74 68 65 20 69 6e  digits in the in
0cc0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 6d  teger.**       m
0cd0: 69 6e 20 20 20 20 20 6d 69 6e 69 6d 75 6d 20 61  in     minimum a
0ce0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 20 6f 66 20  llowed value of 
0cf0: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  the integer.**  
0d00: 20 20 20 20 20 6d 61 78 20 20 20 20 20 6d 61 78       max     max
0d10: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 76 61 6c  imum allowed val
0d20: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 6e 65 78 74 43  r.**       nextC
0d40: 20 20 20 66 69 72 73 74 20 63 68 61 72 61 63 74     first charact
0d50: 65 72 20 61 66 74 65 72 20 74 68 65 20 69 6e 74  er after the int
0d60: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 70 56  eger.**       pV
0d70: 61 6c 20 20 20 20 77 68 65 72 65 20 74 6f 20 77  al    where to w
0d80: 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  rite the integer
0d90: 73 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 43  s value..**.** C
0da0: 6f 6e 76 65 72 73 69 6f 6e 73 20 63 6f 6e 74 69  onversions conti
0db0: 6e 75 65 20 75 6e 74 69 6c 20 6f 6e 65 20 77 69  nue until one wi
0dc0: 74 68 20 6e 65 78 74 43 3d 3d 30 20 69 73 20 65  th nextC==0 is e
0dd0: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 20 54  ncountered..** T
0de0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
0df0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
0e00: 66 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 6e  f successful con
0e10: 76 65 72 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  versions..*/.sta
0e20: 74 69 63 20 69 6e 74 20 67 65 74 44 69 67 69 74  tic int getDigit
0e30: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  s(const char *zD
0e40: 61 74 65 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  ate, ...){.  va_
0e50: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 76  list ap;.  int v
0e60: 61 6c 3b 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69  al;.  int N;.  i
0e70: 6e 74 20 6d 69 6e 3b 0a 20 20 69 6e 74 20 6d 61  nt min;.  int ma
0e80: 78 3b 0a 20 20 69 6e 74 20 6e 65 78 74 43 3b 0a  x;.  int nextC;.
0e90: 20 20 69 6e 74 20 2a 70 56 61 6c 3b 0a 20 20 69    int *pVal;.  i
0ea0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 76 61  nt cnt = 0;.  va
0eb0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 44 61 74 65  _start(ap, zDate
0ec0: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 4e 20 3d  );.  do{.    N =
0ed0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
0ee0: 3b 0a 20 20 20 20 6d 69 6e 20 3d 20 76 61 5f 61  ;.    min = va_a
0ef0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
0f00: 20 6d 61 78 20 3d 20 76 61 5f 61 72 67 28 61 70   max = va_arg(ap
0f10: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 6e 65 78 74  , int);.    next
0f20: 43 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  C = va_arg(ap, i
0f30: 6e 74 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  nt);.    pVal = 
0f40: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
0f50: 3b 0a 20 20 20 20 76 61 6c 20 3d 20 30 3b 0a 20  ;.    val = 0;. 
0f60: 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b     while( N-- ){
0f70: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 64 69  .      if( !isdi
0f80: 67 69 74 28 2a 28 75 38 2a 29 7a 44 61 74 65 29  git(*(u8*)zDate)
0f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
0fa0: 20 65 6e 64 5f 67 65 74 44 69 67 69 74 73 3b 0a   end_getDigits;.
0fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76 61        }.      va
0fc0: 6c 20 3d 20 76 61 6c 2a 31 30 20 2b 20 2a 7a 44  l = val*10 + *zD
0fd0: 61 74 65 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  ate - '0';.     
0fe0: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a   zDate++;.    }.
0ff0: 20 20 20 20 69 66 28 20 76 61 6c 3c 6d 69 6e 20      if( val<min 
1000: 7c 7c 20 76 61 6c 3e 6d 61 78 20 7c 7c 20 28 6e  || val>max || (n
1010: 65 78 74 43 21 3d 30 20 26 26 20 6e 65 78 74 43  extC!=0 && nextC
1020: 21 3d 2a 7a 44 61 74 65 29 20 29 7b 0a 20 20 20  !=*zDate) ){.   
1030: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 67 65 74 44     goto end_getD
1040: 69 67 69 74 73 3b 0a 20 20 20 20 7d 0a 20 20 20  igits;.    }.   
1050: 20 2a 70 56 61 6c 20 3d 20 76 61 6c 3b 0a 20 20   *pVal = val;.  
1060: 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 63    zDate++;.    c
1070: 6e 74 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  nt++;.  }while( 
1080: 6e 65 78 74 43 20 29 3b 0a 65 6e 64 5f 67 65 74  nextC );.end_get
1090: 44 69 67 69 74 73 3a 0a 20 20 76 61 5f 65 6e 64  Digits:.  va_end
10a0: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  (ap);.  return c
10b0: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  nt;.}../*.** Rea
10c0: 64 20 74 65 78 74 20 66 72 6f 6d 20 7a 5b 5d 20  d text from z[] 
10d0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 69 6e 74 6f  and convert into
10e0: 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e   a floating poin
10f0: 74 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  t number.  Retur
1100: 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
1110: 6f 66 20 64 69 67 69 74 73 20 63 6f 6e 76 65 72  of digits conver
1120: 74 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ted..*/.#define 
1130: 67 65 74 56 61 6c 75 65 20 73 71 6c 69 74 65 33  getValue sqlite3
1140: 41 74 6f 46 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  AtoF../*.** Pars
1150: 65 20 61 20 74 69 6d 65 7a 6f 6e 65 20 65 78 74  e a timezone ext
1160: 65 6e 73 69 6f 6e 20 6f 6e 20 74 68 65 20 65 6e  ension on the en
1170: 64 20 6f 66 20 61 20 64 61 74 65 2d 74 69 6d 65  d of a date-time
1180: 2e 0a 2a 2a 20 54 68 65 20 65 78 74 65 6e 73 69  ..** The extensi
1190: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
11a0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
11b0: 28 2b 2f 2d 29 48 48 3a 4d 4d 0a 2a 2a 0a 2a 2a  (+/-)HH:MM.**.**
11c0: 20 4f 72 20 74 68 65 20 22 7a 75 6c 75 22 20 6e   Or the "zulu" n
11d0: 6f 74 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  otation:.**.**  
11e0: 20 20 20 20 20 20 5a 0a 2a 2a 0a 2a 2a 20 49 66        Z.**.** If
11f0: 20 74 68 65 20 70 61 72 73 65 20 69 73 20 73 75   the parse is su
1200: 63 63 65 73 73 66 75 6c 2c 20 77 72 69 74 65 20  ccessful, write 
1210: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
1220: 6e 75 74 65 73 0a 2a 2a 20 6f 66 20 63 68 61 6e  nutes.** of chan
1230: 67 65 20 69 6e 20 70 2d 3e 74 7a 20 61 6e 64 20  ge in p->tz and 
1240: 72 65 74 75 72 6e 20 30 2e 20 20 49 66 20 61 20  return 0.  If a 
1250: 70 61 72 73 65 72 20 65 72 72 6f 72 20 6f 63 63  parser error occ
1260: 75 72 73 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 6e  urs,.** return n
1270: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 41  on-zero..**.** A
1280: 20 6d 69 73 73 69 6e 67 20 73 70 65 63 69 66 69   missing specifi
1290: 65 72 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  er is not consid
12a0: 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ered an error..*
12b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72  /.static int par
12c0: 73 65 54 69 6d 65 7a 6f 6e 65 28 63 6f 6e 73 74  seTimezone(const
12d0: 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 44 61   char *zDate, Da
12e0: 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  teTime *p){.  in
12f0: 74 20 73 67 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  t sgn = 0;.  int
1300: 20 6e 48 72 2c 20 6e 4d 6e 3b 0a 20 20 69 6e 74   nHr, nMn;.  int
1310: 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73   c;.  while( iss
1320: 70 61 63 65 28 2a 28 75 38 2a 29 7a 44 61 74 65  pace(*(u8*)zDate
1330: 29 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d 0a  ) ){ zDate++; }.
1340: 20 20 70 2d 3e 74 7a 20 3d 20 30 3b 0a 20 20 63    p->tz = 0;.  c
1350: 20 3d 20 2a 7a 44 61 74 65 3b 0a 20 20 69 66 28   = *zDate;.  if(
1360: 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 73   c=='-' ){.    s
1370: 67 6e 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  gn = -1;.  }else
1380: 20 69 66 28 20 63 3d 3d 27 2b 27 20 29 7b 0a 20   if( c=='+' ){. 
1390: 20 20 20 73 67 6e 20 3d 20 2b 31 3b 0a 20 20 7d     sgn = +1;.  }
13a0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5a 27 20  else if( c=='Z' 
13b0: 7c 7c 20 63 3d 3d 27 7a 27 20 29 7b 0a 20 20 20  || c=='z' ){.   
13c0: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 67 6f   zDate++;.    go
13d0: 74 6f 20 7a 75 6c 75 5f 74 69 6d 65 3b 0a 20 20  to zulu_time;.  
13e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
13f0: 6e 20 63 21 3d 30 3b 0a 20 20 7d 0a 20 20 7a 44  n c!=0;.  }.  zD
1400: 61 74 65 2b 2b 3b 0a 20 20 69 66 28 20 67 65 74  ate++;.  if( get
1410: 44 69 67 69 74 73 28 7a 44 61 74 65 2c 20 32 2c  Digits(zDate, 2,
1420: 20 30 2c 20 31 34 2c 20 27 3a 27 2c 20 26 6e 48   0, 14, ':', &nH
1430: 72 2c 20 32 2c 20 30 2c 20 35 39 2c 20 30 2c 20  r, 2, 0, 59, 0, 
1440: 26 6e 4d 6e 29 21 3d 32 20 29 7b 0a 20 20 20 20  &nMn)!=2 ){.    
1450: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1460: 7a 44 61 74 65 20 2b 3d 20 35 3b 0a 20 20 70 2d  zDate += 5;.  p-
1470: 3e 74 7a 20 3d 20 73 67 6e 2a 28 6e 4d 6e 20 2b  >tz = sgn*(nMn +
1480: 20 6e 48 72 2a 36 30 29 3b 0a 7a 75 6c 75 5f 74   nHr*60);.zulu_t
1490: 69 6d 65 3a 0a 20 20 77 68 69 6c 65 28 20 69 73  ime:.  while( is
14a0: 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 44 61 74  space(*(u8*)zDat
14b0: 65 29 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d  e) ){ zDate++; }
14c0: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 44 61 74 65  .  return *zDate
14d0: 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  !=0;.}../*.** Pa
14e0: 72 73 65 20 74 69 6d 65 73 20 6f 66 20 74 68 65  rse times of the
14f0: 20 66 6f 72 6d 20 48 48 3a 4d 4d 20 6f 72 20 48   form HH:MM or H
1500: 48 3a 4d 4d 3a 53 53 20 6f 72 20 48 48 3a 4d 4d  H:MM:SS or HH:MM
1510: 3a 53 53 2e 46 46 46 46 2e 0a 2a 2a 20 54 68 65  :SS.FFFF..** The
1520: 20 48 48 2c 20 4d 4d 2c 20 61 6e 64 20 53 53 20   HH, MM, and SS 
1530: 6d 75 73 74 20 65 61 63 68 20 62 65 20 65 78 61  must each be exa
1540: 63 74 6c 79 20 32 20 64 69 67 69 74 73 2e 20 20  ctly 2 digits.  
1550: 54 68 65 0a 2a 2a 20 66 72 61 63 74 69 6f 6e 61  The.** fractiona
1560: 6c 20 73 65 63 6f 6e 64 73 20 46 46 46 46 20 63  l seconds FFFF c
1570: 61 6e 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  an be one or mor
1580: 65 20 64 69 67 69 74 73 2e 0a 2a 2a 0a 2a 2a 20  e digits..**.** 
1590: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72  Return 1 if ther
15a0: 65 20 69 73 20 61 20 70 61 72 73 69 6e 67 20 65  e is a parsing e
15b0: 72 72 6f 72 20 61 6e 64 20 30 20 6f 6e 20 73 75  rror and 0 on su
15c0: 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccess..*/.static
15d0: 20 69 6e 74 20 70 61 72 73 65 48 68 4d 6d 53 73   int parseHhMmSs
15e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61  (const char *zDa
15f0: 74 65 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29  te, DateTime *p)
1600: 7b 0a 20 20 69 6e 74 20 68 2c 20 6d 2c 20 73 3b  {.  int h, m, s;
1610: 0a 20 20 64 6f 75 62 6c 65 20 6d 73 20 3d 20 30  .  double ms = 0
1620: 2e 30 3b 0a 20 20 69 66 28 20 67 65 74 44 69 67  .0;.  if( getDig
1630: 69 74 73 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c  its(zDate, 2, 0,
1640: 20 32 34 2c 20 27 3a 27 2c 20 26 68 2c 20 32 2c   24, ':', &h, 2,
1650: 20 30 2c 20 35 39 2c 20 30 2c 20 26 6d 29 21 3d   0, 59, 0, &m)!=
1660: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
1670: 31 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b  1;.  }.  zDate +
1680: 3d 20 35 3b 0a 20 20 69 66 28 20 2a 7a 44 61 74  = 5;.  if( *zDat
1690: 65 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 44  e==':' ){.    zD
16a0: 61 74 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 67  ate++;.    if( g
16b0: 65 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c 20  etDigits(zDate, 
16c0: 32 2c 20 30 2c 20 35 39 2c 20 30 2c 20 26 73 29  2, 0, 59, 0, &s)
16d0: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
16e0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
16f0: 20 7a 44 61 74 65 20 2b 3d 20 32 3b 0a 20 20 20   zDate += 2;.   
1700: 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d 27 2e 27   if( *zDate=='.'
1710: 20 26 26 20 69 73 64 69 67 69 74 28 28 75 38 29   && isdigit((u8)
1720: 7a 44 61 74 65 5b 31 5d 29 20 29 7b 0a 20 20 20  zDate[1]) ){.   
1730: 20 20 20 64 6f 75 62 6c 65 20 72 53 63 61 6c 65     double rScale
1740: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 7a 44   = 1.0;.      zD
1750: 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69  ate++;.      whi
1760: 6c 65 28 20 69 73 64 69 67 69 74 28 2a 28 75 38  le( isdigit(*(u8
1770: 2a 29 7a 44 61 74 65 29 20 29 7b 0a 20 20 20 20  *)zDate) ){.    
1780: 20 20 20 20 6d 73 20 3d 20 6d 73 2a 31 30 2e 30      ms = ms*10.0
1790: 20 2b 20 2a 7a 44 61 74 65 20 2d 20 27 30 27 3b   + *zDate - '0';
17a0: 0a 20 20 20 20 20 20 20 20 72 53 63 61 6c 65 20  .        rScale 
17b0: 2a 3d 20 31 30 2e 30 3b 0a 20 20 20 20 20 20 20  *= 10.0;.       
17c0: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20   zDate++;.      
17d0: 7d 0a 20 20 20 20 20 20 6d 73 20 2f 3d 20 72 53  }.      ms /= rS
17e0: 63 61 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  cale;.    }.  }e
17f0: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 30 3b 0a  lse{.    s = 0;.
1800: 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44    }.  p->validJD
1810: 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64   = 0;.  p->valid
1820: 48 4d 53 20 3d 20 31 3b 0a 20 20 70 2d 3e 68 20  HMS = 1;.  p->h 
1830: 3d 20 68 3b 0a 20 20 70 2d 3e 6d 20 3d 20 6d 3b  = h;.  p->m = m;
1840: 0a 20 20 70 2d 3e 73 20 3d 20 73 20 2b 20 6d 73  .  p->s = s + ms
1850: 3b 0a 20 20 69 66 28 20 70 61 72 73 65 54 69 6d  ;.  if( parseTim
1860: 65 7a 6f 6e 65 28 7a 44 61 74 65 2c 20 70 29 20  ezone(zDate, p) 
1870: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 2d  ) return 1;.  p-
1880: 3e 76 61 6c 69 64 54 5a 20 3d 20 70 2d 3e 74 7a  >validTZ = p->tz
1890: 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  !=0;.  return 0;
18a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
18b0: 74 20 66 72 6f 6d 20 59 59 59 59 2d 4d 4d 2d 44  t from YYYY-MM-D
18c0: 44 20 48 48 3a 4d 4d 3a 53 53 20 74 6f 20 6a 75  D HH:MM:SS to ju
18d0: 6c 69 61 6e 20 64 61 79 2e 20 20 57 65 20 61 6c  lian day.  We al
18e0: 77 61 79 73 20 61 73 73 75 6d 65 0a 2a 2a 20 74  ways assume.** t
18f0: 68 61 74 20 74 68 65 20 59 59 59 59 2d 4d 4d 2d  hat the YYYY-MM-
1900: 44 44 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20  DD is according 
1910: 74 6f 20 74 68 65 20 47 72 65 67 6f 72 69 61 6e  to the Gregorian
1920: 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
1930: 20 52 65 66 65 72 65 6e 63 65 3a 20 20 4d 65 65   Reference:  Mee
1940: 75 73 20 70 61 67 65 20 36 31 0a 2a 2f 0a 73 74  us page 61.*/.st
1950: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
1960: 65 4a 44 28 44 61 74 65 54 69 6d 65 20 2a 70 29  eJD(DateTime *p)
1970: 7b 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c  {.  int Y, M, D,
1980: 20 41 2c 20 42 2c 20 58 31 2c 20 58 32 3b 0a 0a   A, B, X1, X2;..
1990: 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 4a 44    if( p->validJD
19a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
19b0: 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 29 7b 0a   p->validYMD ){.
19c0: 20 20 20 20 59 20 3d 20 70 2d 3e 59 3b 0a 20 20      Y = p->Y;.  
19d0: 20 20 4d 20 3d 20 70 2d 3e 4d 3b 0a 20 20 20 20    M = p->M;.    
19e0: 44 20 3d 20 70 2d 3e 44 3b 0a 20 20 7d 65 6c 73  D = p->D;.  }els
19f0: 65 7b 0a 20 20 20 20 59 20 3d 20 32 30 30 30 3b  e{.    Y = 2000;
1a00: 20 20 2f 2a 20 49 66 20 6e 6f 20 59 4d 44 20 73    /* If no YMD s
1a10: 70 65 63 69 66 69 65 64 2c 20 61 73 73 75 6d 65  pecified, assume
1a20: 20 32 30 30 30 2d 4a 61 6e 2d 30 31 20 2a 2f 0a   2000-Jan-01 */.
1a30: 20 20 20 20 4d 20 3d 20 31 3b 0a 20 20 20 20 44      M = 1;.    D
1a40: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
1a50: 4d 3c 3d 32 20 29 7b 0a 20 20 20 20 59 2d 2d 3b  M<=2 ){.    Y--;
1a60: 0a 20 20 20 20 4d 20 2b 3d 20 31 32 3b 0a 20 20  .    M += 12;.  
1a70: 7d 0a 20 20 41 20 3d 20 59 2f 31 30 30 3b 0a 20  }.  A = Y/100;. 
1a80: 20 42 20 3d 20 32 20 2d 20 41 20 2b 20 28 41 2f   B = 2 - A + (A/
1a90: 34 29 3b 0a 20 20 58 31 20 3d 20 33 36 35 2e 32  4);.  X1 = 365.2
1aa0: 35 2a 28 59 2b 34 37 31 36 29 3b 0a 20 20 58 32  5*(Y+4716);.  X2
1ab0: 20 3d 20 33 30 2e 36 30 30 31 2a 28 4d 2b 31 29   = 30.6001*(M+1)
1ac0: 3b 0a 20 20 70 2d 3e 69 4a 44 20 3d 20 28 58 31  ;.  p->iJD = (X1
1ad0: 20 2b 20 58 32 20 2b 20 44 20 2b 20 42 20 2d 20   + X2 + D + B - 
1ae0: 31 35 32 34 2e 35 29 2a 38 36 34 30 30 30 30 30  1524.5)*86400000
1af0: 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d  ;.  p->validJD =
1b00: 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 76 61 6c   1;.  if( p->val
1b10: 69 64 48 4d 53 20 29 7b 0a 20 20 20 20 70 2d 3e  idHMS ){.    p->
1b20: 69 4a 44 20 2b 3d 20 70 2d 3e 68 2a 33 36 30 30  iJD += p->h*3600
1b30: 30 30 30 20 2b 20 70 2d 3e 6d 2a 36 30 30 30 30  000 + p->m*60000
1b40: 20 2b 20 70 2d 3e 73 2a 31 30 30 30 3b 0a 20 20   + p->s*1000;.  
1b50: 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 54 5a    if( p->validTZ
1b60: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4a 44   ){.      p->iJD
1b70: 20 2d 3d 20 70 2d 3e 74 7a 2a 36 30 30 30 30 3b   -= p->tz*60000;
1b80: 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 59  .      p->validY
1b90: 4d 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  MD = 0;.      p-
1ba0: 3e 76 61 6c 69 64 48 4d 53 20 3d 20 30 3b 0a 20  >validHMS = 0;. 
1bb0: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20       p->validTZ 
1bc0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1bd0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 64 61  ../*.** Parse da
1be0: 74 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  tes of the form.
1bf0: 2a 2a 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d  **.**     YYYY-M
1c00: 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 2e 46 46  M-DD HH:MM:SS.FF
1c10: 46 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d  F.**     YYYY-MM
1c20: 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2a 20  -DD HH:MM:SS.** 
1c30: 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48      YYYY-MM-DD H
1c40: 48 3a 4d 4d 0a 2a 2a 20 20 20 20 20 59 59 59 59  H:MM.**     YYYY
1c50: 2d 4d 4d 2d 44 44 0a 2a 2a 0a 2a 2a 20 57 72 69  -MM-DD.**.** Wri
1c60: 74 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  te the result in
1c70: 74 6f 20 74 68 65 20 44 61 74 65 54 69 6d 65 20  to the DateTime 
1c80: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
1c90: 74 75 72 6e 20 30 0a 2a 2a 20 6f 6e 20 73 75 63  turn 0.** on suc
1ca0: 63 65 73 73 20 61 6e 64 20 31 20 69 66 20 74 68  cess and 1 if th
1cb0: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 69  e input string i
1cc0: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1cd0: 6d 65 64 0a 2a 2a 20 64 61 74 65 2e 0a 2a 2f 0a  med.** date..*/.
1ce0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 73 65  static int parse
1cf0: 59 79 79 79 4d 6d 44 64 28 63 6f 6e 73 74 20 63  YyyyMmDd(const c
1d00: 68 61 72 20 2a 7a 44 61 74 65 2c 20 44 61 74 65  har *zDate, Date
1d10: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Time *p){.  int 
1d20: 59 2c 20 4d 2c 20 44 2c 20 6e 65 67 3b 0a 0a 20  Y, M, D, neg;.. 
1d30: 20 69 66 28 20 7a 44 61 74 65 5b 30 5d 3d 3d 27   if( zDate[0]=='
1d40: 2d 27 20 29 7b 0a 20 20 20 20 7a 44 61 74 65 2b  -' ){.    zDate+
1d50: 2b 3b 0a 20 20 20 20 6e 65 67 20 3d 20 31 3b 0a  +;.    neg = 1;.
1d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65 67    }else{.    neg
1d70: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1d80: 67 65 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c  getDigits(zDate,
1d90: 34 2c 30 2c 39 39 39 39 2c 27 2d 27 2c 26 59 2c  4,0,9999,'-',&Y,
1da0: 32 2c 31 2c 31 32 2c 27 2d 27 2c 26 4d 2c 32 2c  2,1,12,'-',&M,2,
1db0: 31 2c 33 31 2c 30 2c 26 44 29 21 3d 33 20 29 7b  1,31,0,&D)!=3 ){
1dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
1dd0: 20 7d 0a 20 20 7a 44 61 74 65 20 2b 3d 20 31 30   }.  zDate += 10
1de0: 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61  ;.  while( isspa
1df0: 63 65 28 2a 28 75 38 2a 29 7a 44 61 74 65 29 20  ce(*(u8*)zDate) 
1e00: 7c 7c 20 27 54 27 3d 3d 2a 28 75 38 2a 29 7a 44  || 'T'==*(u8*)zD
1e10: 61 74 65 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20  ate ){ zDate++; 
1e20: 7d 0a 20 20 69 66 28 20 70 61 72 73 65 48 68 4d  }.  if( parseHhM
1e30: 6d 53 73 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30  mSs(zDate, p)==0
1e40: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 67 6f   ){.    /* We go
1e50: 74 20 74 68 65 20 74 69 6d 65 20 2a 2f 0a 20 20  t the time */.  
1e60: 7d 65 6c 73 65 20 69 66 28 20 2a 7a 44 61 74 65  }else if( *zDate
1e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 76 61  ==0 ){.    p->va
1e80: 6c 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20 7d 65  lidHMS = 0;.  }e
1e90: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1ea0: 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69  1;.  }.  p->vali
1eb0: 64 4a 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61  dJD = 0;.  p->va
1ec0: 6c 69 64 59 4d 44 20 3d 20 31 3b 0a 20 20 70 2d  lidYMD = 1;.  p-
1ed0: 3e 59 20 3d 20 6e 65 67 20 3f 20 2d 59 20 3a 20  >Y = neg ? -Y : 
1ee0: 59 3b 0a 20 20 70 2d 3e 4d 20 3d 20 4d 3b 0a 20  Y;.  p->M = M;. 
1ef0: 20 70 2d 3e 44 20 3d 20 44 3b 0a 20 20 69 66 28   p->D = D;.  if(
1f00: 20 70 2d 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20   p->validTZ ){. 
1f10: 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b     computeJD(p);
1f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1f40: 65 20 74 69 6d 65 20 74 6f 20 74 68 65 20 63 75  e time to the cu
1f50: 72 72 65 6e 74 20 74 69 6d 65 20 72 65 70 6f 72  rrent time repor
1f60: 74 65 64 20 62 79 20 74 68 65 20 56 46 53 0a 2a  ted by the VFS.*
1f70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1f80: 74 44 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65  tDateTimeToCurre
1f90: 6e 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nt(sqlite3_conte
1fa0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 44 61 74  xt *context, Dat
1fb0: 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 64 6f 75  eTime *p){.  dou
1fc0: 62 6c 65 20 72 3b 0a 20 20 73 71 6c 69 74 65 33  ble r;.  sqlite3
1fd0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
1fe0: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
1ff0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c  (context);.  sql
2000: 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
2010: 65 28 64 62 2d 3e 70 56 66 73 2c 20 26 72 29 3b  e(db->pVfs, &r);
2020: 0a 20 20 70 2d 3e 69 4a 44 20 3d 20 28 73 71 6c  .  p->iJD = (sql
2030: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
2040: 34 30 30 30 30 30 2e 30 20 2b 20 30 2e 35 29 3b  400000.0 + 0.5);
2050: 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20  .  p->validJD = 
2060: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  1;.}../*.** Atte
2070: 6d 70 74 20 74 6f 20 70 61 72 73 65 20 74 68 65  mpt to parse the
2080: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 6e   given string in
2090: 74 6f 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  to a Julian Day 
20a0: 4e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  Number.  Return.
20b0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
20c0: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   errors..**.** T
20d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
20e0: 20 61 63 63 65 70 74 61 62 6c 65 20 66 6f 72 6d   acceptable form
20f0: 73 20 66 6f 72 20 74 68 65 20 69 6e 70 75 74 20  s for the input 
2100: 73 74 72 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  string:.**.**   
2110: 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48     YYYY-MM-DD HH
2120: 3a 4d 4d 3a 53 53 2e 46 46 46 20 20 2b 2f 2d 48  :MM:SS.FFF  +/-H
2130: 48 3a 4d 4d 0a 2a 2a 20 20 20 20 20 20 44 44 44  H:MM.**      DDD
2140: 44 2e 44 44 20 0a 2a 2a 20 20 20 20 20 20 6e 6f  D.DD .**      no
2150: 77 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 66  w.**.** In the f
2160: 69 72 73 74 20 66 6f 72 6d 2c 20 74 68 65 20 2b  irst form, the +
2170: 2f 2d 48 48 3a 4d 4d 20 69 73 20 61 6c 77 61 79  /-HH:MM is alway
2180: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 54 68 65  s optional.  The
2190: 20 66 72 61 63 74 69 6f 6e 61 6c 0a 2a 2a 20 73   fractional.** s
21a0: 65 63 6f 6e 64 73 20 65 78 74 65 6e 73 69 6f 6e  econds extension
21b0: 20 28 74 68 65 20 22 2e 46 46 46 22 29 20 69 73   (the ".FFF") is
21c0: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 54 68 65 20   optional.  The 
21d0: 73 65 63 6f 6e 64 73 20 70 6f 72 74 69 6f 6e 0a  seconds portion.
21e0: 2a 2a 20 28 22 3a 53 53 2e 46 46 46 22 29 20 69  ** (":SS.FFF") i
21f0: 73 20 6f 70 74 69 6f 6e 2e 20 20 54 68 65 20 79  s option.  The y
2200: 65 61 72 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ear and date can
2210: 20 62 65 20 6f 6d 69 74 74 65 64 20 61 73 20 6c   be omitted as l
2220: 6f 6e 67 0a 2a 2a 20 61 73 20 74 68 65 72 65 20  ong.** as there 
2230: 69 73 20 61 20 74 69 6d 65 20 73 74 72 69 6e 67  is a time string
2240: 2e 20 20 54 68 65 20 74 69 6d 65 20 73 74 72 69  .  The time stri
2250: 6e 67 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ng can be omitte
2260: 64 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20  d as long.** as 
2270: 74 68 65 72 65 20 69 73 20 61 20 79 65 61 72 20  there is a year 
2280: 61 6e 64 20 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  and date..*/.sta
2290: 74 69 63 20 69 6e 74 20 70 61 72 73 65 44 61 74  tic int parseDat
22a0: 65 4f 72 54 69 6d 65 28 0a 20 20 73 71 6c 69 74  eOrTime(.  sqlit
22b0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
22c0: 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  ext, .  const ch
22d0: 61 72 20 2a 7a 44 61 74 65 2c 20 0a 20 20 44 61  ar *zDate, .  Da
22e0: 74 65 54 69 6d 65 20 2a 70 0a 29 7b 0a 20 20 69  teTime *p.){.  i
22f0: 66 28 20 70 61 72 73 65 59 79 79 79 4d 6d 44 64  f( parseYyyyMmDd
2300: 28 7a 44 61 74 65 2c 70 29 3d 3d 30 20 29 7b 0a  (zDate,p)==0 ){.
2310: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2320: 7d 65 6c 73 65 20 69 66 28 20 70 61 72 73 65 48  }else if( parseH
2330: 68 4d 6d 53 73 28 7a 44 61 74 65 2c 20 70 29 3d  hMmSs(zDate, p)=
2340: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2350: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
2360: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2370: 44 61 74 65 2c 22 6e 6f 77 22 29 3d 3d 30 29 7b  Date,"now")==0){
2380: 0a 20 20 20 20 73 65 74 44 61 74 65 54 69 6d 65  .    setDateTime
2390: 54 6f 43 75 72 72 65 6e 74 28 63 6f 6e 74 65 78  ToCurrent(contex
23a0: 74 2c 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72  t, p);.    retur
23b0: 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n 0;.  }else if(
23c0: 20 73 71 6c 69 74 65 33 49 73 4e 75 6d 62 65 72   sqlite3IsNumber
23d0: 28 7a 44 61 74 65 2c 20 30 2c 20 53 51 4c 49 54  (zDate, 0, SQLIT
23e0: 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20 64  E_UTF8) ){.    d
23f0: 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 67 65 74  ouble r;.    get
2400: 56 61 6c 75 65 28 7a 44 61 74 65 2c 20 26 72 29  Value(zDate, &r)
2410: 3b 0a 20 20 20 20 70 2d 3e 69 4a 44 20 3d 20 28  ;.    p->iJD = (
2420: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72  sqlite3_int64)(r
2430: 2a 38 36 34 30 30 30 30 30 2e 30 20 2b 20 30 2e  *86400000.0 + 0.
2440: 35 29 3b 0a 20 20 20 20 70 2d 3e 76 61 6c 69 64  5);.    p->valid
2450: 4a 44 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  JD = 1;.    retu
2460: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
2470: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
2480: 6f 6d 70 75 74 65 20 74 68 65 20 59 65 61 72 2c  ompute the Year,
2490: 20 4d 6f 6e 74 68 2c 20 61 6e 64 20 44 61 79 20   Month, and Day 
24a0: 66 72 6f 6d 20 74 68 65 20 6a 75 6c 69 61 6e 20  from the julian 
24b0: 64 61 79 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  day number..*/.s
24c0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
24d0: 74 65 59 4d 44 28 44 61 74 65 54 69 6d 65 20 2a  teYMD(DateTime *
24e0: 70 29 7b 0a 20 20 69 6e 74 20 5a 2c 20 41 2c 20  p){.  int Z, A, 
24f0: 42 2c 20 43 2c 20 44 2c 20 45 2c 20 58 31 3b 0a  B, C, D, E, X1;.
2500: 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 59 4d    if( p->validYM
2510: 44 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  D ) return;.  if
2520: 28 20 21 70 2d 3e 76 61 6c 69 64 4a 44 20 29 7b  ( !p->validJD ){
2530: 0a 20 20 20 20 70 2d 3e 59 20 3d 20 32 30 30 30  .    p->Y = 2000
2540: 3b 0a 20 20 20 20 70 2d 3e 4d 20 3d 20 31 3b 0a  ;.    p->M = 1;.
2550: 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0a 20 20      p->D = 1;.  
2560: 7d 65 6c 73 65 7b 0a 20 20 20 20 5a 20 3d 20 28  }else{.    Z = (
2570: 70 2d 3e 69 4a 44 20 2b 20 34 33 32 30 30 30 30  p->iJD + 4320000
2580: 30 29 2f 38 36 34 30 30 30 30 30 3b 0a 20 20 20  0)/86400000;.   
2590: 20 41 20 3d 20 28 5a 20 2d 20 31 38 36 37 32 31   A = (Z - 186721
25a0: 36 2e 32 35 29 2f 33 36 35 32 34 2e 32 35 3b 0a  6.25)/36524.25;.
25b0: 20 20 20 20 41 20 3d 20 5a 20 2b 20 31 20 2b 20      A = Z + 1 + 
25c0: 41 20 2d 20 28 41 2f 34 29 3b 0a 20 20 20 20 42  A - (A/4);.    B
25d0: 20 3d 20 41 20 2b 20 31 35 32 34 3b 0a 20 20 20   = A + 1524;.   
25e0: 20 43 20 3d 20 28 42 20 2d 20 31 32 32 2e 31 29   C = (B - 122.1)
25f0: 2f 33 36 35 2e 32 35 3b 0a 20 20 20 20 44 20 3d  /365.25;.    D =
2600: 20 33 36 35 2e 32 35 2a 43 3b 0a 20 20 20 20 45   365.25*C;.    E
2610: 20 3d 20 28 42 2d 44 29 2f 33 30 2e 36 30 30 31   = (B-D)/30.6001
2620: 3b 0a 20 20 20 20 58 31 20 3d 20 33 30 2e 36 30  ;.    X1 = 30.60
2630: 30 31 2a 45 3b 0a 20 20 20 20 70 2d 3e 44 20 3d  01*E;.    p->D =
2640: 20 42 20 2d 20 44 20 2d 20 58 31 3b 0a 20 20 20   B - D - X1;.   
2650: 20 70 2d 3e 4d 20 3d 20 45 3c 31 34 20 3f 20 45   p->M = E<14 ? E
2660: 2d 31 20 3a 20 45 2d 31 33 3b 0a 20 20 20 20 70  -1 : E-13;.    p
2670: 2d 3e 59 20 3d 20 70 2d 3e 4d 3e 32 20 3f 20 43  ->Y = p->M>2 ? C
2680: 20 2d 20 34 37 31 36 20 3a 20 43 20 2d 20 34 37   - 4716 : C - 47
2690: 31 35 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c  15;.  }.  p->val
26a0: 69 64 59 4d 44 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  idYMD = 1;.}../*
26b0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
26c0: 48 6f 75 72 2c 20 4d 69 6e 75 74 65 2c 20 61 6e  Hour, Minute, an
26d0: 64 20 53 65 63 6f 6e 64 73 20 66 72 6f 6d 20 74  d Seconds from t
26e0: 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75  he julian day nu
26f0: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
2700: 76 6f 69 64 20 63 6f 6d 70 75 74 65 48 4d 53 28  void computeHMS(
2710: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
2720: 69 6e 74 20 73 3b 0a 20 20 69 66 28 20 70 2d 3e  int s;.  if( p->
2730: 76 61 6c 69 64 48 4d 53 20 29 20 72 65 74 75 72  validHMS ) retur
2740: 6e 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 70  n;.  computeJD(p
2750: 29 3b 0a 20 20 73 20 3d 20 28 70 2d 3e 69 4a 44  );.  s = (p->iJD
2760: 20 2b 20 34 33 32 30 30 30 30 30 29 20 25 20 38   + 43200000) % 8
2770: 36 34 30 30 30 30 30 3b 0a 20 20 70 2d 3e 73 20  6400000;.  p->s 
2780: 3d 20 73 2f 31 30 30 30 2e 30 3b 0a 20 20 73 20  = s/1000.0;.  s 
2790: 3d 20 70 2d 3e 73 3b 0a 20 20 70 2d 3e 73 20 2d  = p->s;.  p->s -
27a0: 3d 20 73 3b 0a 20 20 70 2d 3e 68 20 3d 20 73 2f  = s;.  p->h = s/
27b0: 33 36 30 30 3b 0a 20 20 73 20 2d 3d 20 70 2d 3e  3600;.  s -= p->
27c0: 68 2a 33 36 30 30 3b 0a 20 20 70 2d 3e 6d 20 3d  h*3600;.  p->m =
27d0: 20 73 2f 36 30 3b 0a 20 20 70 2d 3e 73 20 2b 3d   s/60;.  p->s +=
27e0: 20 73 20 2d 20 70 2d 3e 6d 2a 36 30 3b 0a 20 20   s - p->m*60;.  
27f0: 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b  p->validHMS = 1;
2800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
2810: 65 20 62 6f 74 68 20 59 4d 44 20 61 6e 64 20 48  e both YMD and H
2820: 4d 53 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  MS.*/.static voi
2830: 64 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53  d computeYMD_HMS
2840: 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20  (DateTime *p){. 
2850: 20 63 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a   computeYMD(p);.
2860: 20 20 63 6f 6d 70 75 74 65 48 4d 53 28 70 29 3b    computeHMS(p);
2870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
2880: 74 68 65 20 59 4d 44 20 61 6e 64 20 48 4d 53 20  the YMD and HMS 
2890: 61 6e 64 20 74 68 65 20 54 5a 0a 2a 2f 0a 73 74  and the TZ.*/.st
28a0: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 59  atic void clearY
28b0: 4d 44 5f 48 4d 53 5f 54 5a 28 44 61 74 65 54 69  MD_HMS_TZ(DateTi
28c0: 6d 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 76 61 6c  me *p){.  p->val
28d0: 69 64 59 4d 44 20 3d 20 30 3b 0a 20 20 70 2d 3e  idYMD = 0;.  p->
28e0: 76 61 6c 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20  validHMS = 0;.  
28f0: 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a  p->validTZ = 0;.
2900: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2910: 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45  E_OMIT_LOCALTIME
2920: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
2930: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 28 69  he difference (i
2940: 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 0a  n milliseconds).
2950: 2a 2a 20 62 65 74 77 65 65 6e 20 6c 6f 63 61 6c  ** between local
2960: 74 69 6d 65 20 61 6e 64 20 55 54 43 20 28 61 2e  time and UTC (a.
2970: 6b 2e 61 2e 20 47 4d 54 29 0a 2a 2a 20 66 6f 72  k.a. GMT).** for
2980: 20 74 68 65 20 74 69 6d 65 20 76 61 6c 75 65 20   the time value 
2990: 70 20 77 68 65 72 65 20 70 20 69 73 20 69 6e 20  p where p is in 
29a0: 55 54 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  UTC..*/.static i
29b0: 6e 74 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73  nt localtimeOffs
29c0: 65 74 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b  et(DateTime *p){
29d0: 0a 20 20 44 61 74 65 54 69 6d 65 20 78 2c 20 79  .  DateTime x, y
29e0: 3b 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ;.  time_t t;.  
29f0: 78 20 3d 20 2a 70 3b 0a 20 20 63 6f 6d 70 75 74  x = *p;.  comput
2a00: 65 59 4d 44 5f 48 4d 53 28 26 78 29 3b 0a 20 20  eYMD_HMS(&x);.  
2a10: 69 66 28 20 78 2e 59 3c 31 39 37 31 20 7c 7c 20  if( x.Y<1971 || 
2a20: 78 2e 59 3e 3d 32 30 33 38 20 29 7b 0a 20 20 20  x.Y>=2038 ){.   
2a30: 20 78 2e 59 20 3d 20 32 30 30 30 3b 0a 20 20 20   x.Y = 2000;.   
2a40: 20 78 2e 4d 20 3d 20 31 3b 0a 20 20 20 20 78 2e   x.M = 1;.    x.
2a50: 44 20 3d 20 31 3b 0a 20 20 20 20 78 2e 68 20 3d  D = 1;.    x.h =
2a60: 20 30 3b 0a 20 20 20 20 78 2e 6d 20 3d 20 30 3b   0;.    x.m = 0;
2a70: 0a 20 20 20 20 78 2e 73 20 3d 20 30 2e 30 3b 0a  .    x.s = 0.0;.
2a80: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69    } else {.    i
2a90: 6e 74 20 73 20 3d 20 78 2e 73 20 2b 20 30 2e 35  nt s = x.s + 0.5
2aa0: 3b 0a 20 20 20 20 78 2e 73 20 3d 20 73 3b 0a 20  ;.    x.s = s;. 
2ab0: 20 7d 0a 20 20 78 2e 74 7a 20 3d 20 30 3b 0a 20   }.  x.tz = 0;. 
2ac0: 20 78 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a   x.validJD = 0;.
2ad0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 29 3b    computeJD(&x);
2ae0: 0a 20 20 74 20 3d 20 78 2e 69 4a 44 2f 31 30 30  .  t = x.iJD/100
2af0: 30 20 2d 20 32 34 34 30 35 38 37 2e 35 2a 38 36  0 - 2440587.5*86
2b00: 34 30 30 2e 30 3b 0a 23 69 66 64 65 66 20 48 41  400.0;.#ifdef HA
2b10: 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 0a 20  VE_LOCALTIME_R. 
2b20: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 6d   {.    struct tm
2b30: 20 73 4c 6f 63 61 6c 3b 0a 20 20 20 20 6c 6f 63   sLocal;.    loc
2b40: 61 6c 74 69 6d 65 5f 72 28 26 74 2c 20 26 73 4c  altime_r(&t, &sL
2b50: 6f 63 61 6c 29 3b 0a 20 20 20 20 79 2e 59 20 3d  ocal);.    y.Y =
2b60: 20 73 4c 6f 63 61 6c 2e 74 6d 5f 79 65 61 72 20   sLocal.tm_year 
2b70: 2b 20 31 39 30 30 3b 0a 20 20 20 20 79 2e 4d 20  + 1900;.    y.M 
2b80: 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d 6f 6e 20  = sLocal.tm_mon 
2b90: 2b 20 31 3b 0a 20 20 20 20 79 2e 44 20 3d 20 73  + 1;.    y.D = s
2ba0: 4c 6f 63 61 6c 2e 74 6d 5f 6d 64 61 79 3b 0a 20  Local.tm_mday;. 
2bb0: 20 20 20 79 2e 68 20 3d 20 73 4c 6f 63 61 6c 2e     y.h = sLocal.
2bc0: 74 6d 5f 68 6f 75 72 3b 0a 20 20 20 20 79 2e 6d  tm_hour;.    y.m
2bd0: 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d 69 6e   = sLocal.tm_min
2be0: 3b 0a 20 20 20 20 79 2e 73 20 3d 20 73 4c 6f 63  ;.    y.s = sLoc
2bf0: 61 6c 2e 74 6d 5f 73 65 63 3b 0a 20 20 7d 0a 23  al.tm_sec;.  }.#
2c00: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  elif defined(HAV
2c10: 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 53 29 0a 20  E_LOCALTIME_S). 
2c20: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 6d   {.    struct tm
2c30: 20 73 4c 6f 63 61 6c 3b 0a 20 20 20 20 6c 6f 63   sLocal;.    loc
2c40: 61 6c 74 69 6d 65 5f 73 28 26 73 4c 6f 63 61 6c  altime_s(&sLocal
2c50: 2c 20 26 74 29 3b 0a 20 20 20 20 79 2e 59 20 3d  , &t);.    y.Y =
2c60: 20 73 4c 6f 63 61 6c 2e 74 6d 5f 79 65 61 72 20   sLocal.tm_year 
2c70: 2b 20 31 39 30 30 3b 0a 20 20 20 20 79 2e 4d 20  + 1900;.    y.M 
2c80: 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d 6f 6e 20  = sLocal.tm_mon 
2c90: 2b 20 31 3b 0a 20 20 20 20 79 2e 44 20 3d 20 73  + 1;.    y.D = s
2ca0: 4c 6f 63 61 6c 2e 74 6d 5f 6d 64 61 79 3b 0a 20  Local.tm_mday;. 
2cb0: 20 20 20 79 2e 68 20 3d 20 73 4c 6f 63 61 6c 2e     y.h = sLocal.
2cc0: 74 6d 5f 68 6f 75 72 3b 0a 20 20 20 20 79 2e 6d  tm_hour;.    y.m
2cd0: 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d 69 6e   = sLocal.tm_min
2ce0: 3b 0a 20 20 20 20 79 2e 73 20 3d 20 73 4c 6f 63  ;.    y.s = sLoc
2cf0: 61 6c 2e 74 6d 5f 73 65 63 3b 0a 20 20 7d 0a 23  al.tm_sec;.  }.#
2d00: 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 73 74 72  else.  {.    str
2d10: 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20 20 20  uct tm *pTm;.   
2d20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2d30: 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
2d40: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
2d50: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
2d60: 52 29 29 3b 0a 20 20 20 20 70 54 6d 20 3d 20 6c  R));.    pTm = l
2d70: 6f 63 61 6c 74 69 6d 65 28 26 74 29 3b 0a 20 20  ocaltime(&t);.  
2d80: 20 20 79 2e 59 20 3d 20 70 54 6d 2d 3e 74 6d 5f    y.Y = pTm->tm_
2d90: 79 65 61 72 20 2b 20 31 39 30 30 3b 0a 20 20 20  year + 1900;.   
2da0: 20 79 2e 4d 20 3d 20 70 54 6d 2d 3e 74 6d 5f 6d   y.M = pTm->tm_m
2db0: 6f 6e 20 2b 20 31 3b 0a 20 20 20 20 79 2e 44 20  on + 1;.    y.D 
2dc0: 3d 20 70 54 6d 2d 3e 74 6d 5f 6d 64 61 79 3b 0a  = pTm->tm_mday;.
2dd0: 20 20 20 20 79 2e 68 20 3d 20 70 54 6d 2d 3e 74      y.h = pTm->t
2de0: 6d 5f 68 6f 75 72 3b 0a 20 20 20 20 79 2e 6d 20  m_hour;.    y.m 
2df0: 3d 20 70 54 6d 2d 3e 74 6d 5f 6d 69 6e 3b 0a 20  = pTm->tm_min;. 
2e00: 20 20 20 79 2e 73 20 3d 20 70 54 6d 2d 3e 74 6d     y.s = pTm->tm
2e10: 5f 73 65 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  _sec;.    sqlite
2e20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
2e30: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
2e40: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
2e50: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 20 20  TIC_MASTER));.  
2e60: 7d 0a 23 65 6e 64 69 66 0a 20 20 79 2e 76 61 6c  }.#endif.  y.val
2e70: 69 64 59 4d 44 20 3d 20 31 3b 0a 20 20 79 2e 76  idYMD = 1;.  y.v
2e80: 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 20 20 79  alidHMS = 1;.  y
2e90: 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20  .validJD = 0;.  
2ea0: 79 2e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 20  y.validTZ = 0;. 
2eb0: 20 63 6f 6d 70 75 74 65 4a 44 28 26 79 29 3b 0a   computeJD(&y);.
2ec0: 20 20 72 65 74 75 72 6e 20 79 2e 69 4a 44 20 2d    return y.iJD -
2ed0: 20 78 2e 69 4a 44 3b 0a 7d 0a 23 65 6e 64 69 66   x.iJD;.}.#endif
2ee0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2ef0: 4c 4f 43 41 4c 54 49 4d 45 20 2a 2f 0a 0a 2f 2a  LOCALTIME */../*
2f00: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 6d 6f  .** Process a mo
2f10: 64 69 66 69 65 72 20 74 6f 20 61 20 64 61 74 65  difier to a date
2f20: 2d 74 69 6d 65 20 73 74 61 6d 70 2e 20 20 54 68  -time stamp.  Th
2f30: 65 20 6d 6f 64 69 66 69 65 72 73 20 61 72 65 0a  e modifiers are.
2f40: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
2f50: 2a 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 64 61 79  *.**     NNN day
2f60: 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 68 6f 75  s.**     NNN hou
2f70: 72 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 6d 69  rs.**     NNN mi
2f80: 6e 75 74 65 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e  nutes.**     NNN
2f90: 2e 4e 4e 4e 4e 20 73 65 63 6f 6e 64 73 0a 2a 2a  .NNNN seconds.**
2fa0: 20 20 20 20 20 4e 4e 4e 20 6d 6f 6e 74 68 73 0a       NNN months.
2fb0: 2a 2a 20 20 20 20 20 4e 4e 4e 20 79 65 61 72 73  **     NNN years
2fc0: 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66  .**     start of
2fd0: 20 6d 6f 6e 74 68 0a 2a 2a 20 20 20 20 20 73 74   month.**     st
2fe0: 61 72 74 20 6f 66 20 79 65 61 72 0a 2a 2a 20 20  art of year.**  
2ff0: 20 20 20 73 74 61 72 74 20 6f 66 20 77 65 65 6b     start of week
3000: 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66  .**     start of
3010: 20 64 61 79 0a 2a 2a 20 20 20 20 20 77 65 65 6b   day.**     week
3020: 64 61 79 20 4e 0a 2a 2a 20 20 20 20 20 75 6e 69  day N.**     uni
3030: 78 65 70 6f 63 68 0a 2a 2a 20 20 20 20 20 6c 6f  xepoch.**     lo
3040: 63 61 6c 74 69 6d 65 0a 2a 2a 20 20 20 20 20 75  caltime.**     u
3050: 74 63 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  tc.**.** Return 
3060: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  0 on success and
3070: 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 61   1 if there is a
3080: 6e 79 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  ny kind of error
3090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30a0: 70 61 72 73 65 4d 6f 64 69 66 69 65 72 28 63 6f  parseModifier(co
30b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 2c 20  nst char *zMod, 
30c0: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
30d0: 69 6e 74 20 72 63 20 3d 20 31 3b 0a 20 20 69 6e  int rc = 1;.  in
30e0: 74 20 6e 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b  t n;.  double r;
30f0: 0a 20 20 63 68 61 72 20 2a 7a 2c 20 7a 42 75 66  .  char *z, zBuf
3100: 5b 33 30 5d 3b 0a 20 20 7a 20 3d 20 7a 42 75 66  [30];.  z = zBuf
3110: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 73  ;.  for(n=0; n<s
3120: 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 26 26  izeof(zBuf)-1 &&
3130: 20 7a 4d 6f 64 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a   zMod[n]; n++){.
3140: 20 20 20 20 7a 5b 6e 5d 20 3d 20 74 6f 6c 6f 77      z[n] = tolow
3150: 65 72 28 7a 4d 6f 64 5b 6e 5d 29 3b 0a 20 20 7d  er(zMod[n]);.  }
3160: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73  .  z[n] = 0;.  s
3170: 77 69 74 63 68 28 20 7a 5b 30 5d 20 29 7b 0a 23  witch( z[0] ){.#
3180: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3190: 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 0a 20 20 20  IT_LOCALTIME.   
31a0: 20 63 61 73 65 20 27 6c 27 3a 20 7b 0a 20 20 20   case 'l': {.   
31b0: 20 20 20 2f 2a 20 20 20 20 6c 6f 63 61 6c 74 69     /*    localti
31c0: 6d 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  me.      **.    
31d0: 20 20 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68    ** Assuming th
31e0: 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 76  e current time v
31f0: 61 6c 75 65 20 69 73 20 55 54 43 20 28 61 2e 6b  alue is UTC (a.k
3200: 2e 61 2e 20 47 4d 54 29 2c 20 73 68 69 66 74 20  .a. GMT), shift 
3210: 69 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  it to.      ** s
3220: 68 6f 77 20 6c 6f 63 61 6c 20 74 69 6d 65 2e 0a  how local time..
3230: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
3240: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 6c 6f  f( strcmp(z, "lo
3250: 63 61 6c 74 69 6d 65 22 29 3d 3d 30 20 29 7b 0a  caltime")==0 ){.
3260: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
3270: 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  D(p);.        p-
3280: 3e 69 4a 44 20 2b 3d 20 6c 6f 63 61 6c 74 69 6d  >iJD += localtim
3290: 65 4f 66 66 73 65 74 28 70 29 3b 0a 20 20 20 20  eOffset(p);.    
32a0: 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53      clearYMD_HMS
32b0: 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20  _TZ(p);.        
32c0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  rc = 0;.      }.
32d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
32f0: 73 65 20 27 75 27 3a 20 7b 0a 20 20 20 20 20 20  se 'u': {.      
3300: 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 75  /*.      **    u
3310: 6e 69 78 65 70 6f 63 68 0a 20 20 20 20 20 20 2a  nixepoch.      *
3320: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 72 65 61 74  *.      ** Treat
3330: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
3340: 75 65 20 6f 66 20 70 2d 3e 69 4a 44 20 61 73 20  ue of p->iJD as 
3350: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
3360: 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 73 20 73      ** seconds s
3370: 69 6e 63 65 20 31 39 37 30 2e 20 20 43 6f 6e 76  ince 1970.  Conv
3380: 65 72 74 20 74 6f 20 61 20 72 65 61 6c 20 6a 75  ert to a real ju
3390: 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 2e  lian day number.
33a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33b0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 75  if( strcmp(z, "u
33c0: 6e 69 78 65 70 6f 63 68 22 29 3d 3d 30 20 26 26  nixepoch")==0 &&
33d0: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 29 7b 0a 20   p->validJD ){. 
33e0: 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 3d 20         p->iJD = 
33f0: 70 2d 3e 69 4a 44 2f 38 36 34 30 30 2e 30 20 2b  p->iJD/86400.0 +
3400: 20 32 34 34 30 35 38 37 2e 35 2a 38 36 34 30 30   2440587.5*86400
3410: 30 30 30 2e 30 3b 0a 20 20 20 20 20 20 20 20 63  000.0;.        c
3420: 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70  learYMD_HMS_TZ(p
3430: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
3440: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
3450: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 75 74  f( strcmp(z, "ut
3460: 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  c")==0 ){.      
3470: 20 20 64 6f 75 62 6c 65 20 63 31 3b 0a 20 20 20    double c1;.   
3480: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
3490: 29 3b 0a 20 20 20 20 20 20 20 20 63 31 20 3d 20  );.        c1 = 
34a0: 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28  localtimeOffset(
34b0: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  p);.        p->i
34c0: 4a 44 20 2d 3d 20 63 31 3b 0a 20 20 20 20 20 20  JD -= c1;.      
34d0: 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54    clearYMD_HMS_T
34e0: 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  Z(p);.        p-
34f0: 3e 69 4a 44 20 2b 3d 20 63 31 20 2d 20 6c 6f 63  >iJD += c1 - loc
3500: 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 29 3b  altimeOffset(p);
3510: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b  .        rc = 0;
3520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3530: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3540: 63 61 73 65 20 27 77 27 3a 20 7b 0a 20 20 20 20  case 'w': {.    
3550: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    /*.      **   
3560: 20 77 65 65 6b 64 61 79 20 4e 0a 20 20 20 20 20   weekday N.     
3570: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76   **.      ** Mov
3580: 65 20 74 68 65 20 64 61 74 65 20 74 6f 20 74 68  e the date to th
3590: 65 20 73 61 6d 65 20 74 69 6d 65 20 6f 6e 20 74  e same time on t
35a0: 68 65 20 6e 65 78 74 20 6f 63 63 75 72 72 65 6e  he next occurren
35b0: 63 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ce of.      ** w
35c0: 65 65 6b 64 61 79 20 4e 20 77 68 65 72 65 20 30  eekday N where 0
35d0: 3d 3d 53 75 6e 64 61 79 2c 20 31 3d 3d 4d 6f 6e  ==Sunday, 1==Mon
35e0: 64 61 79 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  day, and so fort
35f0: 68 2e 20 20 49 66 20 74 68 65 0a 20 20 20 20 20  h.  If the.     
3600: 20 2a 2a 20 64 61 74 65 20 69 73 20 61 6c 72 65   ** date is alre
3610: 61 64 79 20 6f 6e 20 74 68 65 20 61 70 70 72 6f  ady on the appro
3620: 70 72 69 61 74 65 20 77 65 65 6b 64 61 79 2c 20  priate weekday, 
3630: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
3640: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
3650: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22  if( strncmp(z, "
3660: 77 65 65 6b 64 61 79 20 22 2c 20 38 29 3d 3d 30  weekday ", 8)==0
3670: 20 26 26 20 67 65 74 56 61 6c 75 65 28 26 7a 5b   && getValue(&z[
3680: 38 5d 2c 26 72 29 3e 30 0a 20 20 20 20 20 20 20  8],&r)>0.       
3690: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 3d            && (n=
36a0: 72 29 3d 3d 72 20 26 26 20 6e 3e 3d 30 20 26 26  r)==r && n>=0 &&
36b0: 20 72 3c 37 20 29 7b 0a 20 20 20 20 20 20 20 20   r<7 ){.        
36c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 5a 3b  sqlite3_int64 Z;
36d0: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
36e0: 59 4d 44 5f 48 4d 53 28 70 29 3b 0a 20 20 20 20  YMD_HMS(p);.    
36f0: 20 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d      p->validTZ =
3700: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 76   0;.        p->v
3710: 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20  alidJD = 0;.    
3720: 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29      computeJD(p)
3730: 3b 0a 20 20 20 20 20 20 20 20 5a 20 3d 20 28 28  ;.        Z = ((
3740: 70 2d 3e 69 4a 44 20 2b 20 31 32 39 36 30 30 30  p->iJD + 1296000
3750: 30 30 29 2f 38 36 34 30 30 30 30 30 29 20 25 20  00)/86400000) % 
3760: 37 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 5a  7;.        if( Z
3770: 3e 6e 20 29 20 5a 20 2d 3d 20 37 3b 0a 20 20 20  >n ) Z -= 7;.   
3780: 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28       p->iJD += (
3790: 6e 20 2d 20 5a 29 2a 38 36 34 30 30 30 30 30 3b  n - Z)*86400000;
37a0: 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d  .        clearYM
37b0: 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20  D_HMS_TZ(p);.   
37c0: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
37d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
37e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
37f0: 20 27 73 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a   's': {.      /*
3800: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 73 74 61  .      **    sta
3810: 72 74 20 6f 66 20 54 54 54 54 54 0a 20 20 20 20  rt of TTTTT.    
3820: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 6f    **.      ** Mo
3830: 76 65 20 74 68 65 20 64 61 74 65 20 62 61 63 6b  ve the date back
3840: 77 61 72 64 73 20 74 6f 20 74 68 65 20 62 65 67  wards to the beg
3850: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75  inning of the cu
3860: 72 72 65 6e 74 20 64 61 79 2c 0a 20 20 20 20 20  rrent day,.     
3870: 20 2a 2a 20 6f 72 20 6d 6f 6e 74 68 20 6f 72 20   ** or month or 
3880: 79 65 61 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  year..      */. 
3890: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
38a0: 28 7a 2c 20 22 73 74 61 72 74 20 6f 66 20 22 2c  (z, "start of ",
38b0: 20 39 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a   9)!=0 ) break;.
38c0: 20 20 20 20 20 20 7a 20 2b 3d 20 39 3b 0a 20 20        z += 9;.  
38d0: 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 28 70      computeYMD(p
38e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69  );.      p->vali
38f0: 64 48 4d 53 20 3d 20 31 3b 0a 20 20 20 20 20 20  dHMS = 1;.      
3900: 70 2d 3e 68 20 3d 20 70 2d 3e 6d 20 3d 20 30 3b  p->h = p->m = 0;
3910: 0a 20 20 20 20 20 20 70 2d 3e 73 20 3d 20 30 2e  .      p->s = 0.
3920: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69  0;.      p->vali
3930: 64 54 5a 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  dTZ = 0;.      p
3940: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20  ->validJD = 0;. 
3950: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
3960: 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d 30 20 29 7b  z,"month")==0 ){
3970: 0a 20 20 20 20 20 20 20 20 70 2d 3e 44 20 3d 20  .        p->D = 
3980: 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
3990: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
39a0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 79 65 61  f( strcmp(z,"yea
39b0: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
39c0: 20 20 63 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b    computeYMD(p);
39d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 4d 20 3d 20  .        p->M = 
39e0: 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 44 20  1;.        p->D 
39f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
3a00: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
3a10: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 64   if( strcmp(z,"d
3a20: 61 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ay")==0 ){.     
3a30: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
3a40: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
3a50: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27      }.    case '
3a60: 2b 27 3a 0a 20 20 20 20 63 61 73 65 20 27 2d 27  +':.    case '-'
3a70: 3a 0a 20 20 20 20 63 61 73 65 20 27 30 27 3a 0a  :.    case '0':.
3a80: 20 20 20 20 63 61 73 65 20 27 31 27 3a 0a 20 20      case '1':.  
3a90: 20 20 63 61 73 65 20 27 32 27 3a 0a 20 20 20 20    case '2':.    
3aa0: 63 61 73 65 20 27 33 27 3a 0a 20 20 20 20 63 61  case '3':.    ca
3ab0: 73 65 20 27 34 27 3a 0a 20 20 20 20 63 61 73 65  se '4':.    case
3ac0: 20 27 35 27 3a 0a 20 20 20 20 63 61 73 65 20 27   '5':.    case '
3ad0: 36 27 3a 0a 20 20 20 20 63 61 73 65 20 27 37 27  6':.    case '7'
3ae0: 3a 0a 20 20 20 20 63 61 73 65 20 27 38 27 3a 0a  :.    case '8':.
3af0: 20 20 20 20 63 61 73 65 20 27 39 27 3a 20 7b 0a      case '9': {.
3b00: 20 20 20 20 20 20 6e 20 3d 20 67 65 74 56 61 6c        n = getVal
3b10: 75 65 28 7a 2c 20 26 72 29 3b 0a 20 20 20 20 20  ue(z, &r);.     
3b20: 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
3b30: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d  .      if( z[n]=
3b40: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =':' ){.        
3b50: 2f 2a 20 41 20 6d 6f 64 69 66 69 65 72 20 6f 66  /* A modifier of
3b60: 20 74 68 65 20 66 6f 72 6d 20 28 2b 7c 2d 29 48   the form (+|-)H
3b70: 48 3a 4d 4d 3a 53 53 2e 46 46 46 20 61 64 64 73  H:MM:SS.FFF adds
3b80: 20 28 6f 72 20 73 75 62 74 72 61 63 74 73 29 20   (or subtracts) 
3b90: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  the.        ** s
3ba0: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
3bb0: 6f 66 20 68 6f 75 72 73 2c 20 6d 69 6e 75 74 65  of hours, minute
3bc0: 73 2c 20 73 65 63 6f 6e 64 73 2c 20 61 6e 64 20  s, seconds, and 
3bd0: 66 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e  fractional secon
3be0: 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ds.        ** to
3bf0: 20 74 68 65 20 74 69 6d 65 2e 20 20 54 68 65 20   the time.  The 
3c00: 22 2e 46 46 46 22 20 6d 61 79 20 62 65 20 6f 6d  ".FFF" may be om
3c10: 69 74 74 65 64 2e 20 20 54 68 65 20 22 3a 53 53  itted.  The ":SS
3c20: 2e 46 46 46 22 20 6d 61 79 20 62 65 0a 20 20 20  .FFF" may be.   
3c30: 20 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 2e       ** omitted.
3c40: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
3c50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3c60: 7a 32 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20  z2 = z;.        
3c70: 44 61 74 65 54 69 6d 65 20 74 78 3b 0a 20 20 20  DateTime tx;.   
3c80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
3c90: 36 34 20 64 61 79 3b 0a 20 20 20 20 20 20 20 20  64 day;.        
3ca0: 69 66 28 20 21 69 73 64 69 67 69 74 28 2a 28 75  if( !isdigit(*(u
3cb0: 38 2a 29 7a 32 29 20 29 20 7a 32 2b 2b 3b 0a 20  8*)z2) ) z2++;. 
3cc0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 74         memset(&t
3cd0: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 78 29  x, 0, sizeof(tx)
3ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
3cf0: 61 72 73 65 48 68 4d 6d 53 73 28 7a 32 2c 20 26  arseHhMmSs(z2, &
3d00: 74 78 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tx) ) break;.   
3d10: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26       computeJD(&
3d20: 74 78 29 3b 0a 20 20 20 20 20 20 20 20 74 78 2e  tx);.        tx.
3d30: 69 4a 44 20 2d 3d 20 34 33 32 30 30 30 30 30 3b  iJD -= 43200000;
3d40: 0a 20 20 20 20 20 20 20 20 64 61 79 20 3d 20 74  .        day = t
3d50: 78 2e 69 4a 44 2f 38 36 34 30 30 30 30 30 3b 0a  x.iJD/86400000;.
3d60: 20 20 20 20 20 20 20 20 74 78 2e 69 4a 44 20 2d          tx.iJD -
3d70: 3d 20 64 61 79 2a 38 36 34 30 30 30 30 30 3b 0a  = day*86400000;.
3d80: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
3d90: 3d 3d 27 2d 27 20 29 20 74 78 2e 69 4a 44 20 3d  =='-' ) tx.iJD =
3da0: 20 2d 74 78 2e 69 4a 44 3b 0a 20 20 20 20 20 20   -tx.iJD;.      
3db0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a    computeJD(p);.
3dc0: 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44          clearYMD
3dd0: 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20  _HMS_TZ(p);.    
3de0: 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 74 78      p->iJD += tx
3df0: 2e 69 4a 44 3b 0a 20 20 20 20 20 20 20 20 72 63  .iJD;.        rc
3e00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
3e10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3e20: 20 20 20 7a 20 2b 3d 20 6e 3b 0a 20 20 20 20 20     z += n;.     
3e30: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
3e40: 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a  *(u8*)z) ) z++;.
3e50: 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
3e60: 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  (z);.      if( n
3e70: 3e 31 30 20 7c 7c 20 6e 3c 33 20 29 20 62 72 65  >10 || n<3 ) bre
3e80: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ak;.      if( z[
3e90: 6e 2d 31 5d 3d 3d 27 73 27 20 29 7b 20 7a 5b 6e  n-1]=='s' ){ z[n
3ea0: 2d 31 5d 20 3d 20 30 3b 20 6e 2d 2d 3b 20 7d 0a  -1] = 0; n--; }.
3eb0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28        computeJD(
3ec0: 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  p);.      rc = 0
3ed0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 33  ;.      if( n==3
3ee0: 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 64 61   && strcmp(z,"da
3ef0: 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
3f00: 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 72 2a 38 36    p->iJD += r*86
3f10: 34 30 30 30 30 30 2e 30 20 2b 20 30 2e 35 3b 0a  400000.0 + 0.5;.
3f20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3f30: 6e 3d 3d 34 20 26 26 20 73 74 72 63 6d 70 28 7a  n==4 && strcmp(z
3f40: 2c 22 68 6f 75 72 22 29 3d 3d 30 20 29 7b 0a 20  ,"hour")==0 ){. 
3f50: 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d         p->iJD +=
3f60: 20 72 2a 28 38 36 34 30 30 30 30 30 2e 30 2f 32   r*(86400000.0/2
3f70: 34 2e 30 29 20 2b 20 30 2e 35 3b 0a 20 20 20 20  4.0) + 0.5;.    
3f80: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36    }else if( n==6
3f90: 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d 69   && strcmp(z,"mi
3fa0: 6e 75 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nute")==0 ){.   
3fb0: 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 72       p->iJD += r
3fc0: 2a 28 38 36 34 30 30 30 30 30 2e 30 2f 28 32 34  *(86400000.0/(24
3fd0: 2e 30 2a 36 30 2e 30 29 29 20 2b 20 30 2e 35 3b  .0*60.0)) + 0.5;
3fe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
3ff0: 20 6e 3d 3d 36 20 26 26 20 73 74 72 63 6d 70 28   n==6 && strcmp(
4000: 7a 2c 22 73 65 63 6f 6e 64 22 29 3d 3d 30 20 29  z,"second")==0 )
4010: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44  {.        p->iJD
4020: 20 2b 3d 20 72 2a 28 38 36 34 30 30 30 30 30 2e   += r*(86400000.
4030: 30 2f 28 32 34 2e 30 2a 36 30 2e 30 2a 36 30 2e  0/(24.0*60.0*60.
4040: 30 29 29 20 2b 20 30 2e 35 3b 0a 20 20 20 20 20  0)) + 0.5;.     
4050: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 35 20   }else if( n==5 
4060: 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d 6f 6e  && strcmp(z,"mon
4070: 74 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  th")==0 ){.     
4080: 20 20 20 69 6e 74 20 78 2c 20 79 3b 0a 20 20 20     int x, y;.   
4090: 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f       computeYMD_
40a0: 48 4d 53 28 70 29 3b 0a 20 20 20 20 20 20 20 20  HMS(p);.        
40b0: 70 2d 3e 4d 20 2b 3d 20 72 3b 0a 20 20 20 20 20  p->M += r;.     
40c0: 20 20 20 78 20 3d 20 70 2d 3e 4d 3e 30 20 3f 20     x = p->M>0 ? 
40d0: 28 70 2d 3e 4d 2d 31 29 2f 31 32 20 3a 20 28 70  (p->M-1)/12 : (p
40e0: 2d 3e 4d 2d 31 32 29 2f 31 32 3b 0a 20 20 20 20  ->M-12)/12;.    
40f0: 20 20 20 20 70 2d 3e 59 20 2b 3d 20 78 3b 0a 20      p->Y += x;. 
4100: 20 20 20 20 20 20 20 70 2d 3e 4d 20 2d 3d 20 78         p->M -= x
4110: 2a 31 32 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  *12;.        p->
4120: 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20  validJD = 0;.   
4130: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
4140: 29 3b 0a 20 20 20 20 20 20 20 20 79 20 3d 20 72  );.        y = r
4150: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 79 21  ;.        if( y!
4160: 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =r ){.          
4170: 70 2d 3e 69 4a 44 20 2b 3d 20 28 72 20 2d 20 79  p->iJD += (r - y
4180: 29 2a 33 30 2e 30 2a 38 36 34 30 30 30 30 30 2e  )*30.0*86400000.
4190: 30 20 2b 20 30 2e 35 3b 0a 20 20 20 20 20 20 20  0 + 0.5;.       
41a0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
41b0: 66 28 20 6e 3d 3d 34 20 26 26 20 73 74 72 63 6d  f( n==4 && strcm
41c0: 70 28 7a 2c 22 79 65 61 72 22 29 3d 3d 30 20 29  p(z,"year")==0 )
41d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  {.        comput
41e0: 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a 20 20 20  eYMD_HMS(p);.   
41f0: 20 20 20 20 20 70 2d 3e 59 20 2b 3d 20 72 3b 0a       p->Y += r;.
4200: 20 20 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64          p->valid
4210: 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  JD = 0;.        
4220: 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20  computeJD(p);.  
4230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4240: 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
4250: 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 59 4d   }.      clearYM
4260: 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20  D_HMS_TZ(p);.   
4270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4280: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
4290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
42a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
42b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  c;.}../*.** Proc
42c0: 65 73 73 20 74 69 6d 65 20 66 75 6e 63 74 69 6f  ess time functio
42d0: 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 61 72  n arguments.  ar
42e0: 67 76 5b 30 5d 20 69 73 20 61 20 64 61 74 65 2d  gv[0] is a date-
42f0: 74 69 6d 65 20 73 74 61 6d 70 2e 0a 2a 2a 20 61  time stamp..** a
4300: 72 67 76 5b 31 5d 20 61 6e 64 20 66 6f 6c 6c 6f  rgv[1] and follo
4310: 77 69 6e 67 20 61 72 65 20 6d 6f 64 69 66 69 65  wing are modifie
4320: 72 73 2e 20 20 50 61 72 73 65 20 74 68 65 6d 20  rs.  Parse them 
4330: 61 6c 6c 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a  all and write.**
4340: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 74   the resulting t
4350: 69 6d 65 20 69 6e 74 6f 20 74 68 65 20 44 61 74  ime into the Dat
4360: 65 54 69 6d 65 20 73 74 72 75 63 74 75 72 65 20  eTime structure 
4370: 70 2e 20 20 52 65 74 75 72 6e 20 30 0a 2a 2a 20  p.  Return 0.** 
4380: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 31  on success and 1
4390: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
43a0: 79 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  y errors..**.** 
43b0: 49 66 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  If there are zer
43c0: 6f 20 70 61 72 61 6d 65 74 65 72 73 20 28 69 66  o parameters (if
43d0: 20 65 76 65 6e 20 61 72 67 76 5b 30 5d 20 69 73   even argv[0] is
43e0: 20 75 6e 64 65 66 69 6e 65 64 29 0a 2a 2a 20 74   undefined).** t
43f0: 68 65 6e 20 61 73 73 75 6d 65 20 61 20 64 65 66  hen assume a def
4400: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 22 6e  ault value of "n
4410: 6f 77 22 20 66 6f 72 20 61 72 67 76 5b 30 5d 2e  ow" for argv[0].
4420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
4430: 73 44 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  sDate(.  sqlite3
4440: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
4450: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
4460: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4470: 20 2a 2a 61 72 67 76 2c 20 0a 20 20 44 61 74 65   **argv, .  Date
4480: 54 69 6d 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74  Time *p.){.  int
4490: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   i;.  const unsi
44a0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
44b0: 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 6d 65 6d  int eType;.  mem
44c0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
44d0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 61 72 67  (*p));.  if( arg
44e0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65 74 44  c==0 ){.    setD
44f0: 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65 6e 74  ateTimeToCurrent
4500: 28 63 6f 6e 74 65 78 74 2c 20 70 29 3b 0a 20 20  (context, p);.  
4510: 7d 65 6c 73 65 20 69 66 28 20 28 65 54 79 70 65  }else if( (eType
4520: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4530: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 29 3d  _type(argv[0]))=
4540: 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 0a 20 20  =SQLITE_FLOAT.  
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
4570: 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
4580: 20 70 2d 3e 69 4a 44 20 3d 20 73 71 6c 69 74 65   p->iJD = sqlite
4590: 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61  3_value_double(a
45a0: 72 67 76 5b 30 5d 29 2a 38 36 34 30 30 30 30 30  rgv[0])*86400000
45b0: 2e 30 20 2b 20 30 2e 35 3b 0a 20 20 20 20 70 2d  .0 + 0.5;.    p-
45c0: 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 20 20  >validJD = 1;.  
45d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
45e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
45f0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
4600: 69 66 28 20 21 7a 20 7c 7c 20 70 61 72 73 65 44  if( !z || parseD
4610: 61 74 65 4f 72 54 69 6d 65 28 63 6f 6e 74 65 78  ateOrTime(contex
4620: 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 70 29 20  t, (char*)z, p) 
4630: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4640: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  1;.    }.  }.  f
4650: 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20  or(i=1; i<argc; 
4660: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 7a  i++){.    if( (z
4670: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
4680: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 29 3d  _text(argv[i]))=
4690: 3d 30 20 7c 7c 20 70 61 72 73 65 4d 6f 64 69 66  =0 || parseModif
46a0: 69 65 72 28 28 63 68 61 72 2a 29 7a 2c 20 70 29  ier((char*)z, p)
46b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
46c0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
46d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
46e0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
46f0: 67 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  g routines imple
4700: 6d 65 6e 74 20 74 68 65 20 76 61 72 69 6f 75 73  ment the various
4710: 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20 66   date and time f
4720: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  unctions.** of S
4730: 51 4c 69 74 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  QLite..*/../*.**
4740: 20 20 20 20 6a 75 6c 69 61 6e 64 61 79 28 20 54      julianday( T
4750: 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20  IMESTRING, MOD, 
4760: 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  MOD, ...).**.** 
4770: 52 65 74 75 72 6e 20 74 68 65 20 6a 75 6c 69 61  Return the julia
4780: 6e 20 64 61 79 20 6e 75 6d 62 65 72 20 6f 66 20  n day number of 
4790: 74 68 65 20 64 61 74 65 20 73 70 65 63 69 66 69  the date specifi
47a0: 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ed in the argume
47b0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
47c0: 69 64 20 6a 75 6c 69 61 6e 64 61 79 46 75 6e 63  id juliandayFunc
47d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
47e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
47f0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
4800: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
4810: 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78  .){.  DateTime x
4820: 3b 0a 20 20 69 66 28 20 69 73 44 61 74 65 28 63  ;.  if( isDate(c
4830: 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
4840: 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20  gv, &x)==0 ){.  
4850: 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 29 3b    computeJD(&x);
4860: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
4870: 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65  ult_double(conte
4880: 78 74 2c 20 78 2e 69 4a 44 2f 38 36 34 30 30 30  xt, x.iJD/864000
4890: 30 30 2e 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  00.0);.  }.}../*
48a0: 0a 2a 2a 20 20 20 20 64 61 74 65 74 69 6d 65 28  .**    datetime(
48b0: 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44   TIMESTRING, MOD
48c0: 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  , MOD, ...).**.*
48d0: 2a 20 52 65 74 75 72 6e 20 59 59 59 59 2d 4d 4d  * Return YYYY-MM
48e0: 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2f 0a  -DD HH:MM:SS.*/.
48f0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 61 74 65  static void date
4900: 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  timeFunc(.  sqli
4910: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
4920: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4930: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4940: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61  e **argv.){.  Da
4950: 74 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20  teTime x;.  if( 
4960: 69 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20  isDate(context, 
4970: 61 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d  argc, argv, &x)=
4980: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
4990: 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f  Buf[100];.    co
49a0: 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78 29  mputeYMD_HMS(&x)
49b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
49c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
49d0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 30 34 64  uf), zBuf, "%04d
49e0: 2d 25 30 32 64 2d 25 30 32 64 20 25 30 32 64 3a  -%02d-%02d %02d:
49f0: 25 30 32 64 3a 25 30 32 64 22 2c 0a 20 20 20 20  %02d:%02d",.    
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 78 2e 59 2c 20 78 2e 4d 2c 20 78 2e 44 2c 20   x.Y, x.M, x.D, 
4a20: 78 2e 68 2c 20 78 2e 6d 2c 20 28 69 6e 74 29 28  x.h, x.m, (int)(
4a30: 78 2e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  x.s));.    sqlit
4a40: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
4a50: 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31  ontext, zBuf, -1
4a60: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
4a70: 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  NT);.  }.}../*.*
4a80: 2a 20 20 20 20 74 69 6d 65 28 20 54 49 4d 45 53  *    time( TIMES
4a90: 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c  TRING, MOD, MOD,
4aa0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ...).**.** Retu
4ab0: 72 6e 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2f 0a 73  rn HH:MM:SS.*/.s
4ac0: 74 61 74 69 63 20 76 6f 69 64 20 74 69 6d 65 46  tatic void timeF
4ad0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
4ae0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
4af0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
4b00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4b10: 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d  rgv.){.  DateTim
4b20: 65 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61 74  e x;.  if( isDat
4b30: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c  e(context, argc,
4b40: 20 61 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b   argv, &x)==0 ){
4b50: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31  .    char zBuf[1
4b60: 30 30 5d 3b 0a 20 20 20 20 63 6f 6d 70 75 74 65  00];.    compute
4b70: 48 4d 53 28 26 78 29 3b 0a 20 20 20 20 73 71 6c  HMS(&x);.    sql
4b80: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4b90: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
4ba0: 2c 20 22 25 30 32 64 3a 25 30 32 64 3a 25 30 32  , "%02d:%02d:%02
4bb0: 64 22 2c 20 78 2e 68 2c 20 78 2e 6d 2c 20 28 69  d", x.h, x.m, (i
4bc0: 6e 74 29 78 2e 73 29 3b 0a 20 20 20 20 73 71 6c  nt)x.s);.    sql
4bd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
4be0: 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20  (context, zBuf, 
4bf0: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
4c00: 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  IENT);.  }.}../*
4c10: 0a 2a 2a 20 20 20 20 64 61 74 65 28 20 54 49 4d  .**    date( TIM
4c20: 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f  ESTRING, MOD, MO
4c30: 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65  D, ...).**.** Re
4c40: 74 75 72 6e 20 59 59 59 59 2d 4d 4d 2d 44 44 0a  turn YYYY-MM-DD.
4c50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
4c60: 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ateFunc(.  sqlit
4c70: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4c80: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
4c90: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4ca0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74   **argv.){.  Dat
4cb0: 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20 69  eTime x;.  if( i
4cc0: 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 61  sDate(context, a
4cd0: 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d  rgc, argv, &x)==
4ce0: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
4cf0: 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6d  uf[100];.    com
4d00: 70 75 74 65 59 4d 44 28 26 78 29 3b 0a 20 20 20  puteYMD(&x);.   
4d10: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4d20: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
4d30: 7a 42 75 66 2c 20 22 25 30 34 64 2d 25 30 32 64  zBuf, "%04d-%02d
4d40: 2d 25 30 32 64 22 2c 20 78 2e 59 2c 20 78 2e 4d  -%02d", x.Y, x.M
4d50: 2c 20 78 2e 44 29 3b 0a 20 20 20 20 73 71 6c 69  , x.D);.    sqli
4d60: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
4d70: 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d  context, zBuf, -
4d80: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
4d90: 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ENT);.  }.}../*.
4da0: 2a 2a 20 20 20 20 73 74 72 66 74 69 6d 65 28 20  **    strftime( 
4db0: 46 4f 52 4d 41 54 2c 20 54 49 4d 45 53 54 52 49  FORMAT, TIMESTRI
4dc0: 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e  NG, MOD, MOD, ..
4dd0: 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .).**.** Return 
4de0: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62  a string describ
4df0: 65 64 20 62 79 20 46 4f 52 4d 41 54 2e 20 20 43  ed by FORMAT.  C
4e00: 6f 6e 76 65 72 73 69 6f 6e 73 20 61 73 20 66 6f  onversions as fo
4e10: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  llows:.**.**   %
4e20: 64 20 20 64 61 79 20 6f 66 20 6d 6f 6e 74 68 0a  d  day of month.
4e30: 2a 2a 20 20 20 25 66 20 20 2a 2a 20 66 72 61 63  **   %f  ** frac
4e40: 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 20 20  tional seconds  
4e50: 53 53 2e 53 53 53 0a 2a 2a 20 20 20 25 48 20 20  SS.SSS.**   %H  
4e60: 68 6f 75 72 20 30 30 2d 32 34 0a 2a 2a 20 20 20  hour 00-24.**   
4e70: 25 6a 20 20 64 61 79 20 6f 66 20 79 65 61 72 20  %j  day of year 
4e80: 30 30 30 2d 33 36 36 0a 2a 2a 20 20 20 25 4a 20  000-366.**   %J 
4e90: 20 2a 2a 20 4a 75 6c 69 61 6e 20 64 61 79 20 6e   ** Julian day n
4ea0: 75 6d 62 65 72 0a 2a 2a 20 20 20 25 6d 20 20 6d  umber.**   %m  m
4eb0: 6f 6e 74 68 20 30 31 2d 31 32 0a 2a 2a 20 20 20  onth 01-12.**   
4ec0: 25 4d 20 20 6d 69 6e 75 74 65 20 30 30 2d 35 39  %M  minute 00-59
4ed0: 0a 2a 2a 20 20 20 25 73 20 20 73 65 63 6f 6e 64  .**   %s  second
4ee0: 73 20 73 69 6e 63 65 20 31 39 37 30 2d 30 31 2d  s since 1970-01-
4ef0: 30 31 0a 2a 2a 20 20 20 25 53 20 20 73 65 63 6f  01.**   %S  seco
4f00: 6e 64 73 20 30 30 2d 35 39 0a 2a 2a 20 20 20 25  nds 00-59.**   %
4f10: 77 20 20 64 61 79 20 6f 66 20 77 65 65 6b 20 30  w  day of week 0
4f20: 2d 36 20 20 73 75 6e 64 61 79 3d 3d 30 0a 2a 2a  -6  sunday==0.**
4f30: 20 20 20 25 57 20 20 77 65 65 6b 20 6f 66 20 79     %W  week of y
4f40: 65 61 72 20 30 30 2d 35 33 0a 2a 2a 20 20 20 25  ear 00-53.**   %
4f50: 59 20 20 79 65 61 72 20 30 30 30 30 2d 39 39 39  Y  year 0000-999
4f60: 39 0a 2a 2a 20 20 20 25 25 20 20 25 0a 2a 2f 0a  9.**   %%  %.*/.
4f70: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 72 66  static void strf
4f80: 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  timeFunc(.  sqli
4f90: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
4fa0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4fb0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4fc0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61  e **argv.){.  Da
4fd0: 74 65 54 69 6d 65 20 78 3b 0a 20 20 75 36 34 20  teTime x;.  u64 
4fe0: 6e 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  n;.  int i, j;. 
4ff0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73   char *z;.  cons
5000: 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 28  t char *zFmt = (
5010: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
5020: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5030: 72 67 76 5b 30 5d 29 3b 0a 20 20 63 68 61 72 20  rgv[0]);.  char 
5040: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28  zBuf[100];.  if(
5050: 20 7a 46 6d 74 3d 3d 30 20 7c 7c 20 69 73 44 61   zFmt==0 || isDa
5060: 74 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  te(context, argc
5070: 2d 31 2c 20 61 72 67 76 2b 31 2c 20 26 78 29 20  -1, argv+1, &x) 
5080: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
5090: 69 3d 30 2c 20 6e 3d 31 3b 20 7a 46 6d 74 5b 69  i=0, n=1; zFmt[i
50a0: 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20 20  ]; i++, n++){.  
50b0: 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27    if( zFmt[i]=='
50c0: 25 27 20 29 7b 0a 20 20 20 20 20 20 73 77 69 74  %' ){.      swit
50d0: 63 68 28 20 7a 46 6d 74 5b 69 2b 31 5d 20 29 7b  ch( zFmt[i+1] ){
50e0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 64  .        case 'd
50f0: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
5100: 27 48 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73  'H':.        cas
5110: 65 20 27 6d 27 3a 0a 20 20 20 20 20 20 20 20 63  e 'm':.        c
5120: 61 73 65 20 27 4d 27 3a 0a 20 20 20 20 20 20 20  ase 'M':.       
5130: 20 63 61 73 65 20 27 53 27 3a 0a 20 20 20 20 20   case 'S':.     
5140: 20 20 20 63 61 73 65 20 27 57 27 3a 0a 20 20 20     case 'W':.   
5150: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
5160: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
5170: 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  ru */.        ca
5180: 73 65 20 27 77 27 3a 0a 20 20 20 20 20 20 20 20  se 'w':.        
5190: 63 61 73 65 20 27 25 27 3a 0a 20 20 20 20 20 20  case '%':.      
51a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
51b0: 20 20 20 63 61 73 65 20 27 66 27 3a 0a 20 20 20     case 'f':.   
51c0: 20 20 20 20 20 20 20 6e 20 2b 3d 20 38 3b 0a 20         n += 8;. 
51d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
51e0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 6a 27          case 'j'
51f0: 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d  :.          n +=
5200: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   3;.          br
5210: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
5220: 65 20 27 59 27 3a 0a 20 20 20 20 20 20 20 20 20  e 'Y':.         
5230: 20 6e 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20   n += 8;.       
5240: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5250: 20 20 63 61 73 65 20 27 73 27 3a 0a 20 20 20 20    case 's':.    
5260: 20 20 20 20 63 61 73 65 20 27 4a 27 3a 0a 20 20      case 'J':.  
5270: 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 35 30 3b          n += 50;
5280: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5290: 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
52a0: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  t:.          ret
52b0: 75 72 6e 3b 20 20 2f 2a 20 45 52 52 4f 52 2e 20  urn;  /* ERROR. 
52c0: 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20 2a   return a NULL *
52d0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
52e0: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i++;.    }.  }. 
52f0: 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42   if( n<sizeof(zB
5300: 75 66 29 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a  uf) ){.    z = z
5310: 42 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Buf;.  }else if(
5320: 20 6e 3e 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   n>sqlite3_conte
5330: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
5340: 74 65 78 74 29 2d 3e 61 4c 69 6d 69 74 5b 53 51  text)->aLimit[SQ
5350: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
5360: 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  H] ){.    sqlite
5370: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74  3_result_error_t
5380: 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a  oobig(context);.
5390: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
53a0: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
53b0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b  ite3Malloc( n );
53c0: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
53d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
53e0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
53f0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
5400: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
5410: 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28    }.  computeJD(
5420: 26 78 29 3b 0a 20 20 63 6f 6d 70 75 74 65 59 4d  &x);.  computeYM
5430: 44 5f 48 4d 53 28 26 78 29 3b 0a 20 20 66 6f 72  D_HMS(&x);.  for
5440: 28 69 3d 6a 3d 30 3b 20 7a 46 6d 74 5b 69 5d 3b  (i=j=0; zFmt[i];
5450: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
5460: 46 6d 74 5b 69 5d 21 3d 27 25 27 20 29 7b 0a 20  Fmt[i]!='%' ){. 
5470: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 46       z[j++] = zF
5480: 6d 74 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  mt[i];.    }else
5490: 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
54a0: 20 20 20 73 77 69 74 63 68 28 20 7a 46 6d 74 5b     switch( zFmt[
54b0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  i] ){.        ca
54c0: 73 65 20 27 64 27 3a 20 20 73 71 6c 69 74 65 33  se 'd':  sqlite3
54d0: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b  _snprintf(3, &z[
54e0: 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 44 29 3b 20  j],"%02d",x.D); 
54f0: 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20  j+=2; break;.   
5500: 20 20 20 20 20 63 61 73 65 20 27 66 27 3a 20 7b       case 'f': {
5510: 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62 6c  .          doubl
5520: 65 20 73 20 3d 20 78 2e 73 3b 0a 20 20 20 20 20  e s = x.s;.     
5530: 20 20 20 20 20 69 66 28 20 73 3e 35 39 2e 39 39       if( s>59.99
5540: 39 20 29 20 73 20 3d 20 35 39 2e 39 39 39 3b 0a  9 ) s = 59.999;.
5550: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5560: 33 5f 73 6e 70 72 69 6e 74 66 28 37 2c 20 26 7a  3_snprintf(7, &z
5570: 5b 6a 5d 2c 22 25 30 36 2e 33 66 22 2c 20 73 29  [j],"%06.3f", s)
5580: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d  ;.          j +=
5590: 20 73 74 72 6c 65 6e 28 26 7a 5b 6a 5d 29 3b 0a   strlen(&z[j]);.
55a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
55b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
55c0: 20 20 20 63 61 73 65 20 27 48 27 3a 20 20 73 71     case 'H':  sq
55d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
55e0: 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78  , &z[j],"%02d",x
55f0: 2e 68 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b  .h); j+=2; break
5600: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
5610: 57 27 3a 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75  W': /* Fall thru
5620: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65   */.        case
5630: 20 27 6a 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'j': {.        
5640: 20 20 69 6e 74 20 6e 44 61 79 3b 20 20 20 20 20    int nDay;     
5650: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5660: 72 20 6f 66 20 64 61 79 73 20 73 69 6e 63 65 20  r of days since 
5670: 31 73 74 20 64 61 79 20 6f 66 20 79 65 61 72 20  1st day of year 
5680: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44 61 74  */.          Dat
5690: 65 54 69 6d 65 20 79 20 3d 20 78 3b 0a 20 20 20  eTime y = x;.   
56a0: 20 20 20 20 20 20 20 79 2e 76 61 6c 69 64 4a 44         y.validJD
56b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
56c0: 79 2e 4d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  y.M = 1;.       
56d0: 20 20 20 79 2e 44 20 3d 20 31 3b 0a 20 20 20 20     y.D = 1;.    
56e0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28        computeJD(
56f0: 26 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  &y);.          n
5700: 44 61 79 20 3d 20 28 78 2e 69 4a 44 20 2d 20 79  Day = (x.iJD - y
5710: 2e 69 4a 44 29 2f 38 36 34 30 30 30 30 30 2e 30  .iJD)/86400000.0
5720: 20 2b 20 30 2e 35 3b 0a 20 20 20 20 20 20 20 20   + 0.5;.        
5730: 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27    if( zFmt[i]=='
5740: 57 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  W' ){.          
5750: 20 20 69 6e 74 20 77 64 3b 20 20 20 2f 2a 20 30    int wd;   /* 0
5760: 3d 4d 6f 6e 64 61 79 2c 20 31 3d 54 75 65 73 64  =Monday, 1=Tuesd
5770: 61 79 2c 20 2e 2e 2e 20 36 3d 53 75 6e 64 61 79  ay, ... 6=Sunday
5780: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5790: 77 64 20 3d 20 28 28 78 2e 69 4a 44 2b 34 33 32  wd = ((x.iJD+432
57a0: 30 30 30 30 30 29 2f 38 36 34 30 30 30 30 30 29  00000)/86400000)
57b0: 20 25 20 37 3b 0a 20 20 20 20 20 20 20 20 20 20   % 7;.          
57c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
57d0: 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32  tf(3, &z[j],"%02
57e0: 64 22 2c 28 6e 44 61 79 2b 37 2d 77 64 29 2f 37  d",(nDay+7-wd)/7
57f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
5800: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
5810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5820: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5830: 69 6e 74 66 28 34 2c 20 26 7a 5b 6a 5d 2c 22 25  intf(4, &z[j],"%
5840: 30 33 64 22 2c 6e 44 61 79 2b 31 29 3b 0a 20 20  03d",nDay+1);.  
5850: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 33            j += 3
5860: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5870: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5890: 20 63 61 73 65 20 27 4a 27 3a 20 7b 0a 20 20 20   case 'J': {.   
58a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
58b0: 6e 70 72 69 6e 74 66 28 32 30 2c 20 26 7a 5b 6a  nprintf(20, &z[j
58c0: 5d 2c 22 25 2e 31 36 67 22 2c 78 2e 69 4a 44 2f  ],"%.16g",x.iJD/
58d0: 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 20  86400000.0);.   
58e0: 20 20 20 20 20 20 20 6a 2b 3d 73 74 72 6c 65 6e         j+=strlen
58f0: 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20  (&z[j]);.       
5900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5910: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
5920: 20 27 6d 27 3a 20 20 73 71 6c 69 74 65 33 5f 73   'm':  sqlite3_s
5930: 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d  nprintf(3, &z[j]
5940: 2c 22 25 30 32 64 22 2c 78 2e 4d 29 3b 20 6a 2b  ,"%02d",x.M); j+
5950: 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  =2; break;.     
5960: 20 20 20 63 61 73 65 20 27 4d 27 3a 20 20 73 71     case 'M':  sq
5970: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
5980: 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78  , &z[j],"%02d",x
5990: 2e 6d 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b  .m); j+=2; break
59a0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
59b0: 73 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  s': {.          
59c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
59d0: 28 33 30 2c 26 7a 5b 6a 5d 2c 22 25 64 22 2c 0a  (30,&z[j],"%d",.
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
5a00: 28 78 2e 69 4a 44 2f 31 30 30 30 2e 30 20 2d 20  (x.iJD/1000.0 - 
5a10: 32 31 30 38 36 36 37 36 30 30 30 30 2e 30 29 29  210866760000.0))
5a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d  ;.          j +=
5a30: 20 73 74 72 6c 65 6e 28 26 7a 5b 6a 5d 29 3b 0a   strlen(&z[j]);.
5a40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5a50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5a60: 20 20 20 63 61 73 65 20 27 53 27 3a 20 20 73 71     case 'S':  sq
5a70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
5a80: 2c 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 28 69  ,&z[j],"%02d",(i
5a90: 6e 74 29 78 2e 73 29 3b 20 6a 2b 3d 32 3b 20 62  nt)x.s); j+=2; b
5aa0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
5ab0: 73 65 20 27 77 27 3a 20 20 7a 5b 6a 2b 2b 5d 20  se 'w':  z[j++] 
5ac0: 3d 20 28 28 28 78 2e 69 4a 44 2b 31 32 39 36 30  = (((x.iJD+12960
5ad0: 30 30 30 30 29 2f 38 36 34 30 30 30 30 30 29 20  0000)/86400000) 
5ae0: 25 20 37 29 20 2b 20 27 30 27 3b 20 62 72 65 61  % 7) + '0'; brea
5af0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
5b00: 27 59 27 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  'Y':  sqlite3_sn
5b10: 70 72 69 6e 74 66 28 35 2c 26 7a 5b 6a 5d 2c 22  printf(5,&z[j],"
5b20: 25 30 34 64 22 2c 78 2e 59 29 3b 20 6a 2b 3d 73  %04d",x.Y); j+=s
5b30: 74 72 6c 65 6e 28 26 7a 5b 6a 5d 29 3b 62 72 65  trlen(&z[j]);bre
5b40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61  ak;.        defa
5b50: 75 6c 74 3a 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  ult:   z[j++] = 
5b60: 27 25 27 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  '%'; break;.    
5b70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5b80: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  z[j] = 0;.  sqli
5b90: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5ba0: 63 6f 6e 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 0a  context, z, -1,.
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bc0: 20 20 20 20 20 20 7a 3d 3d 7a 42 75 66 20 3f 20        z==zBuf ? 
5bd0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5be0: 20 3a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29   : sqlite3_free)
5bf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72 72 65  ;.}../*.** curre
5c00: 6e 74 5f 74 69 6d 65 28 29 0a 2a 2a 0a 2a 2a 20  nt_time().**.** 
5c10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
5c20: 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 76  turns the same v
5c30: 61 6c 75 65 20 61 73 20 74 69 6d 65 28 27 6e 6f  alue as time('no
5c40: 77 27 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  w')..*/.static v
5c50: 6f 69 64 20 63 74 69 6d 65 46 75 6e 63 28 0a 20  oid ctimeFunc(. 
5c60: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
5c70: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
5c80: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
5c90: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5ca0: 0a 20 20 74 69 6d 65 46 75 6e 63 28 63 6f 6e 74  .  timeFunc(cont
5cb0: 65 78 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  ext, 0, 0);.}../
5cc0: 2a 0a 2a 2a 20 63 75 72 72 65 6e 74 5f 64 61 74  *.** current_dat
5cd0: 65 28 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  e().**.** This f
5ce0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5cf0: 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61  the same value a
5d00: 73 20 64 61 74 65 28 27 6e 6f 77 27 29 2e 0a 2a  s date('now')..*
5d10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 64  /.static void cd
5d20: 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ateFunc(.  sqlit
5d30: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5d40: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
5d50: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5d60: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 64 61 74   **argv.){.  dat
5d70: 65 46 75 6e 63 28 63 6f 6e 74 65 78 74 2c 20 30  eFunc(context, 0
5d80: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63  , 0);.}../*.** c
5d90: 75 72 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70  urrent_timestamp
5da0: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ().**.** This fu
5db0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5dc0: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
5dd0: 20 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29   datetime('now')
5de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5df0: 20 63 74 69 6d 65 73 74 61 6d 70 46 75 6e 63 28   ctimestampFunc(
5e00: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5e10: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
5e20: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
5e30: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5e40: 29 7b 0a 20 20 64 61 74 65 74 69 6d 65 46 75 6e  ){.  datetimeFun
5e50: 63 28 63 6f 6e 74 65 78 74 2c 20 30 2c 20 30 29  c(context, 0, 0)
5e60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
5e70: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5e80: 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55 4e 43  IT_DATETIME_FUNC
5e90: 53 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  S) */..#ifdef SQ
5ea0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49  LITE_OMIT_DATETI
5eb0: 4d 45 5f 46 55 4e 43 53 0a 2f 2a 0a 2a 2a 20 49  ME_FUNCS./*.** I
5ec0: 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73  f the library is
5ed0: 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 6f 6d 69   compiled to omi
5ee0: 74 20 74 68 65 20 66 75 6c 6c 2d 73 63 61 6c 65  t the full-scale
5ef0: 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 0a 2a   date and time.*
5f00: 2a 20 68 61 6e 64 6c 69 6e 67 20 28 74 6f 20 67  * handling (to g
5f10: 65 74 20 61 20 73 6d 61 6c 6c 65 72 20 62 69 6e  et a smaller bin
5f20: 61 72 79 29 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ary), the follow
5f30: 69 6e 67 20 6d 69 6e 69 6d 61 6c 20 76 65 72 73  ing minimal vers
5f40: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 66 75  ion.** of the fu
5f50: 6e 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 5f  nctions current_
5f60: 74 69 6d 65 28 29 2c 20 63 75 72 72 65 6e 74 5f  time(), current_
5f70: 64 61 74 65 28 29 20 61 6e 64 20 63 75 72 72 65  date() and curre
5f80: 6e 74 5f 74 69 6d 65 73 74 61 6d 70 28 29 0a 2a  nt_timestamp().*
5f90: 2a 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69  * are included i
5fa0: 6e 73 74 65 61 64 2e 20 54 68 69 73 20 69 73 20  nstead. This is 
5fb0: 74 6f 20 73 75 70 70 6f 72 74 20 63 6f 6c 75 6d  to support colum
5fc0: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 74  n declarations t
5fd0: 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 20 22  hat.** include "
5fe0: 44 45 46 41 55 4c 54 20 43 55 52 52 45 4e 54 5f  DEFAULT CURRENT_
5ff0: 54 49 4d 45 22 20 65 74 63 2e 0a 2a 2a 0a 2a 2a  TIME" etc..**.**
6000: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   This function u
6010: 73 65 73 20 74 68 65 20 43 2d 6c 69 62 72 61 72  ses the C-librar
6020: 79 20 66 75 6e 63 74 69 6f 6e 73 20 74 69 6d 65  y functions time
6030: 28 29 2c 20 67 6d 74 69 6d 65 28 29 0a 2a 2a 20  (), gmtime().** 
6040: 61 6e 64 20 73 74 72 66 74 69 6d 65 28 29 2e 20  and strftime(). 
6050: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
6060: 67 20 74 6f 20 70 61 73 73 20 74 6f 20 73 74 72  g to pass to str
6070: 66 74 69 6d 65 28 29 20 69 73 20 73 75 70 70 6c  ftime() is suppl
6080: 69 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 75 73  ied.** as the us
6090: 65 72 2d 64 61 74 61 20 66 6f 72 20 74 68 65 20  er-data for the 
60a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
60b0: 74 69 63 20 76 6f 69 64 20 63 75 72 72 65 6e 74  tic void current
60c0: 54 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  TimeFunc(.  sqli
60d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
60e0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
60f0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
6100: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 69  e **argv.){.  ti
6110: 6d 65 5f 74 20 74 3b 0a 20 20 63 68 61 72 20 2a  me_t t;.  char *
6120: 7a 46 6f 72 6d 61 74 20 3d 20 28 63 68 61 72 20  zFormat = (char 
6130: 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
6140: 61 74 61 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  ata(context);.  
6150: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
6160: 6f 75 62 6c 65 20 72 54 3b 0a 20 20 63 68 61 72  ouble rT;.  char
6170: 20 7a 42 75 66 5b 32 30 5d 3b 0a 0a 20 20 64 62   zBuf[20];..  db
6180: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
6190: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
61a0: 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  text);.  sqlite3
61b0: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 64 62  OsCurrentTime(db
61c0: 2d 3e 70 56 66 73 2c 20 26 72 54 29 3b 0a 20 20  ->pVfs, &rT);.  
61d0: 74 20 3d 20 38 36 34 30 30 2e 30 2a 28 72 54 20  t = 86400.0*(rT 
61e0: 2d 20 32 34 34 30 35 38 37 2e 35 29 20 2b 20 30  - 2440587.5) + 0
61f0: 2e 35 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  .5;.#ifdef HAVE_
6200: 47 4d 54 49 4d 45 5f 52 0a 20 20 7b 0a 20 20 20  GMTIME_R.  {.   
6210: 20 73 74 72 75 63 74 20 74 6d 20 73 4e 6f 77 3b   struct tm sNow;
6220: 0a 20 20 20 20 67 6d 74 69 6d 65 5f 72 28 26 74  .    gmtime_r(&t
6230: 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 20 20 73 74  , &sNow);.    st
6240: 72 66 74 69 6d 65 28 7a 42 75 66 2c 20 32 30 2c  rftime(zBuf, 20,
6250: 20 7a 46 6f 72 6d 61 74 2c 20 26 73 4e 6f 77 29   zFormat, &sNow)
6260: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  ;.  }.#else.  {.
6270: 20 20 20 20 73 74 72 75 63 74 20 74 6d 20 2a 70      struct tm *p
6280: 54 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  Tm;.    sqlite3_
6290: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
62a0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
62b0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
62c0: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 20 20 20 20  C_MASTER));.    
62d0: 70 54 6d 20 3d 20 67 6d 74 69 6d 65 28 26 74 29  pTm = gmtime(&t)
62e0: 3b 0a 20 20 20 20 73 74 72 66 74 69 6d 65 28 7a  ;.    strftime(z
62f0: 42 75 66 2c 20 32 30 2c 20 7a 46 6f 72 6d 61 74  Buf, 20, zFormat
6300: 2c 20 70 54 6d 29 3b 0a 20 20 20 20 73 71 6c 69  , pTm);.    sqli
6310: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6320: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
6330: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6340: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
6350: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
6360: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
6370: 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c  t(context, zBuf,
6380: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
6390: 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66  SIENT);.}.#endif
63a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
63b0: 63 74 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64  ction registered
63c0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
63d0: 65 20 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  e C functions as
63e0: 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   SQL.** function
63f0: 73 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  s.  This should 
6400: 62 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74  be the only rout
6410: 69 6e 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ine in this file
6420: 20 77 69 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61   with.** externa
6430: 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f  l linkage..*/.vo
6440: 69 64 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  id sqlite3Regist
6450: 65 72 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69  erDateTimeFuncti
6460: 6f 6e 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ons(sqlite3 *db)
6470: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
6480: 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46  _OMIT_DATETIME_F
6490: 55 4e 43 53 0a 20 20 73 74 61 74 69 63 20 63 6f  UNCS.  static co
64a0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
64b0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
64c0: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
64d0: 20 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29     void (*xFunc)
64e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
64f0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
6500: 6c 75 65 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e  lue**);.  } aFun
6510: 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  cs[] = {.    { "
6520: 6a 75 6c 69 61 6e 64 61 79 22 2c 20 2d 31 2c 20  julianday", -1, 
6530: 6a 75 6c 69 61 6e 64 61 79 46 75 6e 63 20 20 20  juliandayFunc   
6540: 7d 2c 0a 20 20 20 20 7b 20 22 64 61 74 65 22 2c  },.    { "date",
6550: 20 20 20 20 20 20 2d 31 2c 20 64 61 74 65 46 75        -1, dateFu
6560: 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  nc        },.   
6570: 20 7b 20 22 74 69 6d 65 22 2c 20 20 20 20 20 20   { "time",      
6580: 2d 31 2c 20 74 69 6d 65 46 75 6e 63 20 20 20 20  -1, timeFunc    
6590: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 61      },.    { "da
65a0: 74 65 74 69 6d 65 22 2c 20 20 2d 31 2c 20 64 61  tetime",  -1, da
65b0: 74 65 74 69 6d 65 46 75 6e 63 20 20 20 20 7d 2c  tetimeFunc    },
65c0: 0a 20 20 20 20 7b 20 22 73 74 72 66 74 69 6d 65  .    { "strftime
65d0: 22 2c 20 20 2d 31 2c 20 73 74 72 66 74 69 6d 65  ",  -1, strftime
65e0: 46 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 7b  Func    },.    {
65f0: 20 22 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c   "current_time",
6600: 20 20 20 20 20 20 20 30 2c 20 63 74 69 6d 65 46         0, ctimeF
6610: 75 6e 63 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  unc      },.    
6620: 7b 20 22 63 75 72 72 65 6e 74 5f 74 69 6d 65 73  { "current_times
6630: 74 61 6d 70 22 2c 20 20 30 2c 20 63 74 69 6d 65  tamp",  0, ctime
6640: 73 74 61 6d 70 46 75 6e 63 20 7d 2c 0a 20 20 20  stampFunc },.   
6650: 20 7b 20 22 63 75 72 72 65 6e 74 5f 64 61 74 65   { "current_date
6660: 22 2c 20 20 20 20 20 20 20 30 2c 20 63 64 61 74  ",       0, cdat
6670: 65 46 75 6e 63 20 20 20 20 20 20 7d 2c 0a 20 20  eFunc      },.  
6680: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  };.  int i;..  f
6690: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
66a0: 28 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66 28  (aFuncs)/sizeof(
66b0: 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b 29  aFuncs[0]); i++)
66c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
66d0: 61 74 65 46 75 6e 63 28 64 62 2c 20 61 46 75 6e  ateFunc(db, aFun
66e0: 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75  cs[i].zName, aFu
66f0: 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20  ncs[i].nArg,.   
6700: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
6710: 2c 20 30 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78  , 0, aFuncs[i].x
6720: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
6730: 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20  .#else.  static 
6740: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
6750: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
6760: 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 46 6f 72  .     char *zFor
6770: 6d 61 74 3b 0a 20 20 7d 20 61 46 75 6e 63 73 5b  mat;.  } aFuncs[
6780: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 63 75 72  ] = {.    { "cur
6790: 72 65 6e 74 5f 74 69 6d 65 22 2c 20 22 25 48 3a  rent_time", "%H:
67a0: 25 4d 3a 25 53 22 20 7d 2c 0a 20 20 20 20 7b 20  %M:%S" },.    { 
67b0: 22 63 75 72 72 65 6e 74 5f 64 61 74 65 22 2c 20  "current_date", 
67c0: 22 25 59 2d 25 6d 2d 25 64 22 20 7d 2c 0a 20 20  "%Y-%m-%d" },.  
67d0: 20 20 7b 20 22 63 75 72 72 65 6e 74 5f 74 69 6d    { "current_tim
67e0: 65 73 74 61 6d 70 22 2c 20 22 25 59 2d 25 6d 2d  estamp", "%Y-%m-
67f0: 25 64 20 25 48 3a 25 4d 3a 25 53 22 20 7d 0a 20  %d %H:%M:%S" }. 
6800: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   };.  int i;..  
6810: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
6820: 66 28 61 46 75 6e 63 73 29 2f 73 69 7a 65 6f 66  f(aFuncs)/sizeof
6830: 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20 69 2b 2b  (aFuncs[0]); i++
6840: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  ){.    sqlite3Cr
6850: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 61 46 75  eateFunc(db, aFu
6860: 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 30 2c  ncs[i].zName, 0,
6870: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
6880: 20 20 20 20 20 20 20 61 46 75 6e 63 73 5b 69 5d         aFuncs[i]
6890: 2e 7a 46 6f 72 6d 61 74 2c 20 63 75 72 72 65 6e  .zFormat, curren
68a0: 74 54 69 6d 65 46 75 6e 63 2c 20 30 2c 20 30 29  tTimeFunc, 0, 0)
68b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a     ;.  }.#endif.}.