/ Hex Artifact Content
Login

Artifact 0d63575d484322aeb344224f6a11ab7c00373dd0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 4f 63 74 6f 62  /*.** 2003 Octob
0010: 65 72 20 33 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 31.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  e contains the C
0190: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
01a0: 69 6d 70 6c 65 6d 65 6e 74 20 64 61 74 65 20 61  implement date a
01b0: 6e 64 20 74 69 6d 65 0a 2a 2a 20 66 75 6e 63 74  nd time.** funct
01c0: 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 2e  ions for SQLite.
01d0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69    .**.** There i
01e0: 73 20 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72  s only one expor
01f0: 74 65 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  ted symbol in th
0200: 69 73 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75  is file - the fu
0210: 6e 63 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65  nction.** sqlite
0220: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
0230: 65 46 75 6e 63 74 69 6f 6e 73 28 29 20 66 6f 75  eFunctions() fou
0240: 6e 64 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  nd at the bottom
0250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   of the file..**
0260: 20 41 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   All other code 
0270: 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 2e 0a  has file scope..
0280: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 70 72 6f  **.** SQLite pro
0290: 63 65 73 73 65 73 20 61 6c 6c 20 74 69 6d 65 73  cesses all times
02a0: 20 61 6e 64 20 64 61 74 65 73 20 61 73 20 4a 75   and dates as Ju
02b0: 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 73  lian Day numbers
02c0: 2e 20 20 54 68 65 0a 2a 2a 20 64 61 74 65 73 20  .  The.** dates 
02d0: 61 6e 64 20 74 69 6d 65 73 20 61 72 65 20 73 74  and times are st
02e0: 6f 72 65 64 20 61 73 20 74 68 65 20 6e 75 6d 62  ored as the numb
02f0: 65 72 20 6f 66 20 64 61 79 73 20 73 69 6e 63 65  er of days since
0300: 20 6e 6f 6f 6e 0a 2a 2a 20 69 6e 20 47 72 65 65   noon.** in Gree
0310: 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
0320: 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 2e 20  r 24, 4714 B.C. 
0330: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
0340: 20 47 72 65 67 6f 72 69 61 6e 0a 2a 2a 20 63 61   Gregorian.** ca
0350: 6c 65 6e 64 61 72 20 73 79 73 74 65 6d 2e 20 0a  lendar system. .
0360: 2a 2a 0a 2a 2a 20 31 39 37 30 2d 30 31 2d 30 31  **.** 1970-01-01
0370: 20 30 30 3a 30 30 3a 30 30 20 69 73 20 4a 44 20   00:00:00 is JD 
0380: 32 34 34 30 35 38 37 2e 35 0a 2a 2a 20 32 30 30  2440587.5.** 200
0390: 30 2d 30 31 2d 30 31 20 30 30 3a 30 30 3a 30 30  0-01-01 00:00:00
03a0: 20 69 73 20 4a 44 20 32 34 35 31 35 34 34 2e 35   is JD 2451544.5
03b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6d 70 6c  .**.** This impl
03c0: 65 6d 65 6e 74 69 6f 6e 20 72 65 71 75 69 72 65  emention require
03d0: 73 20 79 65 61 72 73 20 74 6f 20 62 65 20 65 78  s years to be ex
03e0: 70 72 65 73 73 65 64 20 61 73 20 61 20 34 2d 64  pressed as a 4-d
03f0: 69 67 69 74 20 6e 75 6d 62 65 72 0a 2a 2a 20 77  igit number.** w
0400: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
0410: 6f 6e 6c 79 20 64 61 74 65 73 20 62 65 74 77 65  only dates betwe
0420: 65 6e 20 30 30 30 30 2d 30 31 2d 30 31 20 61 6e  en 0000-01-01 an
0430: 64 20 39 39 39 39 2d 31 32 2d 33 31 20 63 61 6e  d 9999-12-31 can
0440: 0a 2a 2a 20 62 65 20 72 65 70 72 65 73 65 6e 74  .** be represent
0450: 65 64 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ed, even though 
0460: 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65  julian day numbe
0470: 72 73 20 61 6c 6c 6f 77 20 61 20 6d 75 63 68 20  rs allow a much 
0480: 77 69 64 65 72 0a 2a 2a 20 72 61 6e 67 65 20 6f  wider.** range o
0490: 66 20 64 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  f dates..**.** T
04a0: 68 65 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  he Gregorian cal
04b0: 65 6e 64 61 72 20 73 79 73 74 65 6d 20 69 73 20  endar system is 
04c0: 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74  used for all dat
04d0: 65 73 20 61 6e 64 20 74 69 6d 65 73 2c 0a 2a 2a  es and times,.**
04e0: 20 65 76 65 6e 20 74 68 6f 73 65 20 74 68 61 74   even those that
04f0: 20 70 72 65 64 61 74 65 20 74 68 65 20 47 72 65   predate the Gre
0500: 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
0510: 20 20 48 69 73 74 6f 72 69 61 6e 73 20 75 73 75    Historians usu
0520: 61 6c 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20  ally.** use the 
0530: 4a 75 6c 69 61 6e 20 63 61 6c 65 6e 64 61 72 20  Julian calendar 
0540: 66 6f 72 20 64 61 74 65 73 20 70 72 69 6f 72 20  for dates prior 
0550: 74 6f 20 31 35 38 32 2d 31 30 2d 31 35 20 61 6e  to 1582-10-15 an
0560: 64 20 66 6f 72 20 73 6f 6d 65 0a 2a 2a 20 64 61  d for some.** da
0570: 74 65 73 20 61 66 74 65 72 77 61 72 64 73 2c 20  tes afterwards, 
0580: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 6c 6f 63  depending on loc
0590: 61 6c 65 2e 20 20 42 65 77 61 72 65 20 6f 66 20  ale.  Beware of 
05a0: 74 68 69 73 20 64 69 66 66 65 72 65 6e 63 65 2e  this difference.
05b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 76 65  .**.** The conve
05c0: 72 73 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  rsion algorithms
05d0: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
05e0: 20 62 61 73 65 64 20 6f 6e 20 64 65 73 63 72 69   based on descri
05f0: 70 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  ptions.** in the
0600: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 3a   following text:
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 4a 65 61 6e  .**.**      Jean
0620: 20 4d 65 65 75 73 0a 2a 2a 20 20 20 20 20 20 41   Meeus.**      A
0630: 73 74 72 6f 6e 6f 6d 69 63 61 6c 20 41 6c 67 6f  stronomical Algo
0640: 72 69 74 68 6d 73 2c 20 32 6e 64 20 45 64 69 74  rithms, 2nd Edit
0650: 69 6f 6e 2c 20 31 39 39 38 0a 2a 2a 20 20 20 20  ion, 1998.**    
0660: 20 20 49 53 42 4d 20 30 2d 39 34 33 33 39 36 2d    ISBM 0-943396-
0670: 36 31 2d 31 0a 2a 2a 20 20 20 20 20 20 57 69 6c  61-1.**      Wil
0680: 6c 6d 61 6e 6e 2d 42 65 6c 6c 2c 20 49 6e 63 0a  lmann-Bell, Inc.
0690: 2a 2a 20 20 20 20 20 20 52 69 63 68 6d 6f 6e 64  **      Richmond
06a0: 2c 20 56 69 72 67 69 6e 69 61 20 28 55 53 41 29  , Virginia (USA)
06b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
06c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
06d0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
06e0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
06f0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  h>.#include <tim
0700: 65 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51  e.h>..#ifndef SQ
0710: 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49  LITE_OMIT_DATETI
0720: 4d 45 5f 46 55 4e 43 53 0a 0a 2f 2a 0a 2a 2a 20  ME_FUNCS../*.** 
0730: 4f 6e 20 72 65 63 65 6e 74 20 57 69 6e 64 6f 77  On recent Window
0740: 73 20 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65  s platforms, the
0750: 20 6c 6f 63 61 6c 74 69 6d 65 5f 73 28 29 20 66   localtime_s() f
0760: 75 6e 63 74 69 6f 6e 20 69 73 20 61 76 61 69 6c  unction is avail
0770: 61 62 6c 65 0a 2a 2a 20 61 73 20 70 61 72 74 20  able.** as part 
0780: 6f 66 20 74 68 65 20 22 53 65 63 75 72 65 20 43  of the "Secure C
0790: 52 54 22 2e 20 49 74 20 69 73 20 65 73 73 65 6e  RT". It is essen
07a0: 74 69 61 6c 6c 79 20 65 71 75 69 76 61 6c 65 6e  tially equivalen
07b0: 74 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 6c 74 69  t to .** localti
07c0: 6d 65 5f 72 28 29 20 61 76 61 69 6c 61 62 6c 65  me_r() available
07d0: 20 75 6e 64 65 72 20 6d 6f 73 74 20 50 4f 53 49   under most POSI
07e0: 58 20 70 6c 61 74 66 6f 72 6d 73 2c 20 65 78 63  X platforms, exc
07f0: 65 70 74 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  ept that the .**
0800: 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 70 61   order of the pa
0810: 72 61 6d 65 74 65 72 73 20 69 73 20 72 65 76 65  rameters is reve
0820: 72 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  rsed..**.** See 
0830: 68 74 74 70 3a 2f 2f 6d 73 64 6e 2e 6d 69 63 72  http://msdn.micr
0840: 6f 73 6f 66 74 2e 63 6f 6d 2f 65 6e 2d 75 73 2f  osoft.com/en-us/
0850: 6c 69 62 72 61 72 79 2f 61 34 34 32 78 33 79 65  library/a442x3ye
0860: 28 56 53 2e 38 30 29 2e 61 73 70 78 2e 0a 2a 2a  (VS.80).aspx..**
0870: 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20  .** If the user 
0880: 68 61 73 20 6e 6f 74 20 69 6e 64 69 63 61 74 65  has not indicate
0890: 64 20 74 6f 20 75 73 65 20 6c 6f 63 61 6c 74 69  d to use localti
08a0: 6d 65 5f 72 28 29 20 6f 72 20 6c 6f 63 61 6c 74  me_r() or localt
08b0: 69 6d 65 5f 73 28 29 0a 2a 2a 20 61 6c 72 65 61  ime_s().** alrea
08c0: 64 79 2c 20 63 68 65 63 6b 20 66 6f 72 20 61 6e  dy, check for an
08d0: 20 4d 53 56 43 20 62 75 69 6c 64 20 65 6e 76 69   MSVC build envi
08e0: 72 6f 6e 6d 65 6e 74 20 74 68 61 74 20 70 72 6f  ronment that pro
08f0: 76 69 64 65 73 20 0a 2a 2a 20 6c 6f 63 61 6c 74  vides .** localt
0900: 69 6d 65 5f 73 28 29 2e 0a 2a 2f 0a 23 69 66 20  ime_s()..*/.#if 
0910: 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 4f  !defined(HAVE_LO
0920: 43 41 4c 54 49 4d 45 5f 52 29 20 26 26 20 21 64  CALTIME_R) && !d
0930: 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 4f 43 41  efined(HAVE_LOCA
0940: 4c 54 49 4d 45 5f 53 29 20 26 26 20 5c 0a 20 20  LTIME_S) && \.  
0950: 20 20 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f     defined(_MSC_
0960: 56 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28  VER) && defined(
0970: 5f 43 52 54 5f 49 4e 53 45 43 55 52 45 5f 44 45  _CRT_INSECURE_DE
0980: 50 52 45 43 41 54 45 29 0a 23 64 65 66 69 6e 65  PRECATE).#define
0990: 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f   HAVE_LOCALTIME_
09a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
09b0: 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 66 6f  * A structure fo
09c0: 72 20 68 6f 6c 64 69 6e 67 20 61 20 73 69 6e 67  r holding a sing
09d0: 6c 65 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65  le date and time
09e0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
09f0: 75 63 74 20 44 61 74 65 54 69 6d 65 20 44 61 74  uct DateTime Dat
0a00: 65 54 69 6d 65 3b 0a 73 74 72 75 63 74 20 44 61  eTime;.struct Da
0a10: 74 65 54 69 6d 65 20 7b 0a 20 20 73 71 6c 69 74  teTime {.  sqlit
0a20: 65 33 5f 69 6e 74 36 34 20 69 4a 44 3b 20 2f 2a  e3_int64 iJD; /*
0a30: 20 54 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 20   The julian day 
0a40: 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 34  number times 864
0a50: 30 30 30 30 30 20 2a 2f 0a 20 20 69 6e 74 20 59  00000 */.  int Y
0a60: 2c 20 4d 2c 20 44 3b 20 20 20 20 20 20 20 2f 2a  , M, D;       /*
0a70: 20 59 65 61 72 2c 20 6d 6f 6e 74 68 2c 20 61 6e   Year, month, an
0a80: 64 20 64 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68  d day */.  int h
0a90: 2c 20 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  , m;          /*
0aa0: 20 48 6f 75 72 20 61 6e 64 20 6d 69 6e 75 74 65   Hour and minute
0ab0: 73 20 2a 2f 0a 20 20 69 6e 74 20 74 7a 3b 20 20  s */.  int tz;  
0ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 69 6d            /* Tim
0ad0: 65 7a 6f 6e 65 20 6f 66 66 73 65 74 20 69 6e 20  ezone offset in 
0ae0: 6d 69 6e 75 74 65 73 20 2a 2f 0a 20 20 64 6f 75  minutes */.  dou
0af0: 62 6c 65 20 73 3b 20 20 20 20 20 20 20 20 20 20  ble s;          
0b00: 2f 2a 20 53 65 63 6f 6e 64 73 20 2a 2f 0a 20 20  /* Seconds */.  
0b10: 63 68 61 72 20 76 61 6c 69 64 59 4d 44 3b 20 20  char validYMD;  
0b20: 20 20 20 2f 2a 20 54 72 75 65 20 28 31 29 20 69     /* True (1) i
0b30: 66 20 59 2c 4d 2c 44 20 61 72 65 20 76 61 6c 69  f Y,M,D are vali
0b40: 64 20 2a 2f 0a 20 20 63 68 61 72 20 76 61 6c 69  d */.  char vali
0b50: 64 48 4d 53 3b 20 20 20 20 20 2f 2a 20 54 72 75  dHMS;     /* Tru
0b60: 65 20 28 31 29 20 69 66 20 68 2c 6d 2c 73 20 61  e (1) if h,m,s a
0b70: 72 65 20 76 61 6c 69 64 20 2a 2f 0a 20 20 63 68  re valid */.  ch
0b80: 61 72 20 76 61 6c 69 64 4a 44 3b 20 20 20 20 20  ar validJD;     
0b90: 20 2f 2a 20 54 72 75 65 20 28 31 29 20 69 66 20   /* True (1) if 
0ba0: 69 4a 44 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  iJD is valid */.
0bb0: 20 20 63 68 61 72 20 76 61 6c 69 64 54 5a 3b 20    char validTZ; 
0bc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 28 31 29       /* True (1)
0bd0: 20 69 66 20 74 7a 20 69 73 20 76 61 6c 69 64 20   if tz is valid 
0be0: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  */.};.../*.** Co
0bf0: 6e 76 65 72 74 20 7a 44 61 74 65 20 69 6e 74 6f  nvert zDate into
0c00: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 74   one or more int
0c10: 65 67 65 72 73 2e 20 20 41 64 64 69 74 69 6f 6e  egers.  Addition
0c20: 61 6c 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20  al arguments.** 
0c30: 63 6f 6d 65 20 69 6e 20 67 72 6f 75 70 73 20 6f  come in groups o
0c40: 66 20 35 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  f 5 as follows:.
0c50: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4e 20 20 20  **.**       N   
0c60: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 64 69      number of di
0c70: 67 69 74 73 20 69 6e 20 74 68 65 20 69 6e 74 65  gits in the inte
0c80: 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 6d 69 6e  ger.**       min
0c90: 20 20 20 20 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c       minimum all
0ca0: 6f 77 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  owed value of th
0cb0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  e integer.**    
0cc0: 20 20 20 6d 61 78 20 20 20 20 20 6d 61 78 69 6d     max     maxim
0cd0: 75 6d 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  um allowed value
0ce0: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a   of the integer.
0cf0: 2a 2a 20 20 20 20 20 20 20 6e 65 78 74 43 20 20  **       nextC  
0d00: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
0d10: 20 61 66 74 65 72 20 74 68 65 20 69 6e 74 65 67   after the integ
0d20: 65 72 0a 2a 2a 20 20 20 20 20 20 20 70 56 61 6c  er.**       pVal
0d30: 20 20 20 20 77 68 65 72 65 20 74 6f 20 77 72 69      where to wri
0d40: 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20  te the integers 
0d50: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e  value..**.** Con
0d60: 76 65 72 73 69 6f 6e 73 20 63 6f 6e 74 69 6e 75  versions continu
0d70: 65 20 75 6e 74 69 6c 20 6f 6e 65 20 77 69 74 68  e until one with
0d80: 20 6e 65 78 74 43 3d 3d 30 20 69 73 20 65 6e 63   nextC==0 is enc
0d90: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 20 54 68 65  ountered..** The
0da0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
0db0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
0dc0: 73 75 63 63 65 73 73 66 75 6c 20 63 6f 6e 76 65  successful conve
0dd0: 72 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  rsions..*/.stati
0de0: 63 20 69 6e 74 20 67 65 74 44 69 67 69 74 73 28  c int getDigits(
0df0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
0e00: 65 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  e, ...){.  va_li
0e10: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 76 61 6c  st ap;.  int val
0e20: 3b 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74  ;.  int N;.  int
0e30: 20 6d 69 6e 3b 0a 20 20 69 6e 74 20 6d 61 78 3b   min;.  int max;
0e40: 0a 20 20 69 6e 74 20 6e 65 78 74 43 3b 0a 20 20  .  int nextC;.  
0e50: 69 6e 74 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  int *pVal;.  int
0e60: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 76 61 5f 73   cnt = 0;.  va_s
0e70: 74 61 72 74 28 61 70 2c 20 7a 44 61 74 65 29 3b  tart(ap, zDate);
0e80: 0a 20 20 64 6f 7b 0a 20 20 20 20 4e 20 3d 20 76  .  do{.    N = v
0e90: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
0ea0: 20 20 20 20 6d 69 6e 20 3d 20 76 61 5f 61 72 67      min = va_arg
0eb0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 6d  (ap, int);.    m
0ec0: 61 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ax = va_arg(ap, 
0ed0: 69 6e 74 29 3b 0a 20 20 20 20 6e 65 78 74 43 20  int);.    nextC 
0ee0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ef0: 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 76 61  );.    pVal = va
0f00: 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
0f10: 20 20 20 20 76 61 6c 20 3d 20 30 3b 0a 20 20 20      val = 0;.   
0f20: 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20   while( N-- ){. 
0f30: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
0f40: 33 49 73 64 69 67 69 74 28 2a 7a 44 61 74 65 29  3Isdigit(*zDate)
0f50: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
0f60: 20 65 6e 64 5f 67 65 74 44 69 67 69 74 73 3b 0a   end_getDigits;.
0f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76 61        }.      va
0f80: 6c 20 3d 20 76 61 6c 2a 31 30 20 2b 20 2a 7a 44  l = val*10 + *zD
0f90: 61 74 65 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  ate - '0';.     
0fa0: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a   zDate++;.    }.
0fb0: 20 20 20 20 69 66 28 20 76 61 6c 3c 6d 69 6e 20      if( val<min 
0fc0: 7c 7c 20 76 61 6c 3e 6d 61 78 20 7c 7c 20 28 6e  || val>max || (n
0fd0: 65 78 74 43 21 3d 30 20 26 26 20 6e 65 78 74 43  extC!=0 && nextC
0fe0: 21 3d 2a 7a 44 61 74 65 29 20 29 7b 0a 20 20 20  !=*zDate) ){.   
0ff0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 67 65 74 44     goto end_getD
1000: 69 67 69 74 73 3b 0a 20 20 20 20 7d 0a 20 20 20  igits;.    }.   
1010: 20 2a 70 56 61 6c 20 3d 20 76 61 6c 3b 0a 20 20   *pVal = val;.  
1020: 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 63    zDate++;.    c
1030: 6e 74 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  nt++;.  }while( 
1040: 6e 65 78 74 43 20 29 3b 0a 65 6e 64 5f 67 65 74  nextC );.end_get
1050: 44 69 67 69 74 73 3a 0a 20 20 76 61 5f 65 6e 64  Digits:.  va_end
1060: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  (ap);.  return c
1070: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  nt;.}../*.** Par
1080: 73 65 20 61 20 74 69 6d 65 7a 6f 6e 65 20 65 78  se a timezone ex
1090: 74 65 6e 73 69 6f 6e 20 6f 6e 20 74 68 65 20 65  tension on the e
10a0: 6e 64 20 6f 66 20 61 20 64 61 74 65 2d 74 69 6d  nd of a date-tim
10b0: 65 2e 0a 2a 2a 20 54 68 65 20 65 78 74 65 6e 73  e..** The extens
10c0: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
10d0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rm:.**.**       
10e0: 20 28 2b 2f 2d 29 48 48 3a 4d 4d 0a 2a 2a 0a 2a   (+/-)HH:MM.**.*
10f0: 2a 20 4f 72 20 74 68 65 20 22 7a 75 6c 75 22 20  * Or the "zulu" 
1100: 6e 6f 74 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  notation:.**.** 
1110: 20 20 20 20 20 20 20 5a 0a 2a 2a 0a 2a 2a 20 49         Z.**.** I
1120: 66 20 74 68 65 20 70 61 72 73 65 20 69 73 20 73  f the parse is s
1130: 75 63 63 65 73 73 66 75 6c 2c 20 77 72 69 74 65  uccessful, write
1140: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
1150: 69 6e 75 74 65 73 0a 2a 2a 20 6f 66 20 63 68 61  inutes.** of cha
1160: 6e 67 65 20 69 6e 20 70 2d 3e 74 7a 20 61 6e 64  nge in p->tz and
1170: 20 72 65 74 75 72 6e 20 30 2e 20 20 49 66 20 61   return 0.  If a
1180: 20 70 61 72 73 65 72 20 65 72 72 6f 72 20 6f 63   parser error oc
1190: 63 75 72 73 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  curs,.** return 
11a0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
11b0: 41 20 6d 69 73 73 69 6e 67 20 73 70 65 63 69 66  A missing specif
11c0: 69 65 72 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  ier is not consi
11d0: 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2e 0a  dered an error..
11e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11f0: 72 73 65 54 69 6d 65 7a 6f 6e 65 28 63 6f 6e 73  rseTimezone(cons
1200: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 44  t char *zDate, D
1210: 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69  ateTime *p){.  i
1220: 6e 74 20 73 67 6e 20 3d 20 30 3b 0a 20 20 69 6e  nt sgn = 0;.  in
1230: 74 20 6e 48 72 2c 20 6e 4d 6e 3b 0a 20 20 69 6e  t nHr, nMn;.  in
1240: 74 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  t c;.  while( sq
1250: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 44  lite3Isspace(*zD
1260: 61 74 65 29 20 29 7b 20 7a 44 61 74 65 2b 2b 3b  ate) ){ zDate++;
1270: 20 7d 0a 20 20 70 2d 3e 74 7a 20 3d 20 30 3b 0a   }.  p->tz = 0;.
1280: 20 20 63 20 3d 20 2a 7a 44 61 74 65 3b 0a 20 20    c = *zDate;.  
1290: 69 66 28 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20  if( c=='-' ){.  
12a0: 20 20 73 67 6e 20 3d 20 2d 31 3b 0a 20 20 7d 65    sgn = -1;.  }e
12b0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 2b 27 20 29  lse if( c=='+' )
12c0: 7b 0a 20 20 20 20 73 67 6e 20 3d 20 2b 31 3b 0a  {.    sgn = +1;.
12d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
12e0: 5a 27 20 7c 7c 20 63 3d 3d 27 7a 27 20 29 7b 0a  Z' || c=='z' ){.
12f0: 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20      zDate++;.   
1300: 20 67 6f 74 6f 20 7a 75 6c 75 5f 74 69 6d 65 3b   goto zulu_time;
1310: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1320: 74 75 72 6e 20 63 21 3d 30 3b 0a 20 20 7d 0a 20  turn c!=0;.  }. 
1330: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 69 66 28 20   zDate++;.  if( 
1340: 67 65 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c  getDigits(zDate,
1350: 20 32 2c 20 30 2c 20 31 34 2c 20 27 3a 27 2c 20   2, 0, 14, ':', 
1360: 26 6e 48 72 2c 20 32 2c 20 30 2c 20 35 39 2c 20  &nHr, 2, 0, 59, 
1370: 30 2c 20 26 6e 4d 6e 29 21 3d 32 20 29 7b 0a 20  0, &nMn)!=2 ){. 
1380: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1390: 0a 20 20 7a 44 61 74 65 20 2b 3d 20 35 3b 0a 20  .  zDate += 5;. 
13a0: 20 70 2d 3e 74 7a 20 3d 20 73 67 6e 2a 28 6e 4d   p->tz = sgn*(nM
13b0: 6e 20 2b 20 6e 48 72 2a 36 30 29 3b 0a 7a 75 6c  n + nHr*60);.zul
13c0: 75 5f 74 69 6d 65 3a 0a 20 20 77 68 69 6c 65 28  u_time:.  while(
13d0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
13e0: 2a 7a 44 61 74 65 29 20 29 7b 20 7a 44 61 74 65  *zDate) ){ zDate
13f0: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  ++; }.  return *
1400: 7a 44 61 74 65 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  zDate!=0;.}../*.
1410: 2a 2a 20 50 61 72 73 65 20 74 69 6d 65 73 20 6f  ** Parse times o
1420: 66 20 74 68 65 20 66 6f 72 6d 20 48 48 3a 4d 4d  f the form HH:MM
1430: 20 6f 72 20 48 48 3a 4d 4d 3a 53 53 20 6f 72 20   or HH:MM:SS or 
1440: 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 46 2e 0a 2a  HH:MM:SS.FFFF..*
1450: 2a 20 54 68 65 20 48 48 2c 20 4d 4d 2c 20 61 6e  * The HH, MM, an
1460: 64 20 53 53 20 6d 75 73 74 20 65 61 63 68 20 62  d SS must each b
1470: 65 20 65 78 61 63 74 6c 79 20 32 20 64 69 67 69  e exactly 2 digi
1480: 74 73 2e 20 20 54 68 65 0a 2a 2a 20 66 72 61 63  ts.  The.** frac
1490: 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 20 46  tional seconds F
14a0: 46 46 46 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f  FFF can be one o
14b0: 72 20 6d 6f 72 65 20 64 69 67 69 74 73 2e 0a 2a  r more digits..*
14c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
14d0: 20 74 68 65 72 65 20 69 73 20 61 20 70 61 72 73   there is a pars
14e0: 69 6e 67 20 65 72 72 6f 72 20 61 6e 64 20 30 20  ing error and 0 
14f0: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73  on success..*/.s
1500: 74 61 74 69 63 20 69 6e 74 20 70 61 72 73 65 48  tatic int parseH
1510: 68 4d 6d 53 73 28 63 6f 6e 73 74 20 63 68 61 72  hMmSs(const char
1520: 20 2a 7a 44 61 74 65 2c 20 44 61 74 65 54 69 6d   *zDate, DateTim
1530: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 2c 20  e *p){.  int h, 
1540: 6d 2c 20 73 3b 0a 20 20 64 6f 75 62 6c 65 20 6d  m, s;.  double m
1550: 73 20 3d 20 30 2e 30 3b 0a 20 20 69 66 28 20 67  s = 0.0;.  if( g
1560: 65 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c 20  etDigits(zDate, 
1570: 32 2c 20 30 2c 20 32 34 2c 20 27 3a 27 2c 20 26  2, 0, 24, ':', &
1580: 68 2c 20 32 2c 20 30 2c 20 35 39 2c 20 30 2c 20  h, 2, 0, 59, 0, 
1590: 26 6d 29 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  &m)!=2 ){.    re
15a0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 7a 44  turn 1;.  }.  zD
15b0: 61 74 65 20 2b 3d 20 35 3b 0a 20 20 69 66 28 20  ate += 5;.  if( 
15c0: 2a 7a 44 61 74 65 3d 3d 27 3a 27 20 29 7b 0a 20  *zDate==':' ){. 
15d0: 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20     zDate++;.    
15e0: 69 66 28 20 67 65 74 44 69 67 69 74 73 28 7a 44  if( getDigits(zD
15f0: 61 74 65 2c 20 32 2c 20 30 2c 20 35 39 2c 20 30  ate, 2, 0, 59, 0
1600: 2c 20 26 73 29 21 3d 31 20 29 7b 0a 20 20 20 20  , &s)!=1 ){.    
1610: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1620: 7d 0a 20 20 20 20 7a 44 61 74 65 20 2b 3d 20 32  }.    zDate += 2
1630: 3b 0a 20 20 20 20 69 66 28 20 2a 7a 44 61 74 65  ;.    if( *zDate
1640: 3d 3d 27 2e 27 20 26 26 20 73 71 6c 69 74 65 33  =='.' && sqlite3
1650: 49 73 64 69 67 69 74 28 7a 44 61 74 65 5b 31 5d  Isdigit(zDate[1]
1660: 29 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  ) ){.      doubl
1670: 65 20 72 53 63 61 6c 65 20 3d 20 31 2e 30 3b 0a  e rScale = 1.0;.
1680: 20 20 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20        zDate++;. 
1690: 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
16a0: 74 65 33 49 73 64 69 67 69 74 28 2a 7a 44 61 74  te3Isdigit(*zDat
16b0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 73  e) ){.        ms
16c0: 20 3d 20 6d 73 2a 31 30 2e 30 20 2b 20 2a 7a 44   = ms*10.0 + *zD
16d0: 61 74 65 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  ate - '0';.     
16e0: 20 20 20 72 53 63 61 6c 65 20 2a 3d 20 31 30 2e     rScale *= 10.
16f0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65  0;.        zDate
1700: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1710: 20 20 6d 73 20 2f 3d 20 72 53 63 61 6c 65 3b 0a    ms /= rScale;.
1720: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1730: 20 20 20 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20     s = 0;.  }.  
1740: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a  p->validJD = 0;.
1750: 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20    p->validHMS = 
1760: 31 3b 0a 20 20 70 2d 3e 68 20 3d 20 68 3b 0a 20  1;.  p->h = h;. 
1770: 20 70 2d 3e 6d 20 3d 20 6d 3b 0a 20 20 70 2d 3e   p->m = m;.  p->
1780: 73 20 3d 20 73 20 2b 20 6d 73 3b 0a 20 20 69 66  s = s + ms;.  if
1790: 28 20 70 61 72 73 65 54 69 6d 65 7a 6f 6e 65 28  ( parseTimezone(
17a0: 7a 44 61 74 65 2c 20 70 29 20 29 20 72 65 74 75  zDate, p) ) retu
17b0: 72 6e 20 31 3b 0a 20 20 70 2d 3e 76 61 6c 69 64  rn 1;.  p->valid
17c0: 54 5a 20 3d 20 28 70 2d 3e 74 7a 21 3d 30 29 3f  TZ = (p->tz!=0)?
17d0: 31 3a 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  1:0;.  return 0;
17e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
17f0: 74 20 66 72 6f 6d 20 59 59 59 59 2d 4d 4d 2d 44  t from YYYY-MM-D
1800: 44 20 48 48 3a 4d 4d 3a 53 53 20 74 6f 20 6a 75  D HH:MM:SS to ju
1810: 6c 69 61 6e 20 64 61 79 2e 20 20 57 65 20 61 6c  lian day.  We al
1820: 77 61 79 73 20 61 73 73 75 6d 65 0a 2a 2a 20 74  ways assume.** t
1830: 68 61 74 20 74 68 65 20 59 59 59 59 2d 4d 4d 2d  hat the YYYY-MM-
1840: 44 44 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20  DD is according 
1850: 74 6f 20 74 68 65 20 47 72 65 67 6f 72 69 61 6e  to the Gregorian
1860: 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
1870: 20 52 65 66 65 72 65 6e 63 65 3a 20 20 4d 65 65   Reference:  Mee
1880: 75 73 20 70 61 67 65 20 36 31 0a 2a 2f 0a 73 74  us page 61.*/.st
1890: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
18a0: 65 4a 44 28 44 61 74 65 54 69 6d 65 20 2a 70 29  eJD(DateTime *p)
18b0: 7b 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c  {.  int Y, M, D,
18c0: 20 41 2c 20 42 2c 20 58 31 2c 20 58 32 3b 0a 0a   A, B, X1, X2;..
18d0: 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 4a 44    if( p->validJD
18e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
18f0: 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 29 7b 0a   p->validYMD ){.
1900: 20 20 20 20 59 20 3d 20 70 2d 3e 59 3b 0a 20 20      Y = p->Y;.  
1910: 20 20 4d 20 3d 20 70 2d 3e 4d 3b 0a 20 20 20 20    M = p->M;.    
1920: 44 20 3d 20 70 2d 3e 44 3b 0a 20 20 7d 65 6c 73  D = p->D;.  }els
1930: 65 7b 0a 20 20 20 20 59 20 3d 20 32 30 30 30 3b  e{.    Y = 2000;
1940: 20 20 2f 2a 20 49 66 20 6e 6f 20 59 4d 44 20 73    /* If no YMD s
1950: 70 65 63 69 66 69 65 64 2c 20 61 73 73 75 6d 65  pecified, assume
1960: 20 32 30 30 30 2d 4a 61 6e 2d 30 31 20 2a 2f 0a   2000-Jan-01 */.
1970: 20 20 20 20 4d 20 3d 20 31 3b 0a 20 20 20 20 44      M = 1;.    D
1980: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
1990: 4d 3c 3d 32 20 29 7b 0a 20 20 20 20 59 2d 2d 3b  M<=2 ){.    Y--;
19a0: 0a 20 20 20 20 4d 20 2b 3d 20 31 32 3b 0a 20 20  .    M += 12;.  
19b0: 7d 0a 20 20 41 20 3d 20 59 2f 31 30 30 3b 0a 20  }.  A = Y/100;. 
19c0: 20 42 20 3d 20 32 20 2d 20 41 20 2b 20 28 41 2f   B = 2 - A + (A/
19d0: 34 29 3b 0a 20 20 58 31 20 3d 20 33 36 35 32 35  4);.  X1 = 36525
19e0: 2a 28 59 2b 34 37 31 36 29 2f 31 30 30 3b 0a 20  *(Y+4716)/100;. 
19f0: 20 58 32 20 3d 20 33 30 36 30 30 31 2a 28 4d 2b   X2 = 306001*(M+
1a00: 31 29 2f 31 30 30 30 30 3b 0a 20 20 70 2d 3e 69  1)/10000;.  p->i
1a10: 4a 44 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  JD = (sqlite3_in
1a20: 74 36 34 29 28 28 58 31 20 2b 20 58 32 20 2b 20  t64)((X1 + X2 + 
1a30: 44 20 2b 20 42 20 2d 20 31 35 32 34 2e 35 20 29  D + B - 1524.5 )
1a40: 20 2a 20 38 36 34 30 30 30 30 30 29 3b 0a 20 20   * 86400000);.  
1a50: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a  p->validJD = 1;.
1a60: 20 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 48 4d    if( p->validHM
1a70: 53 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4a 44 20  S ){.    p->iJD 
1a80: 2b 3d 20 70 2d 3e 68 2a 33 36 30 30 30 30 30 20  += p->h*3600000 
1a90: 2b 20 70 2d 3e 6d 2a 36 30 30 30 30 20 2b 20 28  + p->m*60000 + (
1aa0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 70  sqlite3_int64)(p
1ab0: 2d 3e 73 2a 31 30 30 30 29 3b 0a 20 20 20 20 69  ->s*1000);.    i
1ac0: 66 28 20 70 2d 3e 76 61 6c 69 64 54 5a 20 29 7b  f( p->validTZ ){
1ad0: 0a 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2d 3d  .      p->iJD -=
1ae0: 20 70 2d 3e 74 7a 2a 36 30 30 30 30 3b 0a 20 20   p->tz*60000;.  
1af0: 20 20 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20      p->validYMD 
1b00: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61  = 0;.      p->va
1b10: 6c 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20 20 20  lidHMS = 0;.    
1b20: 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30    p->validTZ = 0
1b30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1b40: 2a 0a 2a 2a 20 50 61 72 73 65 20 64 61 74 65 73  *.** Parse dates
1b50: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
1b60: 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44  **     YYYY-MM-D
1b70: 44 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 0a 2a  D HH:MM:SS.FFF.*
1b80: 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44  *     YYYY-MM-DD
1b90: 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2a 20 20 20 20   HH:MM:SS.**    
1ba0: 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d   YYYY-MM-DD HH:M
1bb0: 4d 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d  M.**     YYYY-MM
1bc0: 2d 44 44 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  -DD.**.** Write 
1bd0: 74 68 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  the result into 
1be0: 74 68 65 20 44 61 74 65 54 69 6d 65 20 73 74 72  the DateTime str
1bf0: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
1c00: 6e 20 30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  n 0.** on succes
1c10: 73 20 61 6e 64 20 31 20 69 66 20 74 68 65 20 69  s and 1 if the i
1c20: 6e 70 75 74 20 73 74 72 69 6e 67 20 69 73 20 6e  nput string is n
1c30: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
1c40: 0a 2a 2a 20 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  .** date..*/.sta
1c50: 74 69 63 20 69 6e 74 20 70 61 72 73 65 59 79 79  tic int parseYyy
1c60: 79 4d 6d 44 64 28 63 6f 6e 73 74 20 63 68 61 72  yMmDd(const char
1c70: 20 2a 7a 44 61 74 65 2c 20 44 61 74 65 54 69 6d   *zDate, DateTim
1c80: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 59 2c 20  e *p){.  int Y, 
1c90: 4d 2c 20 44 2c 20 6e 65 67 3b 0a 0a 20 20 69 66  M, D, neg;..  if
1ca0: 28 20 7a 44 61 74 65 5b 30 5d 3d 3d 27 2d 27 20  ( zDate[0]=='-' 
1cb0: 29 7b 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a  ){.    zDate++;.
1cc0: 20 20 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20 7d      neg = 1;.  }
1cd0: 65 6c 73 65 7b 0a 20 20 20 20 6e 65 67 20 3d 20  else{.    neg = 
1ce0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  0;.  }.  if( get
1cf0: 44 69 67 69 74 73 28 7a 44 61 74 65 2c 34 2c 30  Digits(zDate,4,0
1d00: 2c 39 39 39 39 2c 27 2d 27 2c 26 59 2c 32 2c 31  ,9999,'-',&Y,2,1
1d10: 2c 31 32 2c 27 2d 27 2c 26 4d 2c 32 2c 31 2c 33  ,12,'-',&M,2,1,3
1d20: 31 2c 30 2c 26 44 29 21 3d 33 20 29 7b 0a 20 20  1,0,&D)!=3 ){.  
1d30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1d40: 20 20 7a 44 61 74 65 20 2b 3d 20 31 30 3b 0a 20    zDate += 10;. 
1d50: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
1d60: 73 73 70 61 63 65 28 2a 7a 44 61 74 65 29 20 7c  sspace(*zDate) |
1d70: 7c 20 27 54 27 3d 3d 2a 28 75 38 2a 29 7a 44 61  | 'T'==*(u8*)zDa
1d80: 74 65 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d  te ){ zDate++; }
1d90: 0a 20 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d  .  if( parseHhMm
1da0: 53 73 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30 20  Ss(zDate, p)==0 
1db0: 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 67 6f 74  ){.    /* We got
1dc0: 20 74 68 65 20 74 69 6d 65 20 2a 2f 0a 20 20 7d   the time */.  }
1dd0: 65 6c 73 65 20 69 66 28 20 2a 7a 44 61 74 65 3d  else if( *zDate=
1de0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 76 61 6c  =0 ){.    p->val
1df0: 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20 7d 65 6c  idHMS = 0;.  }el
1e00: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
1e10: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64  ;.  }.  p->valid
1e20: 4a 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c  JD = 0;.  p->val
1e30: 69 64 59 4d 44 20 3d 20 31 3b 0a 20 20 70 2d 3e  idYMD = 1;.  p->
1e40: 59 20 3d 20 6e 65 67 20 3f 20 2d 59 20 3a 20 59  Y = neg ? -Y : Y
1e50: 3b 0a 20 20 70 2d 3e 4d 20 3d 20 4d 3b 0a 20 20  ;.  p->M = M;.  
1e60: 70 2d 3e 44 20 3d 20 44 3b 0a 20 20 69 66 28 20  p->D = D;.  if( 
1e70: 70 2d 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20 20  p->validTZ ){.  
1e80: 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a    computeJD(p);.
1e90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1eb0: 20 74 69 6d 65 20 74 6f 20 74 68 65 20 63 75 72   time to the cur
1ec0: 72 65 6e 74 20 74 69 6d 65 20 72 65 70 6f 72 74  rent time report
1ed0: 65 64 20 62 79 20 74 68 65 20 56 46 53 0a 2a 2f  ed by the VFS.*/
1ee0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1ef0: 44 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65 6e  DateTimeToCurren
1f00: 74 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  t(sqlite3_contex
1f10: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 44 61 74 65  t *context, Date
1f20: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Time *p){.  sqli
1f30: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
1f40: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
1f50: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
1f60: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
1f70: 54 69 6d 65 49 6e 74 36 34 28 64 62 2d 3e 70 56  TimeInt64(db->pV
1f80: 66 73 2c 20 26 70 2d 3e 69 4a 44 29 3b 0a 20 20  fs, &p->iJD);.  
1f90: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a  p->validJD = 1;.
1fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1fb0: 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 67 69   to parse the gi
1fc0: 76 65 6e 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  ven string into 
1fd0: 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 4e 75 6d  a Julian Day Num
1fe0: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
1ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
2000: 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rors..**.** The 
2010: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 61 63  following are ac
2020: 63 65 70 74 61 62 6c 65 20 66 6f 72 6d 73 20 66  ceptable forms f
2030: 6f 72 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  or the input str
2040: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
2050: 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d  YYYY-MM-DD HH:MM
2060: 3a 53 53 2e 46 46 46 20 20 2b 2f 2d 48 48 3a 4d  :SS.FFF  +/-HH:M
2070: 4d 0a 2a 2a 20 20 20 20 20 20 44 44 44 44 2e 44  M.**      DDDD.D
2080: 44 20 0a 2a 2a 20 20 20 20 20 20 6e 6f 77 0a 2a  D .**      now.*
2090: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73  *.** In the firs
20a0: 74 20 66 6f 72 6d 2c 20 74 68 65 20 2b 2f 2d 48  t form, the +/-H
20b0: 48 3a 4d 4d 20 69 73 20 61 6c 77 61 79 73 20 6f  H:MM is always o
20c0: 70 74 69 6f 6e 61 6c 2e 20 20 54 68 65 20 66 72  ptional.  The fr
20d0: 61 63 74 69 6f 6e 61 6c 0a 2a 2a 20 73 65 63 6f  actional.** seco
20e0: 6e 64 73 20 65 78 74 65 6e 73 69 6f 6e 20 28 74  nds extension (t
20f0: 68 65 20 22 2e 46 46 46 22 29 20 69 73 20 6f 70  he ".FFF") is op
2100: 74 69 6f 6e 61 6c 2e 20 20 54 68 65 20 73 65 63  tional.  The sec
2110: 6f 6e 64 73 20 70 6f 72 74 69 6f 6e 0a 2a 2a 20  onds portion.** 
2120: 28 22 3a 53 53 2e 46 46 46 22 29 20 69 73 20 6f  (":SS.FFF") is o
2130: 70 74 69 6f 6e 2e 20 20 54 68 65 20 79 65 61 72  ption.  The year
2140: 20 61 6e 64 20 64 61 74 65 20 63 61 6e 20 62 65   and date can be
2150: 20 6f 6d 69 74 74 65 64 20 61 73 20 6c 6f 6e 67   omitted as long
2160: 0a 2a 2a 20 61 73 20 74 68 65 72 65 20 69 73 20  .** as there is 
2170: 61 20 74 69 6d 65 20 73 74 72 69 6e 67 2e 20 20  a time string.  
2180: 54 68 65 20 74 69 6d 65 20 73 74 72 69 6e 67 20  The time string 
2190: 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61  can be omitted a
21a0: 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 74 68 65  s long.** as the
21b0: 72 65 20 69 73 20 61 20 79 65 61 72 20 61 6e 64  re is a year and
21c0: 20 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   date..*/.static
21d0: 20 69 6e 74 20 70 61 72 73 65 44 61 74 65 4f 72   int parseDateOr
21e0: 54 69 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  Time(.  sqlite3_
21f0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2200: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
2210: 2a 7a 44 61 74 65 2c 20 0a 20 20 44 61 74 65 54  *zDate, .  DateT
2220: 69 6d 65 20 2a 70 0a 29 7b 0a 20 20 64 6f 75 62  ime *p.){.  doub
2230: 6c 65 20 72 3b 0a 20 20 69 66 28 20 70 61 72 73  le r;.  if( pars
2240: 65 59 79 79 79 4d 6d 44 64 28 7a 44 61 74 65 2c  eYyyyMmDd(zDate,
2250: 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  p)==0 ){.    ret
2260: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  urn 0;.  }else i
2270: 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73 28 7a  f( parseHhMmSs(z
2280: 44 61 74 65 2c 20 70 29 3d 3d 30 20 29 7b 0a 20  Date, p)==0 ){. 
2290: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
22a0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
22b0: 53 74 72 49 43 6d 70 28 7a 44 61 74 65 2c 22 6e  StrICmp(zDate,"n
22c0: 6f 77 22 29 3d 3d 30 29 7b 0a 20 20 20 20 73 65  ow")==0){.    se
22d0: 74 44 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65  tDateTimeToCurre
22e0: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 29 3b 0a  nt(context, p);.
22f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2300: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
2310: 33 41 74 6f 46 28 7a 44 61 74 65 2c 20 26 72 2c  3AtoF(zDate, &r,
2320: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2330: 28 7a 44 61 74 65 29 2c 20 53 51 4c 49 54 45 5f  (zDate), SQLITE_
2340: 55 54 46 38 29 20 29 7b 0a 20 20 20 20 70 2d 3e  UTF8) ){.    p->
2350: 69 4a 44 20 3d 20 28 73 71 6c 69 74 65 33 5f 69  iJD = (sqlite3_i
2360: 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30  nt64)(r*86400000
2370: 2e 30 20 2b 20 30 2e 35 29 3b 0a 20 20 20 20 70  .0 + 0.5);.    p
2380: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 20  ->validJD = 1;. 
2390: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
23a0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
23b0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
23c0: 65 20 59 65 61 72 2c 20 4d 6f 6e 74 68 2c 20 61  e Year, Month, a
23d0: 6e 64 20 44 61 79 20 66 72 6f 6d 20 74 68 65 20  nd Day from the 
23e0: 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65  julian day numbe
23f0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
2400: 64 20 63 6f 6d 70 75 74 65 59 4d 44 28 44 61 74  d computeYMD(Dat
2410: 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  eTime *p){.  int
2420: 20 5a 2c 20 41 2c 20 42 2c 20 43 2c 20 44 2c 20   Z, A, B, C, D, 
2430: 45 2c 20 58 31 3b 0a 20 20 69 66 28 20 70 2d 3e  E, X1;.  if( p->
2440: 76 61 6c 69 64 59 4d 44 20 29 20 72 65 74 75 72  validYMD ) retur
2450: 6e 3b 0a 20 20 69 66 28 20 21 70 2d 3e 76 61 6c  n;.  if( !p->val
2460: 69 64 4a 44 20 29 7b 0a 20 20 20 20 70 2d 3e 59  idJD ){.    p->Y
2470: 20 3d 20 32 30 30 30 3b 0a 20 20 20 20 70 2d 3e   = 2000;.    p->
2480: 4d 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 44 20  M = 1;.    p->D 
2490: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
24a0: 20 20 5a 20 3d 20 28 69 6e 74 29 28 28 70 2d 3e    Z = (int)((p->
24b0: 69 4a 44 20 2b 20 34 33 32 30 30 30 30 30 29 2f  iJD + 43200000)/
24c0: 38 36 34 30 30 30 30 30 29 3b 0a 20 20 20 20 41  86400000);.    A
24d0: 20 3d 20 28 69 6e 74 29 28 28 5a 20 2d 20 31 38   = (int)((Z - 18
24e0: 36 37 32 31 36 2e 32 35 29 2f 33 36 35 32 34 2e  67216.25)/36524.
24f0: 32 35 29 3b 0a 20 20 20 20 41 20 3d 20 5a 20 2b  25);.    A = Z +
2500: 20 31 20 2b 20 41 20 2d 20 28 41 2f 34 29 3b 0a   1 + A - (A/4);.
2510: 20 20 20 20 42 20 3d 20 41 20 2b 20 31 35 32 34      B = A + 1524
2520: 3b 0a 20 20 20 20 43 20 3d 20 28 69 6e 74 29 28  ;.    C = (int)(
2530: 28 42 20 2d 20 31 32 32 2e 31 29 2f 33 36 35 2e  (B - 122.1)/365.
2540: 32 35 29 3b 0a 20 20 20 20 44 20 3d 20 28 33 36  25);.    D = (36
2550: 35 32 35 2a 43 29 2f 31 30 30 3b 0a 20 20 20 20  525*C)/100;.    
2560: 45 20 3d 20 28 69 6e 74 29 28 28 42 2d 44 29 2f  E = (int)((B-D)/
2570: 33 30 2e 36 30 30 31 29 3b 0a 20 20 20 20 58 31  30.6001);.    X1
2580: 20 3d 20 28 69 6e 74 29 28 33 30 2e 36 30 30 31   = (int)(30.6001
2590: 2a 45 29 3b 0a 20 20 20 20 70 2d 3e 44 20 3d 20  *E);.    p->D = 
25a0: 42 20 2d 20 44 20 2d 20 58 31 3b 0a 20 20 20 20  B - D - X1;.    
25b0: 70 2d 3e 4d 20 3d 20 45 3c 31 34 20 3f 20 45 2d  p->M = E<14 ? E-
25c0: 31 20 3a 20 45 2d 31 33 3b 0a 20 20 20 20 70 2d  1 : E-13;.    p-
25d0: 3e 59 20 3d 20 70 2d 3e 4d 3e 32 20 3f 20 43 20  >Y = p->M>2 ? C 
25e0: 2d 20 34 37 31 36 20 3a 20 43 20 2d 20 34 37 31  - 4716 : C - 471
25f0: 35 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69  5;.  }.  p->vali
2600: 64 59 4d 44 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  dYMD = 1;.}../*.
2610: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 48  ** Compute the H
2620: 6f 75 72 2c 20 4d 69 6e 75 74 65 2c 20 61 6e 64  our, Minute, and
2630: 20 53 65 63 6f 6e 64 73 20 66 72 6f 6d 20 74 68   Seconds from th
2640: 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d  e julian day num
2650: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
2660: 6f 69 64 20 63 6f 6d 70 75 74 65 48 4d 53 28 44  oid computeHMS(D
2670: 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69  ateTime *p){.  i
2680: 6e 74 20 73 3b 0a 20 20 69 66 28 20 70 2d 3e 76  nt s;.  if( p->v
2690: 61 6c 69 64 48 4d 53 20 29 20 72 65 74 75 72 6e  alidHMS ) return
26a0: 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29  ;.  computeJD(p)
26b0: 3b 0a 20 20 73 20 3d 20 28 69 6e 74 29 28 28 70  ;.  s = (int)((p
26c0: 2d 3e 69 4a 44 20 2b 20 34 33 32 30 30 30 30 30  ->iJD + 43200000
26d0: 29 20 25 20 38 36 34 30 30 30 30 30 29 3b 0a 20  ) % 86400000);. 
26e0: 20 70 2d 3e 73 20 3d 20 73 2f 31 30 30 30 2e 30   p->s = s/1000.0
26f0: 3b 0a 20 20 73 20 3d 20 28 69 6e 74 29 70 2d 3e  ;.  s = (int)p->
2700: 73 3b 0a 20 20 70 2d 3e 73 20 2d 3d 20 73 3b 0a  s;.  p->s -= s;.
2710: 20 20 70 2d 3e 68 20 3d 20 73 2f 33 36 30 30 3b    p->h = s/3600;
2720: 0a 20 20 73 20 2d 3d 20 70 2d 3e 68 2a 33 36 30  .  s -= p->h*360
2730: 30 3b 0a 20 20 70 2d 3e 6d 20 3d 20 73 2f 36 30  0;.  p->m = s/60
2740: 3b 0a 20 20 70 2d 3e 73 20 2b 3d 20 73 20 2d 20  ;.  p->s += s - 
2750: 70 2d 3e 6d 2a 36 30 3b 0a 20 20 70 2d 3e 76 61  p->m*60;.  p->va
2760: 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 7d 0a 0a 2f  lidHMS = 1;.}../
2770: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 62 6f 74  *.** Compute bot
2780: 68 20 59 4d 44 20 61 6e 64 20 48 4d 53 0a 2a 2f  h YMD and HMS.*/
2790: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
27a0: 70 75 74 65 59 4d 44 5f 48 4d 53 28 44 61 74 65  puteYMD_HMS(Date
27b0: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 63 6f 6d 70  Time *p){.  comp
27c0: 75 74 65 59 4d 44 28 70 29 3b 0a 20 20 63 6f 6d  uteYMD(p);.  com
27d0: 70 75 74 65 48 4d 53 28 70 29 3b 0a 7d 0a 0a 2f  puteHMS(p);.}../
27e0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 59  *.** Clear the Y
27f0: 4d 44 20 61 6e 64 20 48 4d 53 20 61 6e 64 20 74  MD and HMS and t
2800: 68 65 20 54 5a 0a 2a 2f 0a 73 74 61 74 69 63 20  he TZ.*/.static 
2810: 76 6f 69 64 20 63 6c 65 61 72 59 4d 44 5f 48 4d  void clearYMD_HM
2820: 53 5f 54 5a 28 44 61 74 65 54 69 6d 65 20 2a 70  S_TZ(DateTime *p
2830: 29 7b 0a 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44  ){.  p->validYMD
2840: 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64   = 0;.  p->valid
2850: 48 4d 53 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61  HMS = 0;.  p->va
2860: 6c 69 64 54 5a 20 3d 20 30 3b 0a 7d 0a 0a 23 69  lidTZ = 0;.}..#i
2870: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2880: 54 5f 4c 4f 43 41 4c 54 49 4d 45 0a 2f 2a 0a 2a  T_LOCALTIME./*.*
2890: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 64 69  * Compute the di
28a0: 66 66 65 72 65 6e 63 65 20 28 69 6e 20 6d 69 6c  fference (in mil
28b0: 6c 69 73 65 63 6f 6e 64 73 29 0a 2a 2a 20 62 65  liseconds).** be
28c0: 74 77 65 65 6e 20 6c 6f 63 61 6c 74 69 6d 65 20  tween localtime 
28d0: 61 6e 64 20 55 54 43 20 28 61 2e 6b 2e 61 2e 20  and UTC (a.k.a. 
28e0: 47 4d 54 29 0a 2a 2a 20 66 6f 72 20 74 68 65 20  GMT).** for the 
28f0: 74 69 6d 65 20 76 61 6c 75 65 20 70 20 77 68 65  time value p whe
2900: 72 65 20 70 20 69 73 20 69 6e 20 55 54 43 2e 0a  re p is in UTC..
2910: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
2920: 33 5f 69 6e 74 36 34 20 6c 6f 63 61 6c 74 69 6d  3_int64 localtim
2930: 65 4f 66 66 73 65 74 28 44 61 74 65 54 69 6d 65  eOffset(DateTime
2940: 20 2a 70 29 7b 0a 20 20 44 61 74 65 54 69 6d 65   *p){.  DateTime
2950: 20 78 2c 20 79 3b 0a 20 20 74 69 6d 65 5f 74 20   x, y;.  time_t 
2960: 74 3b 0a 20 20 78 20 3d 20 2a 70 3b 0a 20 20 63  t;.  x = *p;.  c
2970: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78  omputeYMD_HMS(&x
2980: 29 3b 0a 20 20 69 66 28 20 78 2e 59 3c 31 39 37  );.  if( x.Y<197
2990: 31 20 7c 7c 20 78 2e 59 3e 3d 32 30 33 38 20 29  1 || x.Y>=2038 )
29a0: 7b 0a 20 20 20 20 78 2e 59 20 3d 20 32 30 30 30  {.    x.Y = 2000
29b0: 3b 0a 20 20 20 20 78 2e 4d 20 3d 20 31 3b 0a 20  ;.    x.M = 1;. 
29c0: 20 20 20 78 2e 44 20 3d 20 31 3b 0a 20 20 20 20     x.D = 1;.    
29d0: 78 2e 68 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6d  x.h = 0;.    x.m
29e0: 20 3d 20 30 3b 0a 20 20 20 20 78 2e 73 20 3d 20   = 0;.    x.s = 
29f0: 30 2e 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  0.0;.  } else {.
2a00: 20 20 20 20 69 6e 74 20 73 20 3d 20 28 69 6e 74      int s = (int
2a10: 29 28 78 2e 73 20 2b 20 30 2e 35 29 3b 0a 20 20  )(x.s + 0.5);.  
2a20: 20 20 78 2e 73 20 3d 20 73 3b 0a 20 20 7d 0a 20    x.s = s;.  }. 
2a30: 20 78 2e 74 7a 20 3d 20 30 3b 0a 20 20 78 2e 76   x.tz = 0;.  x.v
2a40: 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 63 6f  alidJD = 0;.  co
2a50: 6d 70 75 74 65 4a 44 28 26 78 29 3b 0a 20 20 74  mputeJD(&x);.  t
2a60: 20 3d 20 28 74 69 6d 65 5f 74 29 28 78 2e 69 4a   = (time_t)(x.iJ
2a70: 44 2f 31 30 30 30 20 2d 20 32 31 30 38 36 36 37  D/1000 - 2108667
2a80: 36 2a 28 69 36 34 29 31 30 30 30 30 29 3b 0a 23  6*(i64)10000);.#
2a90: 69 66 64 65 66 20 48 41 56 45 5f 4c 4f 43 41 4c  ifdef HAVE_LOCAL
2aa0: 54 49 4d 45 5f 52 0a 20 20 7b 0a 20 20 20 20 73  TIME_R.  {.    s
2ab0: 74 72 75 63 74 20 74 6d 20 73 4c 6f 63 61 6c 3b  truct tm sLocal;
2ac0: 0a 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65 5f 72  .    localtime_r
2ad0: 28 26 74 2c 20 26 73 4c 6f 63 61 6c 29 3b 0a 20  (&t, &sLocal);. 
2ae0: 20 20 20 79 2e 59 20 3d 20 73 4c 6f 63 61 6c 2e     y.Y = sLocal.
2af0: 74 6d 5f 79 65 61 72 20 2b 20 31 39 30 30 3b 0a  tm_year + 1900;.
2b00: 20 20 20 20 79 2e 4d 20 3d 20 73 4c 6f 63 61 6c      y.M = sLocal
2b10: 2e 74 6d 5f 6d 6f 6e 20 2b 20 31 3b 0a 20 20 20  .tm_mon + 1;.   
2b20: 20 79 2e 44 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d   y.D = sLocal.tm
2b30: 5f 6d 64 61 79 3b 0a 20 20 20 20 79 2e 68 20 3d  _mday;.    y.h =
2b40: 20 73 4c 6f 63 61 6c 2e 74 6d 5f 68 6f 75 72 3b   sLocal.tm_hour;
2b50: 0a 20 20 20 20 79 2e 6d 20 3d 20 73 4c 6f 63 61  .    y.m = sLoca
2b60: 6c 2e 74 6d 5f 6d 69 6e 3b 0a 20 20 20 20 79 2e  l.tm_min;.    y.
2b70: 73 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 73 65  s = sLocal.tm_se
2b80: 63 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66  c;.  }.#elif def
2b90: 69 6e 65 64 28 48 41 56 45 5f 4c 4f 43 41 4c 54  ined(HAVE_LOCALT
2ba0: 49 4d 45 5f 53 29 20 26 26 20 48 41 56 45 5f 4c  IME_S) && HAVE_L
2bb0: 4f 43 41 4c 54 49 4d 45 5f 53 0a 20 20 7b 0a 20  OCALTIME_S.  {. 
2bc0: 20 20 20 73 74 72 75 63 74 20 74 6d 20 73 4c 6f     struct tm sLo
2bd0: 63 61 6c 3b 0a 20 20 20 20 6c 6f 63 61 6c 74 69  cal;.    localti
2be0: 6d 65 5f 73 28 26 73 4c 6f 63 61 6c 2c 20 26 74  me_s(&sLocal, &t
2bf0: 29 3b 0a 20 20 20 20 79 2e 59 20 3d 20 73 4c 6f  );.    y.Y = sLo
2c00: 63 61 6c 2e 74 6d 5f 79 65 61 72 20 2b 20 31 39  cal.tm_year + 19
2c10: 30 30 3b 0a 20 20 20 20 79 2e 4d 20 3d 20 73 4c  00;.    y.M = sL
2c20: 6f 63 61 6c 2e 74 6d 5f 6d 6f 6e 20 2b 20 31 3b  ocal.tm_mon + 1;
2c30: 0a 20 20 20 20 79 2e 44 20 3d 20 73 4c 6f 63 61  .    y.D = sLoca
2c40: 6c 2e 74 6d 5f 6d 64 61 79 3b 0a 20 20 20 20 79  l.tm_mday;.    y
2c50: 2e 68 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 68  .h = sLocal.tm_h
2c60: 6f 75 72 3b 0a 20 20 20 20 79 2e 6d 20 3d 20 73  our;.    y.m = s
2c70: 4c 6f 63 61 6c 2e 74 6d 5f 6d 69 6e 3b 0a 20 20  Local.tm_min;.  
2c80: 20 20 79 2e 73 20 3d 20 73 4c 6f 63 61 6c 2e 74    y.s = sLocal.t
2c90: 6d 5f 73 65 63 3b 0a 20 20 7d 0a 23 65 6c 73 65  m_sec;.  }.#else
2ca0: 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
2cb0: 74 6d 20 2a 70 54 6d 3b 0a 20 20 20 20 73 71 6c  tm *pTm;.    sql
2cc0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2cd0: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
2ce0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
2cf0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
2d00: 0a 20 20 20 20 70 54 6d 20 3d 20 6c 6f 63 61 6c  .    pTm = local
2d10: 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 79 2e  time(&t);.    y.
2d20: 59 20 3d 20 70 54 6d 2d 3e 74 6d 5f 79 65 61 72  Y = pTm->tm_year
2d30: 20 2b 20 31 39 30 30 3b 0a 20 20 20 20 79 2e 4d   + 1900;.    y.M
2d40: 20 3d 20 70 54 6d 2d 3e 74 6d 5f 6d 6f 6e 20 2b   = pTm->tm_mon +
2d50: 20 31 3b 0a 20 20 20 20 79 2e 44 20 3d 20 70 54   1;.    y.D = pT
2d60: 6d 2d 3e 74 6d 5f 6d 64 61 79 3b 0a 20 20 20 20  m->tm_mday;.    
2d70: 79 2e 68 20 3d 20 70 54 6d 2d 3e 74 6d 5f 68 6f  y.h = pTm->tm_ho
2d80: 75 72 3b 0a 20 20 20 20 79 2e 6d 20 3d 20 70 54  ur;.    y.m = pT
2d90: 6d 2d 3e 74 6d 5f 6d 69 6e 3b 0a 20 20 20 20 79  m->tm_min;.    y
2da0: 2e 73 20 3d 20 70 54 6d 2d 3e 74 6d 5f 73 65 63  .s = pTm->tm_sec
2db0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
2dc0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
2dd0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
2de0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
2df0: 4d 41 53 54 45 52 29 29 3b 0a 20 20 7d 0a 23 65  MASTER));.  }.#e
2e00: 6e 64 69 66 0a 20 20 79 2e 76 61 6c 69 64 59 4d  ndif.  y.validYM
2e10: 44 20 3d 20 31 3b 0a 20 20 79 2e 76 61 6c 69 64  D = 1;.  y.valid
2e20: 48 4d 53 20 3d 20 31 3b 0a 20 20 79 2e 76 61 6c  HMS = 1;.  y.val
2e30: 69 64 4a 44 20 3d 20 30 3b 0a 20 20 79 2e 76 61  idJD = 0;.  y.va
2e40: 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 63 6f 6d  lidTZ = 0;.  com
2e50: 70 75 74 65 4a 44 28 26 79 29 3b 0a 20 20 72 65  puteJD(&y);.  re
2e60: 74 75 72 6e 20 79 2e 69 4a 44 20 2d 20 78 2e 69  turn y.iJD - x.i
2e70: 4a 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  JD;.}.#endif /* 
2e80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41  SQLITE_OMIT_LOCA
2e90: 4c 54 49 4d 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  LTIME */../*.** 
2ea0: 50 72 6f 63 65 73 73 20 61 20 6d 6f 64 69 66 69  Process a modifi
2eb0: 65 72 20 74 6f 20 61 20 64 61 74 65 2d 74 69 6d  er to a date-tim
2ec0: 65 20 73 74 61 6d 70 2e 20 20 54 68 65 20 6d 6f  e stamp.  The mo
2ed0: 64 69 66 69 65 72 73 20 61 72 65 0a 2a 2a 20 61  difiers are.** a
2ee0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2ef0: 20 20 20 20 20 4e 4e 4e 20 64 61 79 73 0a 2a 2a       NNN days.**
2f00: 20 20 20 20 20 4e 4e 4e 20 68 6f 75 72 73 0a 2a       NNN hours.*
2f10: 2a 20 20 20 20 20 4e 4e 4e 20 6d 69 6e 75 74 65  *     NNN minute
2f20: 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 2e 4e 4e 4e  s.**     NNN.NNN
2f30: 4e 20 73 65 63 6f 6e 64 73 0a 2a 2a 20 20 20 20  N seconds.**    
2f40: 20 4e 4e 4e 20 6d 6f 6e 74 68 73 0a 2a 2a 20 20   NNN months.**  
2f50: 20 20 20 4e 4e 4e 20 79 65 61 72 73 0a 2a 2a 20     NNN years.** 
2f60: 20 20 20 20 73 74 61 72 74 20 6f 66 20 6d 6f 6e      start of mon
2f70: 74 68 0a 2a 2a 20 20 20 20 20 73 74 61 72 74 20  th.**     start 
2f80: 6f 66 20 79 65 61 72 0a 2a 2a 20 20 20 20 20 73  of year.**     s
2f90: 74 61 72 74 20 6f 66 20 77 65 65 6b 0a 2a 2a 20  tart of week.** 
2fa0: 20 20 20 20 73 74 61 72 74 20 6f 66 20 64 61 79      start of day
2fb0: 0a 2a 2a 20 20 20 20 20 77 65 65 6b 64 61 79 20  .**     weekday 
2fc0: 4e 0a 2a 2a 20 20 20 20 20 75 6e 69 78 65 70 6f  N.**     unixepo
2fd0: 63 68 0a 2a 2a 20 20 20 20 20 6c 6f 63 61 6c 74  ch.**     localt
2fe0: 69 6d 65 0a 2a 2a 20 20 20 20 20 75 74 63 0a 2a  ime.**     utc.*
2ff0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e  *.** Return 0 on
3000: 20 73 75 63 63 65 73 73 20 61 6e 64 20 31 20 69   success and 1 i
3010: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
3020: 69 6e 64 20 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f  ind of error..*/
3030: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72 73  .static int pars
3040: 65 4d 6f 64 69 66 69 65 72 28 63 6f 6e 73 74 20  eModifier(const 
3050: 63 68 61 72 20 2a 7a 4d 6f 64 2c 20 44 61 74 65  char *zMod, Date
3060: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Time *p){.  int 
3070: 72 63 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 3b  rc = 1;.  int n;
3080: 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63  .  double r;.  c
3090: 68 61 72 20 2a 7a 2c 20 7a 42 75 66 5b 33 30 5d  har *z, zBuf[30]
30a0: 3b 0a 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20  ;.  z = zBuf;.  
30b0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 41 72 72 61 79  for(n=0; n<Array
30c0: 53 69 7a 65 28 7a 42 75 66 29 2d 31 20 26 26 20  Size(zBuf)-1 && 
30d0: 7a 4d 6f 64 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20  zMod[n]; n++){. 
30e0: 20 20 20 7a 5b 6e 5d 20 3d 20 28 63 68 61 72 29     z[n] = (char)
30f0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
3100: 77 65 72 5b 28 75 38 29 7a 4d 6f 64 5b 6e 5d 5d  wer[(u8)zMod[n]]
3110: 3b 0a 20 20 7d 0a 20 20 7a 5b 6e 5d 20 3d 20 30  ;.  }.  z[n] = 0
3120: 3b 0a 20 20 73 77 69 74 63 68 28 20 7a 5b 30 5d  ;.  switch( z[0]
3130: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
3140: 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d  TE_OMIT_LOCALTIM
3150: 45 0a 20 20 20 20 63 61 73 65 20 27 6c 27 3a 20  E.    case 'l': 
3160: 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 6c 6f  {.      /*    lo
3170: 63 61 6c 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  caltime.      **
3180: 0a 20 20 20 20 20 20 2a 2a 20 41 73 73 75 6d 69  .      ** Assumi
3190: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
31a0: 69 6d 65 20 76 61 6c 75 65 20 69 73 20 55 54 43  ime value is UTC
31b0: 20 28 61 2e 6b 2e 61 2e 20 47 4d 54 29 2c 20 73   (a.k.a. GMT), s
31c0: 68 69 66 74 20 69 74 20 74 6f 0a 20 20 20 20 20  hift it to.     
31d0: 20 2a 2a 20 73 68 6f 77 20 6c 6f 63 61 6c 20 74   ** show local t
31e0: 69 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ime..      */.  
31f0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
3200: 2c 20 22 6c 6f 63 61 6c 74 69 6d 65 22 29 3d 3d  , "localtime")==
3210: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6d  0 ){.        com
3220: 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20  puteJD(p);.     
3230: 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 6c 6f 63     p->iJD += loc
3240: 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 29 3b  altimeOffset(p);
3250: 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d  .        clearYM
3260: 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20  D_HMS_TZ(p);.   
3270: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
3280: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
3290: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
32a0: 20 20 20 63 61 73 65 20 27 75 27 3a 20 7b 0a 20     case 'u': {. 
32b0: 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a       /*.      **
32c0: 20 20 20 20 75 6e 69 78 65 70 6f 63 68 0a 20 20      unixepoch.  
32d0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
32e0: 54 72 65 61 74 20 74 68 65 20 63 75 72 72 65 6e  Treat the curren
32f0: 74 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4a  t value of p->iJ
3300: 44 20 61 73 20 74 68 65 20 6e 75 6d 62 65 72 20  D as the number 
3310: 6f 66 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  of.      ** seco
3320: 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
3330: 20 43 6f 6e 76 65 72 74 20 74 6f 20 61 20 72 65   Convert to a re
3340: 61 6c 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75  al julian day nu
3350: 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mber..      */. 
3360: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
3370: 7a 2c 20 22 75 6e 69 78 65 70 6f 63 68 22 29 3d  z, "unixepoch")=
3380: 3d 30 20 26 26 20 70 2d 3e 76 61 6c 69 64 4a 44  =0 && p->validJD
3390: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   ){.        p->i
33a0: 4a 44 20 3d 20 28 70 2d 3e 69 4a 44 20 2b 20 34  JD = (p->iJD + 4
33b0: 33 32 30 30 29 2f 38 36 34 30 30 20 2b 20 32 31  3200)/86400 + 21
33c0: 30 38 36 36 37 36 2a 28 69 36 34 29 31 30 30 30  086676*(i64)1000
33d0: 30 30 30 30 3b 0a 20 20 20 20 20 20 20 20 63 6c  0000;.        cl
33e0: 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29  earYMD_HMS_TZ(p)
33f0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30  ;.        rc = 0
3400: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
3410: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
3420: 43 41 4c 54 49 4d 45 0a 20 20 20 20 20 20 65 6c  CALTIME.      el
3430: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
3440: 20 22 75 74 63 22 29 3d 3d 30 20 29 7b 0a 20 20   "utc")==0 ){.  
3450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
3460: 74 36 34 20 63 31 3b 0a 20 20 20 20 20 20 20 20  t64 c1;.        
3470: 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20  computeJD(p);.  
3480: 20 20 20 20 20 20 63 31 20 3d 20 6c 6f 63 61 6c        c1 = local
3490: 74 69 6d 65 4f 66 66 73 65 74 28 70 29 3b 0a 20  timeOffset(p);. 
34a0: 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2d 3d         p->iJD -=
34b0: 20 63 31 3b 0a 20 20 20 20 20 20 20 20 63 6c 65   c1;.        cle
34c0: 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b  arYMD_HMS_TZ(p);
34d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20  .        p->iJD 
34e0: 2b 3d 20 63 31 20 2d 20 6c 6f 63 61 6c 74 69 6d  += c1 - localtim
34f0: 65 4f 66 66 73 65 74 28 70 29 3b 0a 20 20 20 20  eOffset(p);.    
3500: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
3510: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
3520: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3530: 20 20 63 61 73 65 20 27 77 27 3a 20 7b 0a 20 20    case 'w': {.  
3540: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20      /*.      ** 
3550: 20 20 20 77 65 65 6b 64 61 79 20 4e 0a 20 20 20     weekday N.   
3560: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4d     **.      ** M
3570: 6f 76 65 20 74 68 65 20 64 61 74 65 20 74 6f 20  ove the date to 
3580: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 6f 6e  the same time on
3590: 20 74 68 65 20 6e 65 78 74 20 6f 63 63 75 72 72   the next occurr
35a0: 65 6e 63 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  ence of.      **
35b0: 20 77 65 65 6b 64 61 79 20 4e 20 77 68 65 72 65   weekday N where
35c0: 20 30 3d 3d 53 75 6e 64 61 79 2c 20 31 3d 3d 4d   0==Sunday, 1==M
35d0: 6f 6e 64 61 79 2c 20 61 6e 64 20 73 6f 20 66 6f  onday, and so fo
35e0: 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 20  rth.  If the.   
35f0: 20 20 20 2a 2a 20 64 61 74 65 20 69 73 20 61 6c     ** date is al
3600: 72 65 61 64 79 20 6f 6e 20 74 68 65 20 61 70 70  ready on the app
3610: 72 6f 70 72 69 61 74 65 20 77 65 65 6b 64 61 79  ropriate weekday
3620: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
3630: 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
3640: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c    if( strncmp(z,
3650: 20 22 77 65 65 6b 64 61 79 20 22 2c 20 38 29 3d   "weekday ", 8)=
3660: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
3670: 20 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f 46    && sqlite3AtoF
3680: 28 26 7a 5b 38 5d 2c 20 26 72 2c 20 73 71 6c 69  (&z[8], &r, sqli
3690: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 5b 38  te3Strlen30(&z[8
36a0: 5d 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ]), SQLITE_UTF8)
36b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36c0: 26 26 20 28 6e 3d 28 69 6e 74 29 72 29 3d 3d 72  && (n=(int)r)==r
36d0: 20 26 26 20 6e 3e 3d 30 20 26 26 20 72 3c 37 20   && n>=0 && r<7 
36e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
36f0: 65 33 5f 69 6e 74 36 34 20 5a 3b 0a 20 20 20 20  e3_int64 Z;.    
3700: 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48      computeYMD_H
3710: 4d 53 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  MS(p);.        p
3720: 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 20  ->validTZ = 0;. 
3730: 20 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a         p->validJ
3740: 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  D = 0;.        c
3750: 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20  omputeJD(p);.   
3760: 20 20 20 20 20 5a 20 3d 20 28 28 70 2d 3e 69 4a       Z = ((p->iJ
3770: 44 20 2b 20 31 32 39 36 30 30 30 30 30 29 2f 38  D + 129600000)/8
3780: 36 34 30 30 30 30 30 29 20 25 20 37 3b 0a 20 20  6400000) % 7;.  
3790: 20 20 20 20 20 20 69 66 28 20 5a 3e 6e 20 29 20        if( Z>n ) 
37a0: 5a 20 2d 3d 20 37 3b 0a 20 20 20 20 20 20 20 20  Z -= 7;.        
37b0: 70 2d 3e 69 4a 44 20 2b 3d 20 28 6e 20 2d 20 5a  p->iJD += (n - Z
37c0: 29 2a 38 36 34 30 30 30 30 30 3b 0a 20 20 20 20  )*86400000;.    
37d0: 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53      clearYMD_HMS
37e0: 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20  _TZ(p);.        
37f0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  rc = 0;.      }.
3800: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3810: 20 7d 0a 20 20 20 20 63 61 73 65 20 27 73 27 3a   }.    case 's':
3820: 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20   {.      /*.    
3830: 20 20 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66    **    start of
3840: 20 54 54 54 54 54 0a 20 20 20 20 20 20 2a 2a 0a   TTTTT.      **.
3850: 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68        ** Move th
3860: 65 20 64 61 74 65 20 62 61 63 6b 77 61 72 64 73  e date backwards
3870: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
3880: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
3890: 20 64 61 79 2c 0a 20 20 20 20 20 20 2a 2a 20 6f   day,.      ** o
38a0: 72 20 6d 6f 6e 74 68 20 6f 72 20 79 65 61 72 2e  r month or year.
38b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
38c0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22  if( strncmp(z, "
38d0: 73 74 61 72 74 20 6f 66 20 22 2c 20 39 29 21 3d  start of ", 9)!=
38e0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
38f0: 20 7a 20 2b 3d 20 39 3b 0a 20 20 20 20 20 20 63   z += 9;.      c
3900: 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a 20 20  omputeYMD(p);.  
3910: 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20      p->validHMS 
3920: 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  = 1;.      p->h 
3930: 3d 20 70 2d 3e 6d 20 3d 20 30 3b 0a 20 20 20 20  = p->m = 0;.    
3940: 20 20 70 2d 3e 73 20 3d 20 30 2e 30 3b 0a 20 20    p->s = 0.0;.  
3950: 20 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d      p->validTZ =
3960: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c   0;.      p->val
3970: 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20  idJD = 0;.      
3980: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6d 6f  if( strcmp(z,"mo
3990: 6e 74 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nth")==0 ){.    
39a0: 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0a 20 20      p->D = 1;.  
39b0: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
39c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
39d0: 72 63 6d 70 28 7a 2c 22 79 65 61 72 22 29 3d 3d  rcmp(z,"year")==
39e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6d  0 ){.        com
39f0: 70 75 74 65 59 4d 44 28 70 29 3b 0a 20 20 20 20  puteYMD(p);.    
3a00: 20 20 20 20 70 2d 3e 4d 20 3d 20 31 3b 0a 20 20      p->M = 1;.  
3a10: 20 20 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0a        p->D = 1;.
3a20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a          rc = 0;.
3a30: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3a40: 73 74 72 63 6d 70 28 7a 2c 22 64 61 79 22 29 3d  strcmp(z,"day")=
3a50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
3a60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
3a70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3a80: 0a 20 20 20 20 63 61 73 65 20 27 2b 27 3a 0a 20  .    case '+':. 
3a90: 20 20 20 63 61 73 65 20 27 2d 27 3a 0a 20 20 20     case '-':.   
3aa0: 20 63 61 73 65 20 27 30 27 3a 0a 20 20 20 20 63   case '0':.    c
3ab0: 61 73 65 20 27 31 27 3a 0a 20 20 20 20 63 61 73  ase '1':.    cas
3ac0: 65 20 27 32 27 3a 0a 20 20 20 20 63 61 73 65 20  e '2':.    case 
3ad0: 27 33 27 3a 0a 20 20 20 20 63 61 73 65 20 27 34  '3':.    case '4
3ae0: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 35 27 3a  ':.    case '5':
3af0: 0a 20 20 20 20 63 61 73 65 20 27 36 27 3a 0a 20  .    case '6':. 
3b00: 20 20 20 63 61 73 65 20 27 37 27 3a 0a 20 20 20     case '7':.   
3b10: 20 63 61 73 65 20 27 38 27 3a 0a 20 20 20 20 63   case '8':.    c
3b20: 61 73 65 20 27 39 27 3a 20 7b 0a 20 20 20 20 20  ase '9': {.     
3b30: 20 64 6f 75 62 6c 65 20 72 52 6f 75 6e 64 65 72   double rRounder
3b40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b  ;.      for(n=1;
3b50: 20 7a 5b 6e 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27   z[n] && z[n]!='
3b60: 3a 27 20 26 26 20 21 73 71 6c 69 74 65 33 49 73  :' && !sqlite3Is
3b70: 73 70 61 63 65 28 7a 5b 6e 5d 29 3b 20 6e 2b 2b  space(z[n]); n++
3b80: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73  ){}.      if( !s
3b90: 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 72  qlite3AtoF(z, &r
3ba0: 2c 20 6e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , n, SQLITE_UTF8
3bb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
3bc0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3bd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3be0: 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 3a 27 20    if( z[n]==':' 
3bf0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
3c00: 6d 6f 64 69 66 69 65 72 20 6f 66 20 74 68 65 20  modifier of the 
3c10: 66 6f 72 6d 20 28 2b 7c 2d 29 48 48 3a 4d 4d 3a  form (+|-)HH:MM:
3c20: 53 53 2e 46 46 46 20 61 64 64 73 20 28 6f 72 20  SS.FFF adds (or 
3c30: 73 75 62 74 72 61 63 74 73 29 20 74 68 65 0a 20  subtracts) the. 
3c40: 20 20 20 20 20 20 20 2a 2a 20 73 70 65 63 69 66         ** specif
3c50: 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 68 6f  ied number of ho
3c60: 75 72 73 2c 20 6d 69 6e 75 74 65 73 2c 20 73 65  urs, minutes, se
3c70: 63 6f 6e 64 73 2c 20 61 6e 64 20 66 72 61 63 74  conds, and fract
3c80: 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 0a 20 20  ional seconds.  
3c90: 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
3ca0: 74 69 6d 65 2e 20 20 54 68 65 20 22 2e 46 46 46  time.  The ".FFF
3cb0: 22 20 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64  " may be omitted
3cc0: 2e 20 20 54 68 65 20 22 3a 53 53 2e 46 46 46 22  .  The ":SS.FFF"
3cd0: 20 6d 61 79 20 62 65 0a 20 20 20 20 20 20 20 20   may be.        
3ce0: 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20  ** omitted..    
3cf0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
3d00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20  onst char *z2 = 
3d10: 7a 3b 0a 20 20 20 20 20 20 20 20 44 61 74 65 54  z;.        DateT
3d20: 69 6d 65 20 74 78 3b 0a 20 20 20 20 20 20 20 20  ime tx;.        
3d30: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 64 61  sqlite3_int64 da
3d40: 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  y;.        if( !
3d50: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a  sqlite3Isdigit(*
3d60: 7a 32 29 20 29 20 7a 32 2b 2b 3b 0a 20 20 20 20  z2) ) z2++;.    
3d70: 20 20 20 20 6d 65 6d 73 65 74 28 26 74 78 2c 20      memset(&tx, 
3d80: 30 2c 20 73 69 7a 65 6f 66 28 74 78 29 29 3b 0a  0, sizeof(tx));.
3d90: 20 20 20 20 20 20 20 20 69 66 28 20 70 61 72 73          if( pars
3da0: 65 48 68 4d 6d 53 73 28 7a 32 2c 20 26 74 78 29  eHhMmSs(z2, &tx)
3db0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3dc0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 74 78 29    computeJD(&tx)
3dd0: 3b 0a 20 20 20 20 20 20 20 20 74 78 2e 69 4a 44  ;.        tx.iJD
3de0: 20 2d 3d 20 34 33 32 30 30 30 30 30 3b 0a 20 20   -= 43200000;.  
3df0: 20 20 20 20 20 20 64 61 79 20 3d 20 74 78 2e 69        day = tx.i
3e00: 4a 44 2f 38 36 34 30 30 30 30 30 3b 0a 20 20 20  JD/86400000;.   
3e10: 20 20 20 20 20 74 78 2e 69 4a 44 20 2d 3d 20 64       tx.iJD -= d
3e20: 61 79 2a 38 36 34 30 30 30 30 30 3b 0a 20 20 20  ay*86400000;.   
3e30: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
3e40: 2d 27 20 29 20 74 78 2e 69 4a 44 20 3d 20 2d 74  -' ) tx.iJD = -t
3e50: 78 2e 69 4a 44 3b 0a 20 20 20 20 20 20 20 20 63  x.iJD;.        c
3e60: 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20  omputeJD(p);.   
3e70: 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d       clearYMD_HM
3e80: 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20  S_TZ(p);.       
3e90: 20 70 2d 3e 69 4a 44 20 2b 3d 20 74 78 2e 69 4a   p->iJD += tx.iJ
3ea0: 44 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  D;.        rc = 
3eb0: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
3ec0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3ed0: 7a 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 77 68  z += n;.      wh
3ee0: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
3ef0: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
3f00: 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33       n = sqlite3
3f10: 53 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  Strlen30(z);.   
3f20: 20 20 20 69 66 28 20 6e 3e 31 30 20 7c 7c 20 6e     if( n>10 || n
3f30: 3c 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <3 ) break;.    
3f40: 20 20 69 66 28 20 7a 5b 6e 2d 31 5d 3d 3d 27 73    if( z[n-1]=='s
3f50: 27 20 29 7b 20 7a 5b 6e 2d 31 5d 20 3d 20 30 3b  ' ){ z[n-1] = 0;
3f60: 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 63 6f   n--; }.      co
3f70: 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20  mputeJD(p);.    
3f80: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
3f90: 72 52 6f 75 6e 64 65 72 20 3d 20 72 3c 30 20 3f  rRounder = r<0 ?
3fa0: 20 2d 30 2e 35 20 3a 20 2b 30 2e 35 3b 0a 20 20   -0.5 : +0.5;.  
3fb0: 20 20 20 20 69 66 28 20 6e 3d 3d 33 20 26 26 20      if( n==3 && 
3fc0: 73 74 72 63 6d 70 28 7a 2c 22 64 61 79 22 29 3d  strcmp(z,"day")=
3fd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
3fe0: 3e 69 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65 33  >iJD += (sqlite3
3ff0: 5f 69 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30  _int64)(r*864000
4000: 30 30 2e 30 20 2b 20 72 52 6f 75 6e 64 65 72 29  00.0 + rRounder)
4010: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4020: 28 20 6e 3d 3d 34 20 26 26 20 73 74 72 63 6d 70  ( n==4 && strcmp
4030: 28 7a 2c 22 68 6f 75 72 22 29 3d 3d 30 20 29 7b  (z,"hour")==0 ){
4040: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20  .        p->iJD 
4050: 2b 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  += (sqlite3_int6
4060: 34 29 28 72 2a 28 38 36 34 30 30 30 30 30 2e 30  4)(r*(86400000.0
4070: 2f 32 34 2e 30 29 20 2b 20 72 52 6f 75 6e 64 65  /24.0) + rRounde
4080: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
4090: 69 66 28 20 6e 3d 3d 36 20 26 26 20 73 74 72 63  if( n==6 && strc
40a0: 6d 70 28 7a 2c 22 6d 69 6e 75 74 65 22 29 3d 3d  mp(z,"minute")==
40b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
40c0: 69 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65 33 5f  iJD += (sqlite3_
40d0: 69 6e 74 36 34 29 28 72 2a 28 38 36 34 30 30 30  int64)(r*(864000
40e0: 30 30 2e 30 2f 28 32 34 2e 30 2a 36 30 2e 30 29  00.0/(24.0*60.0)
40f0: 29 20 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a 20  ) + rRounder);. 
4100: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
4110: 3d 3d 36 20 26 26 20 73 74 72 63 6d 70 28 7a 2c  ==6 && strcmp(z,
4120: 22 73 65 63 6f 6e 64 22 29 3d 3d 30 20 29 7b 0a  "second")==0 ){.
4130: 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b          p->iJD +
4140: 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
4150: 29 28 72 2a 28 38 36 34 30 30 30 30 30 2e 30 2f  )(r*(86400000.0/
4160: 28 32 34 2e 30 2a 36 30 2e 30 2a 36 30 2e 30 29  (24.0*60.0*60.0)
4170: 29 20 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a 20  ) + rRounder);. 
4180: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
4190: 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28 7a 2c  ==5 && strcmp(z,
41a0: 22 6d 6f 6e 74 68 22 29 3d 3d 30 20 29 7b 0a 20  "month")==0 ){. 
41b0: 20 20 20 20 20 20 20 69 6e 74 20 78 2c 20 79 3b         int x, y;
41c0: 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
41d0: 59 4d 44 5f 48 4d 53 28 70 29 3b 0a 20 20 20 20  YMD_HMS(p);.    
41e0: 20 20 20 20 70 2d 3e 4d 20 2b 3d 20 28 69 6e 74      p->M += (int
41f0: 29 72 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20  )r;.        x = 
4200: 70 2d 3e 4d 3e 30 20 3f 20 28 70 2d 3e 4d 2d 31  p->M>0 ? (p->M-1
4210: 29 2f 31 32 20 3a 20 28 70 2d 3e 4d 2d 31 32 29  )/12 : (p->M-12)
4220: 2f 31 32 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  /12;.        p->
4230: 59 20 2b 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  Y += x;.        
4240: 70 2d 3e 4d 20 2d 3d 20 78 2a 31 32 3b 0a 20 20  p->M -= x*12;.  
4250: 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44        p->validJD
4260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f   = 0;.        co
4270: 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20  mputeJD(p);.    
4280: 20 20 20 20 79 20 3d 20 28 69 6e 74 29 72 3b 0a      y = (int)r;.
4290: 20 20 20 20 20 20 20 20 69 66 28 20 79 21 3d 72          if( y!=r
42a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
42b0: 3e 69 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65 33  >iJD += (sqlite3
42c0: 5f 69 6e 74 36 34 29 28 28 72 20 2d 20 79 29 2a  _int64)((r - y)*
42d0: 33 30 2e 30 2a 38 36 34 30 30 30 30 30 2e 30 20  30.0*86400000.0 
42e0: 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20 20  + rRounder);.   
42f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
4300: 73 65 20 69 66 28 20 6e 3d 3d 34 20 26 26 20 73  se if( n==4 && s
4310: 74 72 63 6d 70 28 7a 2c 22 79 65 61 72 22 29 3d  trcmp(z,"year")=
4320: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
4330: 74 20 79 20 3d 20 28 69 6e 74 29 72 3b 0a 20 20  t y = (int)r;.  
4340: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44        computeYMD
4350: 5f 48 4d 53 28 70 29 3b 0a 20 20 20 20 20 20 20  _HMS(p);.       
4360: 20 70 2d 3e 59 20 2b 3d 20 79 3b 0a 20 20 20 20   p->Y += y;.    
4370: 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d      p->validJD =
4380: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70   0;.        comp
4390: 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20  uteJD(p);.      
43a0: 20 20 69 66 28 20 79 21 3d 72 20 29 7b 0a 20 20    if( y!=r ){.  
43b0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b          p->iJD +
43c0: 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
43d0: 29 28 28 72 20 2d 20 79 29 2a 33 36 35 2e 30 2a  )((r - y)*365.0*
43e0: 38 36 34 30 30 30 30 30 2e 30 20 2b 20 72 52 6f  86400000.0 + rRo
43f0: 75 6e 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20  under);.        
4400: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
4410: 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
4420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
4430: 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b  arYMD_HMS_TZ(p);
4440: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4450: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
4460: 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   {.      break;.
4470: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4480: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4490: 50 72 6f 63 65 73 73 20 74 69 6d 65 20 66 75 6e  Process time fun
44a0: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 2e  ction arguments.
44b0: 20 20 61 72 67 76 5b 30 5d 20 69 73 20 61 20 64    argv[0] is a d
44c0: 61 74 65 2d 74 69 6d 65 20 73 74 61 6d 70 2e 0a  ate-time stamp..
44d0: 2a 2a 20 61 72 67 76 5b 31 5d 20 61 6e 64 20 66  ** argv[1] and f
44e0: 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6d 6f 64  ollowing are mod
44f0: 69 66 69 65 72 73 2e 20 20 50 61 72 73 65 20 74  ifiers.  Parse t
4500: 68 65 6d 20 61 6c 6c 20 61 6e 64 20 77 72 69 74  hem all and writ
4510: 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 69  e.** the resulti
4520: 6e 67 20 74 69 6d 65 20 69 6e 74 6f 20 74 68 65  ng time into the
4530: 20 44 61 74 65 54 69 6d 65 20 73 74 72 75 63 74   DateTime struct
4540: 75 72 65 20 70 2e 20 20 52 65 74 75 72 6e 20 30  ure p.  Return 0
4550: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61  .** on success a
4560: 6e 64 20 31 20 69 66 20 74 68 65 72 65 20 61 72  nd 1 if there ar
4570: 65 20 61 6e 79 20 65 72 72 6f 72 73 2e 0a 2a 2a  e any errors..**
4580: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
4590: 20 7a 65 72 6f 20 70 61 72 61 6d 65 74 65 72 73   zero parameters
45a0: 20 28 69 66 20 65 76 65 6e 20 61 72 67 76 5b 30   (if even argv[0
45b0: 5d 20 69 73 20 75 6e 64 65 66 69 6e 65 64 29 0a  ] is undefined).
45c0: 2a 2a 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61  ** then assume a
45d0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f   default value o
45e0: 66 20 22 6e 6f 77 22 20 66 6f 72 20 61 72 67 76  f "now" for argv
45f0: 5b 30 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  [0]..*/.static i
4600: 6e 74 20 69 73 44 61 74 65 28 0a 20 20 73 71 6c  nt isDate(.  sql
4610: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
4620: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
4630: 67 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  gc, .  sqlite3_v
4640: 61 6c 75 65 20 2a 2a 61 72 67 76 2c 20 0a 20 20  alue **argv, .  
4650: 44 61 74 65 54 69 6d 65 20 2a 70 0a 29 7b 0a 20  DateTime *p.){. 
4660: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
4670: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
4680: 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20  ;.  int eType;. 
4690: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
46a0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
46b0: 20 61 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20   argc==0 ){.    
46c0: 73 65 74 44 61 74 65 54 69 6d 65 54 6f 43 75 72  setDateTimeToCur
46d0: 72 65 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 29  rent(context, p)
46e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65  ;.  }else if( (e
46f0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76  Type = sqlite3_v
4700: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
4710: 5d 29 29 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  ]))==SQLITE_FLOA
4720: 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T.              
4730: 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
4740: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b  QLITE_INTEGER ){
4750: 0a 20 20 20 20 70 2d 3e 69 4a 44 20 3d 20 28 73  .    p->iJD = (s
4760: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 73 71  qlite3_int64)(sq
4770: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
4780: 6c 65 28 61 72 67 76 5b 30 5d 29 2a 38 36 34 30  le(argv[0])*8640
4790: 30 30 30 30 2e 30 20 2b 20 30 2e 35 29 3b 0a 20  0000.0 + 0.5);. 
47a0: 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20     p->validJD = 
47b0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
47c0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
47d0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
47e0: 0a 20 20 20 20 69 66 28 20 21 7a 20 7c 7c 20 70  .    if( !z || p
47f0: 61 72 73 65 44 61 74 65 4f 72 54 69 6d 65 28 63  arseDateOrTime(c
4800: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a  ontext, (char*)z
4810: 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 72 65  , p) ){.      re
4820: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4830: 7d 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61  }.  for(i=1; i<a
4840: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rgc; i++){.    i
4850: 66 28 20 28 7a 20 3d 20 73 71 6c 69 74 65 33 5f  f( (z = sqlite3_
4860: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
4870: 69 5d 29 29 3d 3d 30 20 7c 7c 20 70 61 72 73 65  i]))==0 || parse
4880: 4d 6f 64 69 66 69 65 72 28 28 63 68 61 72 2a 29  Modifier((char*)
4890: 7a 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 72  z, p) ){.      r
48a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
48b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
48c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
48d0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
48e0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 76 61  implement the va
48f0: 72 69 6f 75 73 20 64 61 74 65 20 61 6e 64 20 74  rious date and t
4900: 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  ime functions.**
4910: 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 0a   of SQLite..*/..
4920: 2f 2a 0a 2a 2a 20 20 20 20 6a 75 6c 69 61 6e 64  /*.**    juliand
4930: 61 79 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20  ay( TIMESTRING, 
4940: 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a  MOD, MOD, ...).*
4950: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4960: 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65  julian day numbe
4970: 72 20 6f 66 20 74 68 65 20 64 61 74 65 20 73 70  r of the date sp
4980: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
4990: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
49a0: 69 63 20 76 6f 69 64 20 6a 75 6c 69 61 6e 64 61  ic void julianda
49b0: 79 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  yFunc(.  sqlite3
49c0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
49d0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
49e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
49f0: 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54  *argv.){.  DateT
4a00: 69 6d 65 20 78 3b 0a 20 20 69 66 28 20 69 73 44  ime x;.  if( isD
4a10: 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67  ate(context, arg
4a20: 63 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d 30 20  c, argv, &x)==0 
4a30: 29 7b 0a 20 20 20 20 63 6f 6d 70 75 74 65 4a 44  ){.    computeJD
4a40: 28 26 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (&x);.    sqlite
4a50: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
4a60: 63 6f 6e 74 65 78 74 2c 20 78 2e 69 4a 44 2f 38  context, x.iJD/8
4a70: 36 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a  6400000.0);.  }.
4a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64 61 74 65  }../*.**    date
4a90: 74 69 6d 65 28 20 54 49 4d 45 53 54 52 49 4e 47  time( TIMESTRING
4aa0: 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29  , MOD, MOD, ...)
4ab0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 59 59  .**.** Return YY
4ac0: 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53  YY-MM-DD HH:MM:S
4ad0: 53 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  S.*/.static void
4ae0: 20 64 61 74 65 74 69 6d 65 46 75 6e 63 28 0a 20   datetimeFunc(. 
4af0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
4b00: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
4b10: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
4b20: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
4b30: 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20  .  DateTime x;. 
4b40: 20 69 66 28 20 69 73 44 61 74 65 28 63 6f 6e 74   if( isDate(cont
4b50: 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  ext, argc, argv,
4b60: 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63   &x)==0 ){.    c
4b70: 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20  har zBuf[100];. 
4b80: 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d     computeYMD_HM
4b90: 53 28 26 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  S(&x);.    sqlit
4ba0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
4bb0: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
4bc0: 22 25 30 34 64 2d 25 30 32 64 2d 25 30 32 64 20  "%04d-%02d-%02d 
4bd0: 25 30 32 64 3a 25 30 32 64 3a 25 30 32 64 22 2c  %02d:%02d:%02d",
4be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4bf0: 20 20 20 20 20 20 78 2e 59 2c 20 78 2e 4d 2c 20        x.Y, x.M, 
4c00: 78 2e 44 2c 20 78 2e 68 2c 20 78 2e 6d 2c 20 28  x.D, x.h, x.m, (
4c10: 69 6e 74 29 28 78 2e 73 29 29 3b 0a 20 20 20 20  int)(x.s));.    
4c20: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4c30: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
4c40: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
4c50: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
4c60: 0a 2f 2a 0a 2a 2a 20 20 20 20 74 69 6d 65 28 20  ./*.**    time( 
4c70: 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c  TIMESTRING, MOD,
4c80: 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a   MOD, ...).**.**
4c90: 20 52 65 74 75 72 6e 20 48 48 3a 4d 4d 3a 53 53   Return HH:MM:SS
4ca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4cb0: 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  timeFunc(.  sqli
4cc0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
4cd0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4ce0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4cf0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61  e **argv.){.  Da
4d00: 74 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20  teTime x;.  if( 
4d10: 69 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20  isDate(context, 
4d20: 61 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d  argc, argv, &x)=
4d30: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
4d40: 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f  Buf[100];.    co
4d50: 6d 70 75 74 65 48 4d 53 28 26 78 29 3b 0a 20 20  mputeHMS(&x);.  
4d60: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4d70: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
4d80: 20 7a 42 75 66 2c 20 22 25 30 32 64 3a 25 30 32   zBuf, "%02d:%02
4d90: 64 3a 25 30 32 64 22 2c 20 78 2e 68 2c 20 78 2e  d:%02d", x.h, x.
4da0: 6d 2c 20 28 69 6e 74 29 78 2e 73 29 3b 0a 20 20  m, (int)x.s);.  
4db0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
4dc0: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
4dd0: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
4de0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a  TRANSIENT);.  }.
4df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64 61 74 65  }../*.**    date
4e00: 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f  ( TIMESTRING, MO
4e10: 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a  D, MOD, ...).**.
4e20: 2a 2a 20 52 65 74 75 72 6e 20 59 59 59 59 2d 4d  ** Return YYYY-M
4e30: 4d 2d 44 44 0a 2a 2f 0a 73 74 61 74 69 63 20 76  M-DD.*/.static v
4e40: 6f 69 64 20 64 61 74 65 46 75 6e 63 28 0a 20 20  oid dateFunc(.  
4e50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4e60: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
4e70: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
4e80: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
4e90: 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20    DateTime x;.  
4ea0: 69 66 28 20 69 73 44 61 74 65 28 63 6f 6e 74 65  if( isDate(conte
4eb0: 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  xt, argc, argv, 
4ec0: 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  &x)==0 ){.    ch
4ed0: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20  ar zBuf[100];.  
4ee0: 20 20 63 6f 6d 70 75 74 65 59 4d 44 28 26 78 29    computeYMD(&x)
4ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
4f00: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
4f10: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 30 34 64  uf), zBuf, "%04d
4f20: 2d 25 30 32 64 2d 25 30 32 64 22 2c 20 78 2e 59  -%02d-%02d", x.Y
4f30: 2c 20 78 2e 4d 2c 20 78 2e 44 29 3b 0a 20 20 20  , x.M, x.D);.   
4f40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4f50: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
4f60: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
4f70: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d  RANSIENT);.  }.}
4f80: 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 74 72 66 74  ../*.**    strft
4f90: 69 6d 65 28 20 46 4f 52 4d 41 54 2c 20 54 49 4d  ime( FORMAT, TIM
4fa0: 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f  ESTRING, MOD, MO
4fb0: 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65  D, ...).**.** Re
4fc0: 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 64 65  turn a string de
4fd0: 73 63 72 69 62 65 64 20 62 79 20 46 4f 52 4d 41  scribed by FORMA
4fe0: 54 2e 20 20 43 6f 6e 76 65 72 73 69 6f 6e 73 20  T.  Conversions 
4ff0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
5000: 2a 20 20 20 25 64 20 20 64 61 79 20 6f 66 20 6d  *   %d  day of m
5010: 6f 6e 74 68 0a 2a 2a 20 20 20 25 66 20 20 2a 2a  onth.**   %f  **
5020: 20 66 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f   fractional seco
5030: 6e 64 73 20 20 53 53 2e 53 53 53 0a 2a 2a 20 20  nds  SS.SSS.**  
5040: 20 25 48 20 20 68 6f 75 72 20 30 30 2d 32 34 0a   %H  hour 00-24.
5050: 2a 2a 20 20 20 25 6a 20 20 64 61 79 20 6f 66 20  **   %j  day of 
5060: 79 65 61 72 20 30 30 30 2d 33 36 36 0a 2a 2a 20  year 000-366.** 
5070: 20 20 25 4a 20 20 2a 2a 20 4a 75 6c 69 61 6e 20    %J  ** Julian 
5080: 64 61 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  day number.**   
5090: 25 6d 20 20 6d 6f 6e 74 68 20 30 31 2d 31 32 0a  %m  month 01-12.
50a0: 2a 2a 20 20 20 25 4d 20 20 6d 69 6e 75 74 65 20  **   %M  minute 
50b0: 30 30 2d 35 39 0a 2a 2a 20 20 20 25 73 20 20 73  00-59.**   %s  s
50c0: 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
50d0: 30 2d 30 31 2d 30 31 0a 2a 2a 20 20 20 25 53 20  0-01-01.**   %S 
50e0: 20 73 65 63 6f 6e 64 73 20 30 30 2d 35 39 0a 2a   seconds 00-59.*
50f0: 2a 20 20 20 25 77 20 20 64 61 79 20 6f 66 20 77  *   %w  day of w
5100: 65 65 6b 20 30 2d 36 20 20 73 75 6e 64 61 79 3d  eek 0-6  sunday=
5110: 3d 30 0a 2a 2a 20 20 20 25 57 20 20 77 65 65 6b  =0.**   %W  week
5120: 20 6f 66 20 79 65 61 72 20 30 30 2d 35 33 0a 2a   of year 00-53.*
5130: 2a 20 20 20 25 59 20 20 79 65 61 72 20 30 30 30  *   %Y  year 000
5140: 30 2d 39 39 39 39 0a 2a 2a 20 20 20 25 25 20 20  0-9999.**   %%  
5150: 25 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  %.*/.static void
5160: 20 73 74 72 66 74 69 6d 65 46 75 6e 63 28 0a 20   strftimeFunc(. 
5170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
5180: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
5190: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
51a0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
51b0: 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20  .  DateTime x;. 
51c0: 20 75 36 34 20 6e 3b 0a 20 20 73 69 7a 65 5f 74   u64 n;.  size_t
51d0: 20 69 2c 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 3b   i,j;.  char *z;
51e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
51f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
5200: 6d 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  mt = (const char
5210: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
5220: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
5230: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
5240: 0a 20 20 69 66 28 20 7a 46 6d 74 3d 3d 30 20 7c  .  if( zFmt==0 |
5250: 7c 20 69 73 44 61 74 65 28 63 6f 6e 74 65 78 74  | isDate(context
5260: 2c 20 61 72 67 63 2d 31 2c 20 61 72 67 76 2b 31  , argc-1, argv+1
5270: 2c 20 26 78 29 20 29 20 72 65 74 75 72 6e 3b 0a  , &x) ) return;.
5280: 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63    db = sqlite3_c
5290: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
52a0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 66 6f 72  (context);.  for
52b0: 28 69 3d 30 2c 20 6e 3d 31 3b 20 7a 46 6d 74 5b  (i=0, n=1; zFmt[
52c0: 69 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20  i]; i++, n++){. 
52d0: 20 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d     if( zFmt[i]==
52e0: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 73 77 69  '%' ){.      swi
52f0: 74 63 68 28 20 7a 46 6d 74 5b 69 2b 31 5d 20 29  tch( zFmt[i+1] )
5300: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  {.        case '
5310: 64 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  d':.        case
5320: 20 27 48 27 3a 0a 20 20 20 20 20 20 20 20 63 61   'H':.        ca
5330: 73 65 20 27 6d 27 3a 0a 20 20 20 20 20 20 20 20  se 'm':.        
5340: 63 61 73 65 20 27 4d 27 3a 0a 20 20 20 20 20 20  case 'M':.      
5350: 20 20 63 61 73 65 20 27 53 27 3a 0a 20 20 20 20    case 'S':.    
5360: 20 20 20 20 63 61 73 65 20 27 57 27 3a 0a 20 20      case 'W':.  
5370: 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
5380: 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74         /* fall t
5390: 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hru */.        c
53a0: 61 73 65 20 27 77 27 3a 0a 20 20 20 20 20 20 20  ase 'w':.       
53b0: 20 63 61 73 65 20 27 25 27 3a 0a 20 20 20 20 20   case '%':.     
53c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
53d0: 20 20 20 20 63 61 73 65 20 27 66 27 3a 0a 20 20      case 'f':.  
53e0: 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 38 3b 0a          n += 8;.
53f0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5400: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 6a  .        case 'j
5410: 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b  ':.          n +
5420: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 3;.          b
5430: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
5440: 73 65 20 27 59 27 3a 0a 20 20 20 20 20 20 20 20  se 'Y':.        
5450: 20 20 6e 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20    n += 8;.      
5460: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5470: 20 20 20 63 61 73 65 20 27 73 27 3a 0a 20 20 20     case 's':.   
5480: 20 20 20 20 20 63 61 73 65 20 27 4a 27 3a 0a 20       case 'J':. 
5490: 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 35 30           n += 50
54a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
54b0: 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
54c0: 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 72 65  lt:.          re
54d0: 74 75 72 6e 3b 20 20 2f 2a 20 45 52 52 4f 52 2e  turn;  /* ERROR.
54e0: 20 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20    return a NULL 
54f0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
5500: 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i++;.    }.  }.
5510: 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 73    testcase( n==s
5520: 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b  izeof(zBuf)-1 );
5530: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
5540: 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 3b 0a  sizeof(zBuf) );.
5550: 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 28    testcase( n==(
5560: 75 36 34 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  u64)db->aLimit[S
5570: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
5580: 54 48 5d 2b 31 20 29 3b 0a 20 20 74 65 73 74 63  TH]+1 );.  testc
5590: 61 73 65 28 20 6e 3d 3d 28 75 36 34 29 64 62 2d  ase( n==(u64)db-
55a0: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
55b0: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a  IMIT_LENGTH] );.
55c0: 20 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28 7a    if( n<sizeof(z
55d0: 42 75 66 29 20 29 7b 0a 20 20 20 20 7a 20 3d 20  Buf) ){.    z = 
55e0: 7a 42 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zBuf;.  }else if
55f0: 28 20 6e 3e 28 75 36 34 29 64 62 2d 3e 61 4c 69  ( n>(u64)db->aLi
5600: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
5610: 5f 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20  _LENGTH] ){.    
5620: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5630: 72 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74  rror_toobig(cont
5640: 65 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ext);.    return
5650: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
5660: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5670: 6f 63 52 61 77 28 64 62 2c 20 28 69 6e 74 29 6e  ocRaw(db, (int)n
5680: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
5690: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
56a0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
56b0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
56c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
56d0: 7d 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4a  }.  }.  computeJ
56e0: 44 28 26 78 29 3b 0a 20 20 63 6f 6d 70 75 74 65  D(&x);.  compute
56f0: 59 4d 44 5f 48 4d 53 28 26 78 29 3b 0a 20 20 66  YMD_HMS(&x);.  f
5700: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46 6d 74 5b 69  or(i=j=0; zFmt[i
5710: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
5720: 20 7a 46 6d 74 5b 69 5d 21 3d 27 25 27 20 29 7b   zFmt[i]!='%' ){
5730: 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20  .      z[j++] = 
5740: 7a 46 6d 74 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  zFmt[i];.    }el
5750: 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  se{.      i++;. 
5760: 20 20 20 20 20 73 77 69 74 63 68 28 20 7a 46 6d       switch( zFm
5770: 74 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  t[i] ){.        
5780: 63 61 73 65 20 27 64 27 3a 20 20 73 71 6c 69 74  case 'd':  sqlit
5790: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 26  e3_snprintf(3, &
57a0: 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 44 29  z[j],"%02d",x.D)
57b0: 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20  ; j+=2; break;. 
57c0: 20 20 20 20 20 20 20 63 61 73 65 20 27 66 27 3a         case 'f':
57d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75   {.          dou
57e0: 62 6c 65 20 73 20 3d 20 78 2e 73 3b 0a 20 20 20  ble s = x.s;.   
57f0: 20 20 20 20 20 20 20 69 66 28 20 73 3e 35 39 2e         if( s>59.
5800: 39 39 39 20 29 20 73 20 3d 20 35 39 2e 39 39 39  999 ) s = 59.999
5810: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
5820: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 37 2c 20  te3_snprintf(7, 
5830: 26 7a 5b 6a 5d 2c 22 25 30 36 2e 33 66 22 2c 20  &z[j],"%06.3f", 
5840: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20  s);.          j 
5850: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
5860: 33 30 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20  30(&z[j]);.     
5870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5880: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5890: 73 65 20 27 48 27 3a 20 20 73 71 6c 69 74 65 33  se 'H':  sqlite3
58a0: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b  _snprintf(3, &z[
58b0: 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 68 29 3b 20  j],"%02d",x.h); 
58c0: 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20  j+=2; break;.   
58d0: 20 20 20 20 20 63 61 73 65 20 27 57 27 3a 20 2f       case 'W': /
58e0: 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
58f0: 20 20 20 20 20 20 20 63 61 73 65 20 27 6a 27 3a         case 'j':
5900: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
5910: 20 6e 44 61 79 3b 20 20 20 20 20 20 20 20 20 20   nDay;          
5920: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5930: 64 61 79 73 20 73 69 6e 63 65 20 31 73 74 20 64  days since 1st d
5940: 61 79 20 6f 66 20 79 65 61 72 20 2a 2f 0a 20 20  ay of year */.  
5950: 20 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65          DateTime
5960: 20 79 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20   y = x;.        
5970: 20 20 79 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b    y.validJD = 0;
5980: 0a 20 20 20 20 20 20 20 20 20 20 79 2e 4d 20 3d  .          y.M =
5990: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 79 2e   1;.          y.
59a0: 44 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  D = 1;.         
59b0: 20 63 6f 6d 70 75 74 65 4a 44 28 26 79 29 3b 0a   computeJD(&y);.
59c0: 20 20 20 20 20 20 20 20 20 20 6e 44 61 79 20 3d            nDay =
59d0: 20 28 69 6e 74 29 28 28 78 2e 69 4a 44 2d 79 2e   (int)((x.iJD-y.
59e0: 69 4a 44 2b 34 33 32 30 30 30 30 30 29 2f 38 36  iJD+43200000)/86
59f0: 34 30 30 30 30 30 29 3b 0a 20 20 20 20 20 20 20  400000);.       
5a00: 20 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d     if( zFmt[i]==
5a10: 27 57 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'W' ){.         
5a20: 20 20 20 69 6e 74 20 77 64 3b 20 20 20 2f 2a 20     int wd;   /* 
5a30: 30 3d 4d 6f 6e 64 61 79 2c 20 31 3d 54 75 65 73  0=Monday, 1=Tues
5a40: 64 61 79 2c 20 2e 2e 2e 20 36 3d 53 75 6e 64 61  day, ... 6=Sunda
5a50: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  y */.           
5a60: 20 77 64 20 3d 20 28 69 6e 74 29 28 28 28 78 2e   wd = (int)(((x.
5a70: 69 4a 44 2b 34 33 32 30 30 30 30 30 29 2f 38 36  iJD+43200000)/86
5a80: 34 30 30 30 30 30 29 25 37 29 3b 0a 20 20 20 20  400000)%7);.    
5a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5aa0: 73 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a  snprintf(3, &z[j
5ab0: 5d 2c 22 25 30 32 64 22 2c 28 6e 44 61 79 2b 37  ],"%02d",(nDay+7
5ac0: 2d 77 64 29 2f 37 29 3b 0a 20 20 20 20 20 20 20  -wd)/7);.       
5ad0: 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20 20       j += 2;.   
5ae0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5af0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5b00: 33 5f 73 6e 70 72 69 6e 74 66 28 34 2c 20 26 7a  3_snprintf(4, &z
5b10: 5b 6a 5d 2c 22 25 30 33 64 22 2c 6e 44 61 79 2b  [j],"%03d",nDay+
5b20: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
5b30: 6a 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  j += 3;.        
5b40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
5b50: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5b60: 20 20 20 20 20 20 20 63 61 73 65 20 27 4a 27 3a         case 'J':
5b70: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
5b80: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30  ite3_snprintf(20
5b90: 2c 20 26 7a 5b 6a 5d 2c 22 25 2e 31 36 67 22 2c  , &z[j],"%.16g",
5ba0: 78 2e 69 4a 44 2f 38 36 34 30 30 30 30 30 2e 30  x.iJD/86400000.0
5bb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 3d  );.          j+=
5bc0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5bd0: 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  &z[j]);.        
5be0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5bf0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
5c00: 27 6d 27 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  'm':  sqlite3_sn
5c10: 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c  printf(3, &z[j],
5c20: 22 25 30 32 64 22 2c 78 2e 4d 29 3b 20 6a 2b 3d  "%02d",x.M); j+=
5c30: 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  2; break;.      
5c40: 20 20 63 61 73 65 20 27 4d 27 3a 20 20 73 71 6c    case 'M':  sql
5c50: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c  ite3_snprintf(3,
5c60: 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e   &z[j],"%02d",x.
5c70: 6d 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b  m); j+=2; break;
5c80: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 73  .        case 's
5c90: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ': {.          s
5ca0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
5cb0: 33 30 2c 26 7a 5b 6a 5d 2c 22 25 6c 6c 64 22 2c  30,&z[j],"%lld",
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 36 34              (i64
5ce0: 29 28 78 2e 69 4a 44 2f 31 30 30 30 20 2d 20 32  )(x.iJD/1000 - 2
5cf0: 31 30 38 36 36 37 36 2a 28 69 36 34 29 31 30 30  1086676*(i64)100
5d00: 30 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  00));.          
5d10: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
5d20: 65 6e 33 30 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20  en30(&z[j]);.   
5d30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5d50: 63 61 73 65 20 27 53 27 3a 20 20 73 71 6c 69 74  case 'S':  sqlit
5d60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 26 7a  e3_snprintf(3,&z
5d70: 5b 6a 5d 2c 22 25 30 32 64 22 2c 28 69 6e 74 29  [j],"%02d",(int)
5d80: 78 2e 73 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61  x.s); j+=2; brea
5d90: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
5da0: 27 77 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  'w': {.         
5db0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72 29   z[j++] = (char)
5dc0: 28 28 28 78 2e 69 4a 44 2b 31 32 39 36 30 30 30  (((x.iJD+1296000
5dd0: 30 30 29 2f 38 36 34 30 30 30 30 30 29 20 25 20  00)/86400000) % 
5de0: 37 29 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20  7) + '0';.      
5df0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5e00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
5e10: 65 20 27 59 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'Y': {.       
5e20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
5e30: 6e 74 66 28 35 2c 26 7a 5b 6a 5d 2c 22 25 30 34  ntf(5,&z[j],"%04
5e40: 64 22 2c 78 2e 59 29 3b 20 6a 2b 3d 73 71 6c 69  d",x.Y); j+=sqli
5e50: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 5b 6a  te3Strlen30(&z[j
5e60: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ]);.          br
5e70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5e80: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20         default: 
5e90: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 25 27 3b 20    z[j++] = '%'; 
5ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5eb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20     }.  }.  z[j] 
5ec0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
5ed0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
5ee0: 78 74 2c 20 7a 2c 20 2d 31 2c 0a 20 20 20 20 20  xt, z, -1,.     
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 7a 3d 3d 7a 42 75 66 20 3f 20 53 51 4c 49 54   z==zBuf ? SQLIT
5f10: 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 53 51  E_TRANSIENT : SQ
5f20: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 7d  LITE_DYNAMIC);.}
5f30: 0a 0a 2f 2a 0a 2a 2a 20 63 75 72 72 65 6e 74 5f  ../*.** current_
5f40: 74 69 6d 65 28 29 0a 2a 2a 0a 2a 2a 20 54 68 69  time().**.** Thi
5f50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
5f60: 6e 73 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  ns the same valu
5f70: 65 20 61 73 20 74 69 6d 65 28 27 6e 6f 77 27 29  e as time('now')
5f80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5f90: 20 63 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71   ctimeFunc(.  sq
5fa0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5fb0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
5fc0: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
5fd0: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
5fe0: 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  2.){.  UNUSED_PA
5ff0: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
6000: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 74  , NotUsed2);.  t
6010: 69 6d 65 46 75 6e 63 28 63 6f 6e 74 65 78 74 2c  imeFunc(context,
6020: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   0, 0);.}../*.**
6030: 20 63 75 72 72 65 6e 74 5f 64 61 74 65 28 29 0a   current_date().
6040: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
6050: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
6060: 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 64 61  same value as da
6070: 74 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74  te('now')..*/.st
6080: 61 74 69 63 20 76 6f 69 64 20 63 64 61 74 65 46  atic void cdateF
6090: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
60a0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
60b0: 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a  .  int NotUsed,.
60c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
60d0: 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20  **NotUsed2.){.  
60e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
60f0: 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
6100: 65 64 32 29 3b 0a 20 20 64 61 74 65 46 75 6e 63  ed2);.  dateFunc
6110: 28 63 6f 6e 74 65 78 74 2c 20 30 2c 20 30 29 3b  (context, 0, 0);
6120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72 72 65 6e  .}../*.** curren
6130: 74 5f 74 69 6d 65 73 74 61 6d 70 28 29 0a 2a 2a  t_timestamp().**
6140: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6150: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61  n returns the sa
6160: 6d 65 20 76 61 6c 75 65 20 61 73 20 64 61 74 65  me value as date
6170: 74 69 6d 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a  time('now')..*/.
6180: 73 74 61 74 69 63 20 76 6f 69 64 20 63 74 69 6d  static void ctim
6190: 65 73 74 61 6d 70 46 75 6e 63 28 0a 20 20 73 71  estampFunc(.  sq
61a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
61b0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
61c0: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
61d0: 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64  _value **NotUsed
61e0: 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  2.){.  UNUSED_PA
61f0: 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
6200: 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 64  , NotUsed2);.  d
6210: 61 74 65 74 69 6d 65 46 75 6e 63 28 63 6f 6e 74  atetimeFunc(cont
6220: 65 78 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 23 65  ext, 0, 0);.}.#e
6230: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
6240: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54  (SQLITE_OMIT_DAT
6250: 45 54 49 4d 45 5f 46 55 4e 43 53 29 20 2a 2f 0a  ETIME_FUNCS) */.
6260: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
6270: 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55 4e  MIT_DATETIME_FUN
6280: 43 53 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  CS./*.** If the 
6290: 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69  library is compi
62a0: 6c 65 64 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  led to omit the 
62b0: 66 75 6c 6c 2d 73 63 61 6c 65 20 64 61 74 65 20  full-scale date 
62c0: 61 6e 64 20 74 69 6d 65 0a 2a 2a 20 68 61 6e 64  and time.** hand
62d0: 6c 69 6e 67 20 28 74 6f 20 67 65 74 20 61 20 73  ling (to get a s
62e0: 6d 61 6c 6c 65 72 20 62 69 6e 61 72 79 29 2c 20  maller binary), 
62f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 69  the following mi
6300: 6e 69 6d 61 6c 20 76 65 72 73 69 6f 6e 0a 2a 2a  nimal version.**
6310: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
6320: 73 20 63 75 72 72 65 6e 74 5f 74 69 6d 65 28 29  s current_time()
6330: 2c 20 63 75 72 72 65 6e 74 5f 64 61 74 65 28 29  , current_date()
6340: 20 61 6e 64 20 63 75 72 72 65 6e 74 5f 74 69 6d   and current_tim
6350: 65 73 74 61 6d 70 28 29 0a 2a 2a 20 61 72 65 20  estamp().** are 
6360: 69 6e 63 6c 75 64 65 64 20 69 6e 73 74 65 61 64  included instead
6370: 2e 20 54 68 69 73 20 69 73 20 74 6f 20 73 75 70  . This is to sup
6380: 70 6f 72 74 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  port column decl
6390: 61 72 61 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a  arations that.**
63a0: 20 69 6e 63 6c 75 64 65 20 22 44 45 46 41 55 4c   include "DEFAUL
63b0: 54 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 20  T CURRENT_TIME" 
63c0: 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  etc..**.** This 
63d0: 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68  function uses th
63e0: 65 20 43 2d 6c 69 62 72 61 72 79 20 66 75 6e 63  e C-library func
63f0: 74 69 6f 6e 73 20 74 69 6d 65 28 29 2c 20 67 6d  tions time(), gm
6400: 74 69 6d 65 28 29 0a 2a 2a 20 61 6e 64 20 73 74  time().** and st
6410: 72 66 74 69 6d 65 28 29 2e 20 54 68 65 20 66 6f  rftime(). The fo
6420: 72 6d 61 74 20 73 74 72 69 6e 67 20 74 6f 20 70  rmat string to p
6430: 61 73 73 20 74 6f 20 73 74 72 66 74 69 6d 65 28  ass to strftime(
6440: 29 20 69 73 20 73 75 70 70 6c 69 65 64 0a 2a 2a  ) is supplied.**
6450: 20 61 73 20 74 68 65 20 75 73 65 72 2d 64 61 74   as the user-dat
6460: 61 20 66 6f 72 20 74 68 65 20 66 75 6e 63 74 69  a for the functi
6470: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
6480: 69 64 20 63 75 72 72 65 6e 74 54 69 6d 65 46 75  id currentTimeFu
6490: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
64a0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
64b0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
64c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
64d0: 67 76 0a 29 7b 0a 20 20 74 69 6d 65 5f 74 20 74  gv.){.  time_t t
64e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  ;.  char *zForma
64f0: 74 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  t = (char *)sqli
6500: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
6510: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
6520: 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  3 *db;.  sqlite3
6530: 5f 69 6e 74 36 34 20 69 54 3b 0a 20 20 63 68 61  _int64 iT;.  cha
6540: 72 20 7a 42 75 66 5b 32 30 5d 3b 0a 0a 20 20 55  r zBuf[20];..  U
6550: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6560: 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
6570: 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b  PARAMETER(argv);
6580: 0a 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33  ..  db = sqlite3
6590: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
65a0: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73  le(context);.  s
65b0: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
65c0: 69 6d 65 49 6e 74 36 34 28 64 62 2d 3e 70 56 66  imeInt64(db->pVf
65d0: 73 20 26 69 54 29 3b 0a 20 20 74 20 3d 20 69 54  s &iT);.  t = iT
65e0: 2f 31 30 30 30 20 2d 20 31 30 30 30 30 2a 28 73  /1000 - 10000*(s
65f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 31 30  qlite3_int64)210
6600: 38 36 36 37 36 3b 0a 23 69 66 64 65 66 20 48 41  86676;.#ifdef HA
6610: 56 45 5f 47 4d 54 49 4d 45 5f 52 0a 20 20 7b 0a  VE_GMTIME_R.  {.
6620: 20 20 20 20 73 74 72 75 63 74 20 74 6d 20 73 4e      struct tm sN
6630: 6f 77 3b 0a 20 20 20 20 67 6d 74 69 6d 65 5f 72  ow;.    gmtime_r
6640: 28 26 74 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 20  (&t, &sNow);.   
6650: 20 73 74 72 66 74 69 6d 65 28 7a 42 75 66 2c 20   strftime(zBuf, 
6660: 32 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 26 73 4e  20, zFormat, &sN
6670: 6f 77 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ow);.  }.#else. 
6680: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 6d   {.    struct tm
6690: 20 2a 70 54 6d 3b 0a 20 20 20 20 73 71 6c 69 74   *pTm;.    sqlit
66a0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
66b0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
66c0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
66d0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 20  ATIC_MASTER));. 
66e0: 20 20 20 70 54 6d 20 3d 20 67 6d 74 69 6d 65 28     pTm = gmtime(
66f0: 26 74 29 3b 0a 20 20 20 20 73 74 72 66 74 69 6d  &t);.    strftim
6700: 65 28 7a 42 75 66 2c 20 32 30 2c 20 7a 46 6f 72  e(zBuf, 20, zFor
6710: 6d 61 74 2c 20 70 54 6d 29 3b 0a 20 20 20 20 73  mat, pTm);.    s
6720: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6730: 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
6740: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6750: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
6760: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
6770: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6780: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
6790: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
67a0: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e  RANSIENT);.}.#en
67b0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
67c0: 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 65  function registe
67d0: 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  red all of the a
67e0: 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f 6e 73  bove C functions
67f0: 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74   as SQL.** funct
6800: 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68 6f 75  ions.  This shou
6810: 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72  ld be the only r
6820: 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20 66  outine in this f
6830: 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78 74 65  ile with.** exte
6840: 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a 2f  rnal linkage..*/
6850: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67  .void sqlite3Reg
6860: 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e  isterDateTimeFun
6870: 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20  ctions(void){.  
6880: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 57 53  static SQLITE_WS
6890: 44 20 46 75 6e 63 44 65 66 20 61 44 61 74 65 54  D FuncDef aDateT
68a0: 69 6d 65 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 23  imeFuncs[] = {.#
68b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
68c0: 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55 4e 43  IT_DATETIME_FUNC
68d0: 53 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6a  S.    FUNCTION(j
68e0: 75 6c 69 61 6e 64 61 79 2c 20 20 20 20 20 20 20  ulianday,       
68f0: 20 2d 31 2c 20 30 2c 20 30 2c 20 6a 75 6c 69 61   -1, 0, 0, julia
6900: 6e 64 61 79 46 75 6e 63 20 29 2c 0a 20 20 20 20  ndayFunc ),.    
6910: 46 55 4e 43 54 49 4f 4e 28 64 61 74 65 2c 20 20  FUNCTION(date,  
6920: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30             -1, 0
6930: 2c 20 30 2c 20 64 61 74 65 46 75 6e 63 20 20 20  , 0, dateFunc   
6940: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
6950: 4f 4e 28 74 69 6d 65 2c 20 20 20 20 20 20 20 20  ON(time,        
6960: 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 74       -1, 0, 0, t
6970: 69 6d 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a  imeFunc      ),.
6980: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 64 61 74      FUNCTION(dat
6990: 65 74 69 6d 65 2c 20 20 20 20 20 20 20 20 20 2d  etime,         -
69a0: 31 2c 20 30 2c 20 30 2c 20 64 61 74 65 74 69 6d  1, 0, 0, datetim
69b0: 65 46 75 6e 63 20 20 29 2c 0a 20 20 20 20 46 55  eFunc  ),.    FU
69c0: 4e 43 54 49 4f 4e 28 73 74 72 66 74 69 6d 65 2c  NCTION(strftime,
69d0: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20           -1, 0, 
69e0: 30 2c 20 73 74 72 66 74 69 6d 65 46 75 6e 63 20  0, strftimeFunc 
69f0: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
6a00: 28 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 20  (current_time,  
6a10: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 74 69      0, 0, 0, cti
6a20: 6d 65 46 75 6e 63 20 20 20 20 20 29 2c 0a 20 20  meFunc     ),.  
6a30: 20 20 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65    FUNCTION(curre
6a40: 6e 74 5f 74 69 6d 65 73 74 61 6d 70 2c 20 30 2c  nt_timestamp, 0,
6a50: 20 30 2c 20 30 2c 20 63 74 69 6d 65 73 74 61 6d   0, 0, ctimestam
6a60: 70 46 75 6e 63 29 2c 0a 20 20 20 20 46 55 4e 43  pFunc),.    FUNC
6a70: 54 49 4f 4e 28 63 75 72 72 65 6e 74 5f 64 61 74  TION(current_dat
6a80: 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  e,      0, 0, 0,
6a90: 20 63 64 61 74 65 46 75 6e 63 20 20 20 20 20 29   cdateFunc     )
6aa0: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 53 54 52 5f  ,.#else.    STR_
6ab0: 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 6e 74  FUNCTION(current
6ac0: 5f 74 69 6d 65 2c 20 20 20 20 20 20 30 2c 20 22  _time,      0, "
6ad0: 25 48 3a 25 4d 3a 25 53 22 2c 20 20 20 20 20 20  %H:%M:%S",      
6ae0: 20 20 20 20 30 2c 20 63 75 72 72 65 6e 74 54 69      0, currentTi
6af0: 6d 65 46 75 6e 63 29 2c 0a 20 20 20 20 53 54 52  meFunc),.    STR
6b00: 5f 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 6e  _FUNCTION(curren
6b10: 74 5f 64 61 74 65 2c 20 20 20 20 20 20 30 2c 20  t_date,      0, 
6b20: 22 25 59 2d 25 6d 2d 25 64 22 2c 20 20 20 20 20  "%Y-%m-%d",     
6b30: 20 20 20 20 20 30 2c 20 63 75 72 72 65 6e 74 54       0, currentT
6b40: 69 6d 65 46 75 6e 63 29 2c 0a 20 20 20 20 53 54  imeFunc),.    ST
6b50: 52 5f 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65  R_FUNCTION(curre
6b60: 6e 74 5f 74 69 6d 65 73 74 61 6d 70 2c 20 30 2c  nt_timestamp, 0,
6b70: 20 22 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d   "%Y-%m-%d %H:%M
6b80: 3a 25 53 22 2c 20 30 2c 20 63 75 72 72 65 6e 74  :%S", 0, current
6b90: 54 69 6d 65 46 75 6e 63 29 2c 0a 23 65 6e 64 69  TimeFunc),.#endi
6ba0: 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  f.  };.  int i;.
6bb0: 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70    FuncDefHash *p
6bc0: 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46  Hash = &GLOBAL(F
6bd0: 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69  uncDefHash, sqli
6be0: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
6bf0: 6e 73 29 3b 0a 20 20 46 75 6e 63 44 65 66 20 2a  ns);.  FuncDef *
6c00: 61 46 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66  aFunc = (FuncDef
6c10: 2a 29 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65  *)&GLOBAL(FuncDe
6c20: 66 2c 20 61 44 61 74 65 54 69 6d 65 46 75 6e 63  f, aDateTimeFunc
6c30: 73 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s);..  for(i=0; 
6c40: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 44 61 74  i<ArraySize(aDat
6c50: 65 54 69 6d 65 46 75 6e 63 73 29 3b 20 69 2b 2b  eTimeFuncs); i++
6c60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 75  ){.    sqlite3Fu
6c70: 6e 63 44 65 66 49 6e 73 65 72 74 28 70 48 61 73  ncDefInsert(pHas
6c80: 68 2c 20 26 61 46 75 6e 63 5b 69 5d 29 3b 0a 20  h, &aFunc[i]);. 
6c90: 20 7d 0a 7d 0a                                    }.}.