/ Hex Artifact Content
Login

Artifact 8eb16dd5c0fea761f65f1ed98b2c2e8fbaea800c:


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 0a 2f 2a 0a 2a 2a  ME_FUNCS.../*.**
0730: 20 41 20 73 74 72 75 63 74 75 72 65 20 66 6f 72   A structure for
0740: 20 68 6f 6c 64 69 6e 67 20 61 20 73 69 6e 67 6c   holding a singl
0750: 65 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 2e  e date and time.
0760: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0770: 63 74 20 44 61 74 65 54 69 6d 65 20 44 61 74 65  ct DateTime Date
0780: 54 69 6d 65 3b 0a 73 74 72 75 63 74 20 44 61 74  Time;.struct Dat
0790: 65 54 69 6d 65 20 7b 0a 20 20 73 71 6c 69 74 65  eTime {.  sqlite
07a0: 33 5f 69 6e 74 36 34 20 69 4a 44 3b 20 2f 2a 20  3_int64 iJD; /* 
07b0: 54 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e  The julian day n
07c0: 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 34 30  umber times 8640
07d0: 30 30 30 30 20 2a 2f 0a 20 20 69 6e 74 20 59 2c  0000 */.  int Y,
07e0: 20 4d 2c 20 44 3b 20 20 20 20 20 20 20 2f 2a 20   M, D;       /* 
07f0: 59 65 61 72 2c 20 6d 6f 6e 74 68 2c 20 61 6e 64  Year, month, and
0800: 20 64 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 2c   day */.  int h,
0810: 20 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   m;          /* 
0820: 48 6f 75 72 20 61 6e 64 20 6d 69 6e 75 74 65 73  Hour and minutes
0830: 20 2a 2f 0a 20 20 69 6e 74 20 74 7a 3b 20 20 20   */.  int tz;   
0840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 69 6d 65           /* Time
0850: 7a 6f 6e 65 20 6f 66 66 73 65 74 20 69 6e 20 6d  zone offset in m
0860: 69 6e 75 74 65 73 20 2a 2f 0a 20 20 64 6f 75 62  inutes */.  doub
0870: 6c 65 20 73 3b 20 20 20 20 20 20 20 20 20 20 2f  le s;          /
0880: 2a 20 53 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 63  * Seconds */.  c
0890: 68 61 72 20 76 61 6c 69 64 59 4d 44 3b 20 20 20  har validYMD;   
08a0: 20 20 2f 2a 20 54 72 75 65 20 28 31 29 20 69 66    /* True (1) if
08b0: 20 59 2c 4d 2c 44 20 61 72 65 20 76 61 6c 69 64   Y,M,D are valid
08c0: 20 2a 2f 0a 20 20 63 68 61 72 20 76 61 6c 69 64   */.  char valid
08d0: 48 4d 53 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  HMS;     /* True
08e0: 20 28 31 29 20 69 66 20 68 2c 6d 2c 73 20 61 72   (1) if h,m,s ar
08f0: 65 20 76 61 6c 69 64 20 2a 2f 0a 20 20 63 68 61  e valid */.  cha
0900: 72 20 76 61 6c 69 64 4a 44 3b 20 20 20 20 20 20  r validJD;      
0910: 2f 2a 20 54 72 75 65 20 28 31 29 20 69 66 20 69  /* True (1) if i
0920: 4a 44 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  JD is valid */. 
0930: 20 63 68 61 72 20 76 61 6c 69 64 54 5a 3b 20 20   char validTZ;  
0940: 20 20 20 20 2f 2a 20 54 72 75 65 20 28 31 29 20      /* True (1) 
0950: 69 66 20 74 7a 20 69 73 20 76 61 6c 69 64 20 2a  if tz is valid *
0960: 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  /.};.../*.** Con
0970: 76 65 72 74 20 7a 44 61 74 65 20 69 6e 74 6f 20  vert zDate into 
0980: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 74 65  one or more inte
0990: 67 65 72 73 2e 20 20 41 64 64 69 74 69 6f 6e 61  gers.  Additiona
09a0: 6c 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 63  l arguments.** c
09b0: 6f 6d 65 20 69 6e 20 67 72 6f 75 70 73 20 6f 66  ome in groups of
09c0: 20 35 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a   5 as follows:.*
09d0: 2a 0a 2a 2a 20 20 20 20 20 20 20 4e 20 20 20 20  *.**       N    
09e0: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 67     number of dig
09f0: 69 74 73 20 69 6e 20 74 68 65 20 69 6e 74 65 67  its in the integ
0a00: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6d 69 6e 20  er.**       min 
0a10: 20 20 20 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f      minimum allo
0a20: 77 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 65  wed value of the
0a30: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
0a40: 20 20 6d 61 78 20 20 20 20 20 6d 61 78 69 6d 75    max     maximu
0a50: 6d 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 20  m allowed value 
0a60: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
0a70: 2a 20 20 20 20 20 20 20 6e 65 78 74 43 20 20 20  *       nextC   
0a80: 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20  first character 
0a90: 61 66 74 65 72 20 74 68 65 20 69 6e 74 65 67 65  after the intege
0aa0: 72 0a 2a 2a 20 20 20 20 20 20 20 70 56 61 6c 20  r.**       pVal 
0ab0: 20 20 20 77 68 65 72 65 20 74 6f 20 77 72 69 74     where to writ
0ac0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 76  e the integers v
0ad0: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76  alue..**.** Conv
0ae0: 65 72 73 69 6f 6e 73 20 63 6f 6e 74 69 6e 75 65  ersions continue
0af0: 20 75 6e 74 69 6c 20 6f 6e 65 20 77 69 74 68 20   until one with 
0b00: 6e 65 78 74 43 3d 3d 30 20 69 73 20 65 6e 63 6f  nextC==0 is enco
0b10: 75 6e 74 65 72 65 64 2e 0a 2a 2a 20 54 68 65 20  untered..** The 
0b20: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0b30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
0b40: 75 63 63 65 73 73 66 75 6c 20 63 6f 6e 76 65 72  uccessful conver
0b50: 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
0b60: 20 69 6e 74 20 67 65 74 44 69 67 69 74 73 28 63   int getDigits(c
0b70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
0b80: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
0b90: 74 20 61 70 3b 0a 20 20 69 6e 74 20 76 61 6c 3b  t ap;.  int val;
0ba0: 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20  .  int N;.  int 
0bb0: 6d 69 6e 3b 0a 20 20 69 6e 74 20 6d 61 78 3b 0a  min;.  int max;.
0bc0: 20 20 69 6e 74 20 6e 65 78 74 43 3b 0a 20 20 69    int nextC;.  i
0bd0: 6e 74 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  nt *pVal;.  int 
0be0: 63 6e 74 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74  cnt = 0;.  va_st
0bf0: 61 72 74 28 61 70 2c 20 7a 44 61 74 65 29 3b 0a  art(ap, zDate);.
0c00: 20 20 64 6f 7b 0a 20 20 20 20 4e 20 3d 20 76 61    do{.    N = va
0c10: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0c20: 20 20 20 6d 69 6e 20 3d 20 76 61 5f 61 72 67 28     min = va_arg(
0c30: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 6d 61  ap, int);.    ma
0c40: 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  x = va_arg(ap, i
0c50: 6e 74 29 3b 0a 20 20 20 20 6e 65 78 74 43 20 3d  nt);.    nextC =
0c60: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
0c70: 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 76 61 5f  ;.    pVal = va_
0c80: 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
0c90: 20 20 20 76 61 6c 20 3d 20 30 3b 0a 20 20 20 20     val = 0;.    
0ca0: 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20  while( N-- ){.  
0cb0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
0cc0: 49 73 64 69 67 69 74 28 2a 7a 44 61 74 65 29 20  Isdigit(*zDate) 
0cd0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
0ce0: 65 6e 64 5f 67 65 74 44 69 67 69 74 73 3b 0a 20  end_getDigits;. 
0cf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 76 61 6c       }.      val
0d00: 20 3d 20 76 61 6c 2a 31 30 20 2b 20 2a 7a 44 61   = val*10 + *zDa
0d10: 74 65 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  te - '0';.      
0d20: 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  zDate++;.    }. 
0d30: 20 20 20 69 66 28 20 76 61 6c 3c 6d 69 6e 20 7c     if( val<min |
0d40: 7c 20 76 61 6c 3e 6d 61 78 20 7c 7c 20 28 6e 65  | val>max || (ne
0d50: 78 74 43 21 3d 30 20 26 26 20 6e 65 78 74 43 21  xtC!=0 && nextC!
0d60: 3d 2a 7a 44 61 74 65 29 20 29 7b 0a 20 20 20 20  =*zDate) ){.    
0d70: 20 20 67 6f 74 6f 20 65 6e 64 5f 67 65 74 44 69    goto end_getDi
0d80: 67 69 74 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  gits;.    }.    
0d90: 2a 70 56 61 6c 20 3d 20 76 61 6c 3b 0a 20 20 20  *pVal = val;.   
0da0: 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 63 6e   zDate++;.    cn
0db0: 74 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e  t++;.  }while( n
0dc0: 65 78 74 43 20 29 3b 0a 65 6e 64 5f 67 65 74 44  extC );.end_getD
0dd0: 69 67 69 74 73 3a 0a 20 20 76 61 5f 65 6e 64 28  igits:.  va_end(
0de0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e  ap);.  return cn
0df0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  t;.}../*.** Pars
0e00: 65 20 61 20 74 69 6d 65 7a 6f 6e 65 20 65 78 74  e a timezone ext
0e10: 65 6e 73 69 6f 6e 20 6f 6e 20 74 68 65 20 65 6e  ension on the en
0e20: 64 20 6f 66 20 61 20 64 61 74 65 2d 74 69 6d 65  d of a date-time
0e30: 2e 0a 2a 2a 20 54 68 65 20 65 78 74 65 6e 73 69  ..** The extensi
0e40: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
0e50: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  m:.**.**        
0e60: 28 2b 2f 2d 29 48 48 3a 4d 4d 0a 2a 2a 0a 2a 2a  (+/-)HH:MM.**.**
0e70: 20 4f 72 20 74 68 65 20 22 7a 75 6c 75 22 20 6e   Or the "zulu" n
0e80: 6f 74 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  otation:.**.**  
0e90: 20 20 20 20 20 20 5a 0a 2a 2a 0a 2a 2a 20 49 66        Z.**.** If
0ea0: 20 74 68 65 20 70 61 72 73 65 20 69 73 20 73 75   the parse is su
0eb0: 63 63 65 73 73 66 75 6c 2c 20 77 72 69 74 65 20  ccessful, write 
0ec0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
0ed0: 6e 75 74 65 73 0a 2a 2a 20 6f 66 20 63 68 61 6e  nutes.** of chan
0ee0: 67 65 20 69 6e 20 70 2d 3e 74 7a 20 61 6e 64 20  ge in p->tz and 
0ef0: 72 65 74 75 72 6e 20 30 2e 20 20 49 66 20 61 20  return 0.  If a 
0f00: 70 61 72 73 65 72 20 65 72 72 6f 72 20 6f 63 63  parser error occ
0f10: 75 72 73 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 6e  urs,.** return n
0f20: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 41  on-zero..**.** A
0f30: 20 6d 69 73 73 69 6e 67 20 73 70 65 63 69 66 69   missing specifi
0f40: 65 72 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  er is not consid
0f50: 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ered an error..*
0f60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72  /.static int par
0f70: 73 65 54 69 6d 65 7a 6f 6e 65 28 63 6f 6e 73 74  seTimezone(const
0f80: 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 44 61   char *zDate, Da
0f90: 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  teTime *p){.  in
0fa0: 74 20 73 67 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  t sgn = 0;.  int
0fb0: 20 6e 48 72 2c 20 6e 4d 6e 3b 0a 20 20 69 6e 74   nHr, nMn;.  int
0fc0: 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   c;.  while( sql
0fd0: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 44 61  ite3Isspace(*zDa
0fe0: 74 65 29 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20  te) ){ zDate++; 
0ff0: 7d 0a 20 20 70 2d 3e 74 7a 20 3d 20 30 3b 0a 20  }.  p->tz = 0;. 
1000: 20 63 20 3d 20 2a 7a 44 61 74 65 3b 0a 20 20 69   c = *zDate;.  i
1010: 66 28 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  f( c=='-' ){.   
1020: 20 73 67 6e 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c   sgn = -1;.  }el
1030: 73 65 20 69 66 28 20 63 3d 3d 27 2b 27 20 29 7b  se if( c=='+' ){
1040: 0a 20 20 20 20 73 67 6e 20 3d 20 2b 31 3b 0a 20  .    sgn = +1;. 
1050: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5a   }else if( c=='Z
1060: 27 20 7c 7c 20 63 3d 3d 27 7a 27 20 29 7b 0a 20  ' || c=='z' ){. 
1070: 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20     zDate++;.    
1080: 67 6f 74 6f 20 7a 75 6c 75 5f 74 69 6d 65 3b 0a  goto zulu_time;.
1090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
10a0: 75 72 6e 20 63 21 3d 30 3b 0a 20 20 7d 0a 20 20  urn c!=0;.  }.  
10b0: 7a 44 61 74 65 2b 2b 3b 0a 20 20 69 66 28 20 67  zDate++;.  if( g
10c0: 65 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c 20  etDigits(zDate, 
10d0: 32 2c 20 30 2c 20 31 34 2c 20 27 3a 27 2c 20 26  2, 0, 14, ':', &
10e0: 6e 48 72 2c 20 32 2c 20 30 2c 20 35 39 2c 20 30  nHr, 2, 0, 59, 0
10f0: 2c 20 26 6e 4d 6e 29 21 3d 32 20 29 7b 0a 20 20  , &nMn)!=2 ){.  
1100: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1110: 20 20 7a 44 61 74 65 20 2b 3d 20 35 3b 0a 20 20    zDate += 5;.  
1120: 70 2d 3e 74 7a 20 3d 20 73 67 6e 2a 28 6e 4d 6e  p->tz = sgn*(nMn
1130: 20 2b 20 6e 48 72 2a 36 30 29 3b 0a 7a 75 6c 75   + nHr*60);.zulu
1140: 5f 74 69 6d 65 3a 0a 20 20 77 68 69 6c 65 28 20  _time:.  while( 
1150: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
1160: 7a 44 61 74 65 29 20 29 7b 20 7a 44 61 74 65 2b  zDate) ){ zDate+
1170: 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a  +; }.  return *z
1180: 44 61 74 65 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Date!=0;.}../*.*
1190: 2a 20 50 61 72 73 65 20 74 69 6d 65 73 20 6f 66  * Parse times of
11a0: 20 74 68 65 20 66 6f 72 6d 20 48 48 3a 4d 4d 20   the form HH:MM 
11b0: 6f 72 20 48 48 3a 4d 4d 3a 53 53 20 6f 72 20 48  or HH:MM:SS or H
11c0: 48 3a 4d 4d 3a 53 53 2e 46 46 46 46 2e 0a 2a 2a  H:MM:SS.FFFF..**
11d0: 20 54 68 65 20 48 48 2c 20 4d 4d 2c 20 61 6e 64   The HH, MM, and
11e0: 20 53 53 20 6d 75 73 74 20 65 61 63 68 20 62 65   SS must each be
11f0: 20 65 78 61 63 74 6c 79 20 32 20 64 69 67 69 74   exactly 2 digit
1200: 73 2e 20 20 54 68 65 0a 2a 2a 20 66 72 61 63 74  s.  The.** fract
1210: 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 20 46 46  ional seconds FF
1220: 46 46 20 63 61 6e 20 62 65 20 6f 6e 65 20 6f 72  FF can be one or
1230: 20 6d 6f 72 65 20 64 69 67 69 74 73 2e 0a 2a 2a   more digits..**
1240: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
1250: 74 68 65 72 65 20 69 73 20 61 20 70 61 72 73 69  there is a parsi
1260: 6e 67 20 65 72 72 6f 72 20 61 6e 64 20 30 20 6f  ng error and 0 o
1270: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
1280: 61 74 69 63 20 69 6e 74 20 70 61 72 73 65 48 68  atic int parseHh
1290: 4d 6d 53 73 28 63 6f 6e 73 74 20 63 68 61 72 20  MmSs(const char 
12a0: 2a 7a 44 61 74 65 2c 20 44 61 74 65 54 69 6d 65  *zDate, DateTime
12b0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 2c 20 6d   *p){.  int h, m
12c0: 2c 20 73 3b 0a 20 20 64 6f 75 62 6c 65 20 6d 73  , s;.  double ms
12d0: 20 3d 20 30 2e 30 3b 0a 20 20 69 66 28 20 67 65   = 0.0;.  if( ge
12e0: 74 44 69 67 69 74 73 28 7a 44 61 74 65 2c 20 32  tDigits(zDate, 2
12f0: 2c 20 30 2c 20 32 34 2c 20 27 3a 27 2c 20 26 68  , 0, 24, ':', &h
1300: 2c 20 32 2c 20 30 2c 20 35 39 2c 20 30 2c 20 26  , 2, 0, 59, 0, &
1310: 6d 29 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  m)!=2 ){.    ret
1320: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 7a 44 61  urn 1;.  }.  zDa
1330: 74 65 20 2b 3d 20 35 3b 0a 20 20 69 66 28 20 2a  te += 5;.  if( *
1340: 7a 44 61 74 65 3d 3d 27 3a 27 20 29 7b 0a 20 20  zDate==':' ){.  
1350: 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20 20 20 69    zDate++;.    i
1360: 66 28 20 67 65 74 44 69 67 69 74 73 28 7a 44 61  f( getDigits(zDa
1370: 74 65 2c 20 32 2c 20 30 2c 20 35 39 2c 20 30 2c  te, 2, 0, 59, 0,
1380: 20 26 73 29 21 3d 31 20 29 7b 0a 20 20 20 20 20   &s)!=1 ){.     
1390: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
13a0: 0a 20 20 20 20 7a 44 61 74 65 20 2b 3d 20 32 3b  .    zDate += 2;
13b0: 0a 20 20 20 20 69 66 28 20 2a 7a 44 61 74 65 3d  .    if( *zDate=
13c0: 3d 27 2e 27 20 26 26 20 73 71 6c 69 74 65 33 49  ='.' && sqlite3I
13d0: 73 64 69 67 69 74 28 7a 44 61 74 65 5b 31 5d 29  sdigit(zDate[1])
13e0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
13f0: 20 72 53 63 61 6c 65 20 3d 20 31 2e 30 3b 0a 20   rScale = 1.0;. 
1400: 20 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20       zDate++;.  
1410: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
1420: 65 33 49 73 64 69 67 69 74 28 2a 7a 44 61 74 65  e3Isdigit(*zDate
1430: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 73 20  ) ){.        ms 
1440: 3d 20 6d 73 2a 31 30 2e 30 20 2b 20 2a 7a 44 61  = ms*10.0 + *zDa
1450: 74 65 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  te - '0';.      
1460: 20 20 72 53 63 61 6c 65 20 2a 3d 20 31 30 2e 30    rScale *= 10.0
1470: 3b 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 2b  ;.        zDate+
1480: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
1490: 20 6d 73 20 2f 3d 20 72 53 63 61 6c 65 3b 0a 20   ms /= rScale;. 
14a0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
14b0: 20 20 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70    s = 0;.  }.  p
14c0: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20  ->validJD = 0;. 
14d0: 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 31   p->validHMS = 1
14e0: 3b 0a 20 20 70 2d 3e 68 20 3d 20 68 3b 0a 20 20  ;.  p->h = h;.  
14f0: 70 2d 3e 6d 20 3d 20 6d 3b 0a 20 20 70 2d 3e 73  p->m = m;.  p->s
1500: 20 3d 20 73 20 2b 20 6d 73 3b 0a 20 20 69 66 28   = s + ms;.  if(
1510: 20 70 61 72 73 65 54 69 6d 65 7a 6f 6e 65 28 7a   parseTimezone(z
1520: 44 61 74 65 2c 20 70 29 20 29 20 72 65 74 75 72  Date, p) ) retur
1530: 6e 20 31 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 54  n 1;.  p->validT
1540: 5a 20 3d 20 28 70 2d 3e 74 7a 21 3d 30 29 3f 31  Z = (p->tz!=0)?1
1550: 3a 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  :0;.  return 0;.
1560: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1570: 20 66 72 6f 6d 20 59 59 59 59 2d 4d 4d 2d 44 44   from YYYY-MM-DD
1580: 20 48 48 3a 4d 4d 3a 53 53 20 74 6f 20 6a 75 6c   HH:MM:SS to jul
1590: 69 61 6e 20 64 61 79 2e 20 20 57 65 20 61 6c 77  ian day.  We alw
15a0: 61 79 73 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68  ays assume.** th
15b0: 61 74 20 74 68 65 20 59 59 59 59 2d 4d 4d 2d 44  at the YYYY-MM-D
15c0: 44 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74  D is according t
15d0: 6f 20 74 68 65 20 47 72 65 67 6f 72 69 61 6e 20  o the Gregorian 
15e0: 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
15f0: 52 65 66 65 72 65 6e 63 65 3a 20 20 4d 65 65 75  Reference:  Meeu
1600: 73 20 70 61 67 65 20 36 31 0a 2a 2f 0a 73 74 61  s page 61.*/.sta
1610: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
1620: 4a 44 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b  JD(DateTime *p){
1630: 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c 20  .  int Y, M, D, 
1640: 41 2c 20 42 2c 20 58 31 2c 20 58 32 3b 0a 0a 20  A, B, X1, X2;.. 
1650: 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 4a 44 20   if( p->validJD 
1660: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1670: 70 2d 3e 76 61 6c 69 64 59 4d 44 20 29 7b 0a 20  p->validYMD ){. 
1680: 20 20 20 59 20 3d 20 70 2d 3e 59 3b 0a 20 20 20     Y = p->Y;.   
1690: 20 4d 20 3d 20 70 2d 3e 4d 3b 0a 20 20 20 20 44   M = p->M;.    D
16a0: 20 3d 20 70 2d 3e 44 3b 0a 20 20 7d 65 6c 73 65   = p->D;.  }else
16b0: 7b 0a 20 20 20 20 59 20 3d 20 32 30 30 30 3b 20  {.    Y = 2000; 
16c0: 20 2f 2a 20 49 66 20 6e 6f 20 59 4d 44 20 73 70   /* If no YMD sp
16d0: 65 63 69 66 69 65 64 2c 20 61 73 73 75 6d 65 20  ecified, assume 
16e0: 32 30 30 30 2d 4a 61 6e 2d 30 31 20 2a 2f 0a 20  2000-Jan-01 */. 
16f0: 20 20 20 4d 20 3d 20 31 3b 0a 20 20 20 20 44 20     M = 1;.    D 
1700: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  = 1;.  }.  if( M
1710: 3c 3d 32 20 29 7b 0a 20 20 20 20 59 2d 2d 3b 0a  <=2 ){.    Y--;.
1720: 20 20 20 20 4d 20 2b 3d 20 31 32 3b 0a 20 20 7d      M += 12;.  }
1730: 0a 20 20 41 20 3d 20 59 2f 31 30 30 3b 0a 20 20  .  A = Y/100;.  
1740: 42 20 3d 20 32 20 2d 20 41 20 2b 20 28 41 2f 34  B = 2 - A + (A/4
1750: 29 3b 0a 20 20 58 31 20 3d 20 33 36 35 32 35 2a  );.  X1 = 36525*
1760: 28 59 2b 34 37 31 36 29 2f 31 30 30 3b 0a 20 20  (Y+4716)/100;.  
1770: 58 32 20 3d 20 33 30 36 30 30 31 2a 28 4d 2b 31  X2 = 306001*(M+1
1780: 29 2f 31 30 30 30 30 3b 0a 20 20 70 2d 3e 69 4a  )/10000;.  p->iJ
1790: 44 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  D = (sqlite3_int
17a0: 36 34 29 28 28 58 31 20 2b 20 58 32 20 2b 20 44  64)((X1 + X2 + D
17b0: 20 2b 20 42 20 2d 20 31 35 32 34 2e 35 20 29 20   + B - 1524.5 ) 
17c0: 2a 20 38 36 34 30 30 30 30 30 29 3b 0a 20 20 70  * 86400000);.  p
17d0: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 20  ->validJD = 1;. 
17e0: 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 48 4d 53   if( p->validHMS
17f0: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4a 44 20 2b   ){.    p->iJD +
1800: 3d 20 70 2d 3e 68 2a 33 36 30 30 30 30 30 20 2b  = p->h*3600000 +
1810: 20 70 2d 3e 6d 2a 36 30 30 30 30 20 2b 20 28 73   p->m*60000 + (s
1820: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 70 2d  qlite3_int64)(p-
1830: 3e 73 2a 31 30 30 30 29 3b 0a 20 20 20 20 69 66  >s*1000);.    if
1840: 28 20 70 2d 3e 76 61 6c 69 64 54 5a 20 29 7b 0a  ( p->validTZ ){.
1850: 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2d 3d 20        p->iJD -= 
1860: 70 2d 3e 74 7a 2a 36 30 30 30 30 3b 0a 20 20 20  p->tz*60000;.   
1870: 20 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d     p->validYMD =
1880: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c   0;.      p->val
1890: 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20 20 20 20  idHMS = 0;.     
18a0: 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b   p->validTZ = 0;
18b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
18c0: 0a 2a 2a 20 50 61 72 73 65 20 64 61 74 65 73 20  .** Parse dates 
18d0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
18e0: 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44  *     YYYY-MM-DD
18f0: 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 0a 2a 2a   HH:MM:SS.FFF.**
1900: 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20       YYYY-MM-DD 
1910: 48 48 3a 4d 4d 3a 53 53 0a 2a 2a 20 20 20 20 20  HH:MM:SS.**     
1920: 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d  YYYY-MM-DD HH:MM
1930: 0a 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d  .**     YYYY-MM-
1940: 44 44 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  DD.**.** Write t
1950: 68 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 74  he result into t
1960: 68 65 20 44 61 74 65 54 69 6d 65 20 73 74 72 75  he DateTime stru
1970: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
1980: 20 30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73   0.** on success
1990: 20 61 6e 64 20 31 20 69 66 20 74 68 65 20 69 6e   and 1 if the in
19a0: 70 75 74 20 73 74 72 69 6e 67 20 69 73 20 6e 6f  put string is no
19b0: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
19c0: 2a 2a 20 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  ** date..*/.stat
19d0: 69 63 20 69 6e 74 20 70 61 72 73 65 59 79 79 79  ic int parseYyyy
19e0: 4d 6d 44 64 28 63 6f 6e 73 74 20 63 68 61 72 20  MmDd(const char 
19f0: 2a 7a 44 61 74 65 2c 20 44 61 74 65 54 69 6d 65  *zDate, DateTime
1a00: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 59 2c 20 4d   *p){.  int Y, M
1a10: 2c 20 44 2c 20 6e 65 67 3b 0a 0a 20 20 69 66 28  , D, neg;..  if(
1a20: 20 7a 44 61 74 65 5b 30 5d 3d 3d 27 2d 27 20 29   zDate[0]=='-' )
1a30: 7b 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20  {.    zDate++;. 
1a40: 20 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20 7d 65     neg = 1;.  }e
1a50: 6c 73 65 7b 0a 20 20 20 20 6e 65 67 20 3d 20 30  lse{.    neg = 0
1a60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1a70: 69 67 69 74 73 28 7a 44 61 74 65 2c 34 2c 30 2c  igits(zDate,4,0,
1a80: 39 39 39 39 2c 27 2d 27 2c 26 59 2c 32 2c 31 2c  9999,'-',&Y,2,1,
1a90: 31 32 2c 27 2d 27 2c 26 4d 2c 32 2c 31 2c 33 31  12,'-',&M,2,1,31
1aa0: 2c 30 2c 26 44 29 21 3d 33 20 29 7b 0a 20 20 20  ,0,&D)!=3 ){.   
1ab0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1ac0: 20 7a 44 61 74 65 20 2b 3d 20 31 30 3b 0a 20 20   zDate += 10;.  
1ad0: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
1ae0: 73 70 61 63 65 28 2a 7a 44 61 74 65 29 20 7c 7c  space(*zDate) ||
1af0: 20 27 54 27 3d 3d 2a 28 75 38 2a 29 7a 44 61 74   'T'==*(u8*)zDat
1b00: 65 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d 0a  e ){ zDate++; }.
1b10: 20 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53    if( parseHhMmS
1b20: 73 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30 20 29  s(zDate, p)==0 )
1b30: 7b 0a 20 20 20 20 2f 2a 20 57 65 20 67 6f 74 20  {.    /* We got 
1b40: 74 68 65 20 74 69 6d 65 20 2a 2f 0a 20 20 7d 65  the time */.  }e
1b50: 6c 73 65 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d  lse if( *zDate==
1b60: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 76 61 6c 69  0 ){.    p->vali
1b70: 64 48 4d 53 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  dHMS = 0;.  }els
1b80: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  e{.    return 1;
1b90: 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a  .  }.  p->validJ
1ba0: 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69  D = 0;.  p->vali
1bb0: 64 59 4d 44 20 3d 20 31 3b 0a 20 20 70 2d 3e 59  dYMD = 1;.  p->Y
1bc0: 20 3d 20 6e 65 67 20 3f 20 2d 59 20 3a 20 59 3b   = neg ? -Y : Y;
1bd0: 0a 20 20 70 2d 3e 4d 20 3d 20 4d 3b 0a 20 20 70  .  p->M = M;.  p
1be0: 2d 3e 44 20 3d 20 44 3b 0a 20 20 69 66 28 20 70  ->D = D;.  if( p
1bf0: 2d 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20 20 20  ->validTZ ){.   
1c00: 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20   computeJD(p);. 
1c10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1c20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1c30: 74 69 6d 65 20 74 6f 20 74 68 65 20 63 75 72 72  time to the curr
1c40: 65 6e 74 20 74 69 6d 65 20 72 65 70 6f 72 74 65  ent time reporte
1c50: 64 20 62 79 20 74 68 65 20 56 46 53 0a 2a 2f 0a  d by the VFS.*/.
1c60: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44  static void setD
1c70: 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65 6e 74  ateTimeToCurrent
1c80: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
1c90: 20 2a 63 6f 6e 74 65 78 74 2c 20 44 61 74 65 54   *context, DateT
1ca0: 69 6d 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  ime *p){.  sqlit
1cb0: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
1cc0: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
1cd0: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73  le(context);.  s
1ce0: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
1cf0: 69 6d 65 49 6e 74 36 34 28 64 62 2d 3e 70 56 66  imeInt64(db->pVf
1d00: 73 2c 20 26 70 2d 3e 69 4a 44 29 3b 0a 20 20 70  s, &p->iJD);.  p
1d10: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 7d  ->validJD = 1;.}
1d20: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1d30: 74 6f 20 70 61 72 73 65 20 74 68 65 20 67 69 76  to parse the giv
1d40: 65 6e 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61  en string into a
1d50: 20 4a 75 6c 69 61 6e 20 44 61 79 20 4e 75 6d 62   Julian Day Numb
1d60: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  er.  Return.** t
1d70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1d80: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ors..**.** The f
1d90: 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 61 63 63  ollowing are acc
1da0: 65 70 74 61 62 6c 65 20 66 6f 72 6d 73 20 66 6f  eptable forms fo
1db0: 72 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  r the input stri
1dc0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59  ng:.**.**      Y
1dd0: 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a  YYY-MM-DD HH:MM:
1de0: 53 53 2e 46 46 46 20 20 2b 2f 2d 48 48 3a 4d 4d  SS.FFF  +/-HH:MM
1df0: 0a 2a 2a 20 20 20 20 20 20 44 44 44 44 2e 44 44  .**      DDDD.DD
1e00: 20 0a 2a 2a 20 20 20 20 20 20 6e 6f 77 0a 2a 2a   .**      now.**
1e10: 0a 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74  .** In the first
1e20: 20 66 6f 72 6d 2c 20 74 68 65 20 2b 2f 2d 48 48   form, the +/-HH
1e30: 3a 4d 4d 20 69 73 20 61 6c 77 61 79 73 20 6f 70  :MM is always op
1e40: 74 69 6f 6e 61 6c 2e 20 20 54 68 65 20 66 72 61  tional.  The fra
1e50: 63 74 69 6f 6e 61 6c 0a 2a 2a 20 73 65 63 6f 6e  ctional.** secon
1e60: 64 73 20 65 78 74 65 6e 73 69 6f 6e 20 28 74 68  ds extension (th
1e70: 65 20 22 2e 46 46 46 22 29 20 69 73 20 6f 70 74  e ".FFF") is opt
1e80: 69 6f 6e 61 6c 2e 20 20 54 68 65 20 73 65 63 6f  ional.  The seco
1e90: 6e 64 73 20 70 6f 72 74 69 6f 6e 0a 2a 2a 20 28  nds portion.** (
1ea0: 22 3a 53 53 2e 46 46 46 22 29 20 69 73 20 6f 70  ":SS.FFF") is op
1eb0: 74 69 6f 6e 2e 20 20 54 68 65 20 79 65 61 72 20  tion.  The year 
1ec0: 61 6e 64 20 64 61 74 65 20 63 61 6e 20 62 65 20  and date can be 
1ed0: 6f 6d 69 74 74 65 64 20 61 73 20 6c 6f 6e 67 0a  omitted as long.
1ee0: 2a 2a 20 61 73 20 74 68 65 72 65 20 69 73 20 61  ** as there is a
1ef0: 20 74 69 6d 65 20 73 74 72 69 6e 67 2e 20 20 54   time string.  T
1f00: 68 65 20 74 69 6d 65 20 73 74 72 69 6e 67 20 63  he time string c
1f10: 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61 73  an be omitted as
1f20: 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 74 68 65 72   long.** as ther
1f30: 65 20 69 73 20 61 20 79 65 61 72 20 61 6e 64 20  e is a year and 
1f40: 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  date..*/.static 
1f50: 69 6e 74 20 70 61 72 73 65 44 61 74 65 4f 72 54  int parseDateOrT
1f60: 69 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ime(.  sqlite3_c
1f70: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
1f80: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1f90: 7a 44 61 74 65 2c 20 0a 20 20 44 61 74 65 54 69  zDate, .  DateTi
1fa0: 6d 65 20 2a 70 0a 29 7b 0a 20 20 64 6f 75 62 6c  me *p.){.  doubl
1fb0: 65 20 72 3b 0a 20 20 69 66 28 20 70 61 72 73 65  e r;.  if( parse
1fc0: 59 79 79 79 4d 6d 44 64 28 7a 44 61 74 65 2c 70  YyyyMmDd(zDate,p
1fd0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
1fe0: 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rn 0;.  }else if
1ff0: 28 20 70 61 72 73 65 48 68 4d 6d 53 73 28 7a 44  ( parseHhMmSs(zD
2000: 61 74 65 2c 20 70 29 3d 3d 30 20 29 7b 0a 20 20  ate, p)==0 ){.  
2010: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
2020: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
2030: 74 72 49 43 6d 70 28 7a 44 61 74 65 2c 22 6e 6f  trICmp(zDate,"no
2040: 77 22 29 3d 3d 30 29 7b 0a 20 20 20 20 73 65 74  w")==0){.    set
2050: 44 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65 6e  DateTimeToCurren
2060: 74 28 63 6f 6e 74 65 78 74 2c 20 70 29 3b 0a 20  t(context, p);. 
2070: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2080: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
2090: 41 74 6f 46 28 7a 44 61 74 65 2c 20 26 72 2c 20  AtoF(zDate, &r, 
20a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
20b0: 7a 44 61 74 65 29 2c 20 53 51 4c 49 54 45 5f 55  zDate), SQLITE_U
20c0: 54 46 38 29 20 29 7b 0a 20 20 20 20 70 2d 3e 69  TF8) ){.    p->i
20d0: 4a 44 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  JD = (sqlite3_in
20e0: 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e  t64)(r*86400000.
20f0: 30 20 2b 20 30 2e 35 29 3b 0a 20 20 20 20 70 2d  0 + 0.5);.    p-
2100: 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 20 20  >validJD = 1;.  
2110: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2120: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
2130: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
2140: 20 59 65 61 72 2c 20 4d 6f 6e 74 68 2c 20 61 6e   Year, Month, an
2150: 64 20 44 61 79 20 66 72 6f 6d 20 74 68 65 20 6a  d Day from the j
2160: 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72  ulian day number
2170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2180: 20 63 6f 6d 70 75 74 65 59 4d 44 28 44 61 74 65   computeYMD(Date
2190: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Time *p){.  int 
21a0: 5a 2c 20 41 2c 20 42 2c 20 43 2c 20 44 2c 20 45  Z, A, B, C, D, E
21b0: 2c 20 58 31 3b 0a 20 20 69 66 28 20 70 2d 3e 76  , X1;.  if( p->v
21c0: 61 6c 69 64 59 4d 44 20 29 20 72 65 74 75 72 6e  alidYMD ) return
21d0: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 76 61 6c 69  ;.  if( !p->vali
21e0: 64 4a 44 20 29 7b 0a 20 20 20 20 70 2d 3e 59 20  dJD ){.    p->Y 
21f0: 3d 20 32 30 30 30 3b 0a 20 20 20 20 70 2d 3e 4d  = 2000;.    p->M
2200: 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 44 20 3d   = 1;.    p->D =
2210: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
2220: 20 5a 20 3d 20 28 69 6e 74 29 28 28 70 2d 3e 69   Z = (int)((p->i
2230: 4a 44 20 2b 20 34 33 32 30 30 30 30 30 29 2f 38  JD + 43200000)/8
2240: 36 34 30 30 30 30 30 29 3b 0a 20 20 20 20 41 20  6400000);.    A 
2250: 3d 20 28 69 6e 74 29 28 28 5a 20 2d 20 31 38 36  = (int)((Z - 186
2260: 37 32 31 36 2e 32 35 29 2f 33 36 35 32 34 2e 32  7216.25)/36524.2
2270: 35 29 3b 0a 20 20 20 20 41 20 3d 20 5a 20 2b 20  5);.    A = Z + 
2280: 31 20 2b 20 41 20 2d 20 28 41 2f 34 29 3b 0a 20  1 + A - (A/4);. 
2290: 20 20 20 42 20 3d 20 41 20 2b 20 31 35 32 34 3b     B = A + 1524;
22a0: 0a 20 20 20 20 43 20 3d 20 28 69 6e 74 29 28 28  .    C = (int)((
22b0: 42 20 2d 20 31 32 32 2e 31 29 2f 33 36 35 2e 32  B - 122.1)/365.2
22c0: 35 29 3b 0a 20 20 20 20 44 20 3d 20 28 33 36 35  5);.    D = (365
22d0: 32 35 2a 43 29 2f 31 30 30 3b 0a 20 20 20 20 45  25*C)/100;.    E
22e0: 20 3d 20 28 69 6e 74 29 28 28 42 2d 44 29 2f 33   = (int)((B-D)/3
22f0: 30 2e 36 30 30 31 29 3b 0a 20 20 20 20 58 31 20  0.6001);.    X1 
2300: 3d 20 28 69 6e 74 29 28 33 30 2e 36 30 30 31 2a  = (int)(30.6001*
2310: 45 29 3b 0a 20 20 20 20 70 2d 3e 44 20 3d 20 42  E);.    p->D = B
2320: 20 2d 20 44 20 2d 20 58 31 3b 0a 20 20 20 20 70   - D - X1;.    p
2330: 2d 3e 4d 20 3d 20 45 3c 31 34 20 3f 20 45 2d 31  ->M = E<14 ? E-1
2340: 20 3a 20 45 2d 31 33 3b 0a 20 20 20 20 70 2d 3e   : E-13;.    p->
2350: 59 20 3d 20 70 2d 3e 4d 3e 32 20 3f 20 43 20 2d  Y = p->M>2 ? C -
2360: 20 34 37 31 36 20 3a 20 43 20 2d 20 34 37 31 35   4716 : C - 4715
2370: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69 64  ;.  }.  p->valid
2380: 59 4d 44 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  YMD = 1;.}../*.*
2390: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 48 6f  * Compute the Ho
23a0: 75 72 2c 20 4d 69 6e 75 74 65 2c 20 61 6e 64 20  ur, Minute, and 
23b0: 53 65 63 6f 6e 64 73 20 66 72 6f 6d 20 74 68 65  Seconds from the
23c0: 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62   julian day numb
23d0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
23e0: 69 64 20 63 6f 6d 70 75 74 65 48 4d 53 28 44 61  id computeHMS(Da
23f0: 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  teTime *p){.  in
2400: 74 20 73 3b 0a 20 20 69 66 28 20 70 2d 3e 76 61  t s;.  if( p->va
2410: 6c 69 64 48 4d 53 20 29 20 72 65 74 75 72 6e 3b  lidHMS ) return;
2420: 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b  .  computeJD(p);
2430: 0a 20 20 73 20 3d 20 28 69 6e 74 29 28 28 70 2d  .  s = (int)((p-
2440: 3e 69 4a 44 20 2b 20 34 33 32 30 30 30 30 30 29  >iJD + 43200000)
2450: 20 25 20 38 36 34 30 30 30 30 30 29 3b 0a 20 20   % 86400000);.  
2460: 70 2d 3e 73 20 3d 20 73 2f 31 30 30 30 2e 30 3b  p->s = s/1000.0;
2470: 0a 20 20 73 20 3d 20 28 69 6e 74 29 70 2d 3e 73  .  s = (int)p->s
2480: 3b 0a 20 20 70 2d 3e 73 20 2d 3d 20 73 3b 0a 20  ;.  p->s -= s;. 
2490: 20 70 2d 3e 68 20 3d 20 73 2f 33 36 30 30 3b 0a   p->h = s/3600;.
24a0: 20 20 73 20 2d 3d 20 70 2d 3e 68 2a 33 36 30 30    s -= p->h*3600
24b0: 3b 0a 20 20 70 2d 3e 6d 20 3d 20 73 2f 36 30 3b  ;.  p->m = s/60;
24c0: 0a 20 20 70 2d 3e 73 20 2b 3d 20 73 20 2d 20 70  .  p->s += s - p
24d0: 2d 3e 6d 2a 36 30 3b 0a 20 20 70 2d 3e 76 61 6c  ->m*60;.  p->val
24e0: 69 64 48 4d 53 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  idHMS = 1;.}../*
24f0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 62 6f 74 68  .** Compute both
2500: 20 59 4d 44 20 61 6e 64 20 48 4d 53 0a 2a 2f 0a   YMD and HMS.*/.
2510: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
2520: 75 74 65 59 4d 44 5f 48 4d 53 28 44 61 74 65 54  uteYMD_HMS(DateT
2530: 69 6d 65 20 2a 70 29 7b 0a 20 20 63 6f 6d 70 75  ime *p){.  compu
2540: 74 65 59 4d 44 28 70 29 3b 0a 20 20 63 6f 6d 70  teYMD(p);.  comp
2550: 75 74 65 48 4d 53 28 70 29 3b 0a 7d 0a 0a 2f 2a  uteHMS(p);.}../*
2560: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 59 4d  .** Clear the YM
2570: 44 20 61 6e 64 20 48 4d 53 20 61 6e 64 20 74 68  D and HMS and th
2580: 65 20 54 5a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e TZ.*/.static v
2590: 6f 69 64 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53  oid clearYMD_HMS
25a0: 5f 54 5a 28 44 61 74 65 54 69 6d 65 20 2a 70 29  _TZ(DateTime *p)
25b0: 7b 0a 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20  {.  p->validYMD 
25c0: 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 48  = 0;.  p->validH
25d0: 4d 53 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c  MS = 0;.  p->val
25e0: 69 64 54 5a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  idTZ = 0;.}../*.
25f0: 2a 2a 20 4f 6e 20 72 65 63 65 6e 74 20 57 69 6e  ** On recent Win
2600: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 2c 20  dows platforms, 
2610: 74 68 65 20 6c 6f 63 61 6c 74 69 6d 65 5f 73 28  the localtime_s(
2620: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 76  ) function is av
2630: 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 70 61  ailable.** as pa
2640: 72 74 20 6f 66 20 74 68 65 20 22 53 65 63 75 72  rt of the "Secur
2650: 65 20 43 52 54 22 2e 20 49 74 20 69 73 20 65 73  e CRT". It is es
2660: 73 65 6e 74 69 61 6c 6c 79 20 65 71 75 69 76 61  sentially equiva
2670: 6c 65 6e 74 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  lent to .** loca
2680: 6c 74 69 6d 65 5f 72 28 29 20 61 76 61 69 6c 61  ltime_r() availa
2690: 62 6c 65 20 75 6e 64 65 72 20 6d 6f 73 74 20 50  ble under most P
26a0: 4f 53 49 58 20 70 6c 61 74 66 6f 72 6d 73 2c 20  OSIX platforms, 
26b0: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
26c0: 0a 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65  .** order of the
26d0: 20 70 61 72 61 6d 65 74 65 72 73 20 69 73 20 72   parameters is r
26e0: 65 76 65 72 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eversed..**.** S
26f0: 65 65 20 68 74 74 70 3a 2f 2f 6d 73 64 6e 2e 6d  ee http://msdn.m
2700: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 65 6e 2d  icrosoft.com/en-
2710: 75 73 2f 6c 69 62 72 61 72 79 2f 61 34 34 32 78  us/library/a442x
2720: 33 79 65 28 56 53 2e 38 30 29 2e 61 73 70 78 2e  3ye(VS.80).aspx.
2730: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  .**.** If the us
2740: 65 72 20 68 61 73 20 6e 6f 74 20 69 6e 64 69 63  er has not indic
2750: 61 74 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 61  ated to use loca
2760: 6c 74 69 6d 65 5f 72 28 29 20 6f 72 20 6c 6f 63  ltime_r() or loc
2770: 61 6c 74 69 6d 65 5f 73 28 29 0a 2a 2a 20 61 6c  altime_s().** al
2780: 72 65 61 64 79 2c 20 63 68 65 63 6b 20 66 6f 72  ready, check for
2790: 20 61 6e 20 4d 53 56 43 20 62 75 69 6c 64 20 65   an MSVC build e
27a0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 74 68 61 74 20  nvironment that 
27b0: 70 72 6f 76 69 64 65 73 20 0a 2a 2a 20 6c 6f 63  provides .** loc
27c0: 61 6c 74 69 6d 65 5f 73 28 29 2e 0a 2a 2f 0a 23  altime_s()..*/.#
27d0: 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45  if !defined(HAVE
27e0: 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 29 20 26 26  _LOCALTIME_R) &&
27f0: 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c   !defined(HAVE_L
2800: 4f 43 41 4c 54 49 4d 45 5f 53 29 20 26 26 20 5c  OCALTIME_S) && \
2810: 0a 20 20 20 20 20 64 65 66 69 6e 65 64 28 5f 4d  .     defined(_M
2820: 53 43 5f 56 45 52 29 20 26 26 20 64 65 66 69 6e  SC_VER) && defin
2830: 65 64 28 5f 43 52 54 5f 49 4e 53 45 43 55 52 45  ed(_CRT_INSECURE
2840: 5f 44 45 50 52 45 43 41 54 45 29 0a 23 64 65 66  _DEPRECATE).#def
2850: 69 6e 65 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49  ine HAVE_LOCALTI
2860: 4d 45 5f 53 20 31 0a 23 65 6e 64 69 66 0a 0a 23  ME_S 1.#endif..#
2870: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2880: 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 0a 2f 2a 0a  IT_LOCALTIME./*.
2890: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
28a0: 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
28b0: 6e 74 73 20 74 68 65 20 72 6f 75 67 68 20 65 71  nts the rough eq
28c0: 75 69 76 61 6c 65 6e 74 20 6f 66 20 6c 6f 63 61  uivalent of loca
28d0: 6c 74 69 6d 65 5f 72 28 29 0a 2a 2a 20 75 73 69  ltime_r().** usi
28e0: 6e 67 20 77 68 61 74 65 76 65 72 20 6f 70 65 72  ng whatever oper
28f0: 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 73 70 65  ating-system spe
2900: 63 69 66 69 63 20 6c 6f 63 61 6c 74 69 6d 65 20  cific localtime 
2910: 66 61 63 69 6c 69 74 79 20 74 68 61 74 0a 2a 2a  facility that.**
2920: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
2930: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2940: 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73  urns 0 on succes
2950: 73 20 61 6e 64 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  s and.** non-zer
2960: 6f 20 6f 6e 20 61 6e 79 20 6b 69 6e 64 20 6f 66  o on any kind of
2970: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
2980: 20 74 68 65 20 73 71 6c 69 74 65 33 47 6c 6f 62   the sqlite3Glob
2990: 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74  alConfig.bLocalt
29a0: 69 6d 65 46 61 75 6c 74 20 76 61 72 69 61 62 6c  imeFault variabl
29b0: 65 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74  e is true then t
29c0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  his.** routine w
29d0: 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 2e  ill always fail.
29e0: 0a 2a 2f 0a 69 6e 74 20 6f 73 4c 6f 63 61 6c 74  .*/.int osLocalt
29f0: 69 6d 65 28 74 69 6d 65 5f 74 20 2a 74 2c 20 73  ime(time_t *t, s
2a00: 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 29 7b 0a  truct tm *pTm){.
2a10: 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 20 28 21    int rc;.#if (!
2a20: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 4f 43  defined(HAVE_LOC
2a30: 41 4c 54 49 4d 45 5f 52 29 20 7c 7c 20 21 48 41  ALTIME_R) || !HA
2a40: 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 29 20  VE_LOCALTIME_R) 
2a50: 5c 0a 20 20 20 20 20 20 26 26 20 28 21 64 65 66  \.      && (!def
2a60: 69 6e 65 64 28 48 41 56 45 5f 4c 4f 43 41 4c 54  ined(HAVE_LOCALT
2a70: 49 4d 45 5f 53 29 20 7c 7c 20 21 48 41 56 45 5f  IME_S) || !HAVE_
2a80: 4c 4f 43 41 4c 54 49 4d 45 5f 53 29 0a 20 20 73  LOCALTIME_S).  s
2a90: 74 72 75 63 74 20 74 6d 20 2a 70 58 3b 0a 20 20  truct tm *pX;.  
2aa0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
2ab0: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
2ac0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
2ad0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
2ae0: 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
2af0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
2b00: 78 29 3b 0a 20 20 70 58 20 3d 20 6c 6f 63 61 6c  x);.  pX = local
2b10: 74 69 6d 65 28 74 29 3b 0a 23 69 66 6e 64 65 66  time(t);.#ifndef
2b20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
2b30: 4c 54 49 4e 5f 54 45 53 54 0a 20 20 69 66 28 20  LTIN_TEST.  if( 
2b40: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2b50: 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61  fig.bLocaltimeFa
2b60: 75 6c 74 20 29 20 70 58 20 3d 20 30 3b 0a 23 65  ult ) pX = 0;.#e
2b70: 6e 64 69 66 0a 20 20 69 66 28 20 70 58 20 29 20  ndif.  if( pX ) 
2b80: 2a 70 54 6d 20 3d 20 2a 70 58 3b 0a 20 20 73 71  *pTm = *pX;.  sq
2b90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2ba0: 65 28 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d  e(mutex);.  rc =
2bb0: 20 70 58 3d 3d 30 3b 0a 23 65 6c 73 65 0a 23 69   pX==0;.#else.#i
2bc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2bd0: 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20  T_BUILTIN_TEST. 
2be0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2bf0: 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74  alConfig.bLocalt
2c00: 69 6d 65 46 61 75 6c 74 20 29 20 72 65 74 75 72  imeFault ) retur
2c10: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
2c20: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c 4f 43  defined(HAVE_LOC
2c30: 41 4c 54 49 4d 45 5f 52 29 20 26 26 20 48 41 56  ALTIME_R) && HAV
2c40: 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 0a 20 20  E_LOCALTIME_R.  
2c50: 72 63 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 5f 72  rc = localtime_r
2c60: 28 74 2c 20 70 54 6d 29 3d 3d 30 3b 0a 23 65 6c  (t, pTm)==0;.#el
2c70: 73 65 0a 20 20 72 63 20 3d 20 6c 6f 63 61 6c 74  se.  rc = localt
2c80: 69 6d 65 5f 73 28 70 54 6d 2c 20 74 29 3b 0a 23  ime_s(pTm, t);.#
2c90: 65 6e 64 69 66 20 2f 2a 20 48 41 56 45 5f 4c 4f  endif /* HAVE_LO
2ca0: 43 41 4c 54 49 4d 45 5f 52 20 2a 2f 0a 23 65 6e  CALTIME_R */.#en
2cb0: 64 69 66 20 2f 2a 20 48 41 56 45 5f 4c 4f 43 41  dif /* HAVE_LOCA
2cc0: 4c 54 49 4d 45 5f 52 20 7c 7c 20 48 41 56 45 5f  LTIME_R || HAVE_
2cd0: 4c 4f 43 41 4c 54 49 4d 45 5f 53 20 2a 2f 0a 20  LOCALTIME_S */. 
2ce0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
2cf0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2d00: 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 20 2a 2f  MIT_LOCALTIME */
2d10: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2d20: 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45  E_OMIT_LOCALTIME
2d30: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
2d40: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 28 69  he difference (i
2d50: 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 20  n milliseconds) 
2d60: 62 65 74 77 65 65 6e 20 6c 6f 63 61 6c 74 69 6d  between localtim
2d70: 65 20 61 6e 64 20 55 54 43 0a 2a 2a 20 28 61 2e  e and UTC.** (a.
2d80: 6b 2e 61 2e 20 47 4d 54 29 20 66 6f 72 20 74 68  k.a. GMT) for th
2d90: 65 20 74 69 6d 65 20 76 61 6c 75 65 20 70 20 77  e time value p w
2da0: 68 65 72 65 20 70 20 69 73 20 69 6e 20 55 54 43  here p is in UTC
2db0: 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
2dc0: 63 75 72 73 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  curs,.** return 
2dd0: 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 73  this value and s
2de0: 65 74 20 2a 70 52 63 20 74 6f 20 53 51 4c 49 54  et *pRc to SQLIT
2df0: 45 5f 4f 4b 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c  E_OK. .**.** Or,
2e00: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
2e10: 73 20 6f 63 63 75 72 2c 20 73 65 74 20 2a 70 52  s occur, set *pR
2e20: 63 20 74 6f 20 53 51 4c 49 54 45 5f 45 52 52 4f  c to SQLITE_ERRO
2e30: 52 2e 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  R. The returned 
2e40: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 75 6e 64 65  value.** is unde
2e50: 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
2e60: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  se..*/.static sq
2e70: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6c 6f 63 61  lite3_int64 loca
2e80: 6c 74 69 6d 65 4f 66 66 73 65 74 28 0a 20 20 44  ltimeOffset(.  D
2e90: 61 74 65 54 69 6d 65 20 2a 70 2c 20 20 20 20 20  ateTime *p,     
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 44 61 74 65 20 61 74 20 77 68 69 63 68 20  * Date at which 
2ec0: 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 6f 66 66  to calculate off
2ed0: 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  set */.  sqlite3
2ee0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2f00: 65 20 65 72 72 6f 72 20 68 65 72 65 20 69 66 20  e error here if 
2f10: 6f 6e 65 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  one occurs */.  
2f20: 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 20  int *pRc        
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  /* OUT: Error co
2f50: 64 65 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  de. SQLITE_OK or
2f60: 20 45 52 52 4f 52 20 2a 2f 0a 29 7b 0a 20 20 44   ERROR */.){.  D
2f70: 61 74 65 54 69 6d 65 20 78 2c 20 79 3b 0a 20 20  ateTime x, y;.  
2f80: 74 69 6d 65 5f 74 20 74 3b 0a 20 20 73 74 72 75  time_t t;.  stru
2f90: 63 74 20 74 6d 20 73 4c 6f 63 61 6c 3b 0a 0a 20  ct tm sLocal;.. 
2fa0: 20 78 20 3d 20 2a 70 3b 0a 20 20 63 6f 6d 70 75   x = *p;.  compu
2fb0: 74 65 59 4d 44 5f 48 4d 53 28 26 78 29 3b 0a 20  teYMD_HMS(&x);. 
2fc0: 20 69 66 28 20 78 2e 59 3c 31 39 37 31 20 7c 7c   if( x.Y<1971 ||
2fd0: 20 78 2e 59 3e 3d 32 30 33 38 20 29 7b 0a 20 20   x.Y>=2038 ){.  
2fe0: 20 20 78 2e 59 20 3d 20 32 30 30 30 3b 0a 20 20    x.Y = 2000;.  
2ff0: 20 20 78 2e 4d 20 3d 20 31 3b 0a 20 20 20 20 78    x.M = 1;.    x
3000: 2e 44 20 3d 20 31 3b 0a 20 20 20 20 78 2e 68 20  .D = 1;.    x.h 
3010: 3d 20 30 3b 0a 20 20 20 20 78 2e 6d 20 3d 20 30  = 0;.    x.m = 0
3020: 3b 0a 20 20 20 20 78 2e 73 20 3d 20 30 2e 30 3b  ;.    x.s = 0.0;
3030: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
3040: 69 6e 74 20 73 20 3d 20 28 69 6e 74 29 28 78 2e  int s = (int)(x.
3050: 73 20 2b 20 30 2e 35 29 3b 0a 20 20 20 20 78 2e  s + 0.5);.    x.
3060: 73 20 3d 20 73 3b 0a 20 20 7d 0a 20 20 78 2e 74  s = s;.  }.  x.t
3070: 7a 20 3d 20 30 3b 0a 20 20 78 2e 76 61 6c 69 64  z = 0;.  x.valid
3080: 4a 44 20 3d 20 30 3b 0a 20 20 63 6f 6d 70 75 74  JD = 0;.  comput
3090: 65 4a 44 28 26 78 29 3b 0a 20 20 74 20 3d 20 28  eJD(&x);.  t = (
30a0: 74 69 6d 65 5f 74 29 28 78 2e 69 4a 44 2f 31 30  time_t)(x.iJD/10
30b0: 30 30 20 2d 20 32 31 30 38 36 36 37 36 2a 28 69  00 - 21086676*(i
30c0: 36 34 29 31 30 30 30 30 29 3b 0a 20 20 69 66 28  64)10000);.  if(
30d0: 20 6f 73 4c 6f 63 61 6c 74 69 6d 65 28 26 74 2c   osLocaltime(&t,
30e0: 20 26 73 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20   &sLocal) ){.   
30f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
3100: 65 72 72 6f 72 28 70 43 74 78 2c 20 22 6c 6f 63  error(pCtx, "loc
3110: 61 6c 20 74 69 6d 65 20 75 6e 61 76 61 69 6c 61  al time unavaila
3120: 62 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 2a  ble", -1);.    *
3130: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  pRc = SQLITE_ERR
3140: 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  OR;.    return 0
3150: 3b 0a 20 20 7d 0a 20 20 79 2e 59 20 3d 20 73 4c  ;.  }.  y.Y = sL
3160: 6f 63 61 6c 2e 74 6d 5f 79 65 61 72 20 2b 20 31  ocal.tm_year + 1
3170: 39 30 30 3b 0a 20 20 79 2e 4d 20 3d 20 73 4c 6f  900;.  y.M = sLo
3180: 63 61 6c 2e 74 6d 5f 6d 6f 6e 20 2b 20 31 3b 0a  cal.tm_mon + 1;.
3190: 20 20 79 2e 44 20 3d 20 73 4c 6f 63 61 6c 2e 74    y.D = sLocal.t
31a0: 6d 5f 6d 64 61 79 3b 0a 20 20 79 2e 68 20 3d 20  m_mday;.  y.h = 
31b0: 73 4c 6f 63 61 6c 2e 74 6d 5f 68 6f 75 72 3b 0a  sLocal.tm_hour;.
31c0: 20 20 79 2e 6d 20 3d 20 73 4c 6f 63 61 6c 2e 74    y.m = sLocal.t
31d0: 6d 5f 6d 69 6e 3b 0a 20 20 79 2e 73 20 3d 20 73  m_min;.  y.s = s
31e0: 4c 6f 63 61 6c 2e 74 6d 5f 73 65 63 3b 0a 20 20  Local.tm_sec;.  
31f0: 79 2e 76 61 6c 69 64 59 4d 44 20 3d 20 31 3b 0a  y.validYMD = 1;.
3200: 20 20 79 2e 76 61 6c 69 64 48 4d 53 20 3d 20 31    y.validHMS = 1
3210: 3b 0a 20 20 79 2e 76 61 6c 69 64 4a 44 20 3d 20  ;.  y.validJD = 
3220: 30 3b 0a 20 20 79 2e 76 61 6c 69 64 54 5a 20 3d  0;.  y.validTZ =
3230: 20 30 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28   0;.  computeJD(
3240: 26 79 29 3b 0a 20 20 2a 70 52 63 20 3d 20 53 51  &y);.  *pRc = SQ
3250: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72  LITE_OK;.  retur
3260: 6e 20 79 2e 69 4a 44 20 2d 20 78 2e 69 4a 44 3b  n y.iJD - x.iJD;
3270: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
3280: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49  ITE_OMIT_LOCALTI
3290: 4d 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  ME */../*.** Pro
32a0: 63 65 73 73 20 61 20 6d 6f 64 69 66 69 65 72 20  cess a modifier 
32b0: 74 6f 20 61 20 64 61 74 65 2d 74 69 6d 65 20 73  to a date-time s
32c0: 74 61 6d 70 2e 20 20 54 68 65 20 6d 6f 64 69 66  tamp.  The modif
32d0: 69 65 72 73 20 61 72 65 0a 2a 2a 20 61 73 20 66  iers are.** as f
32e0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
32f0: 20 20 4e 4e 4e 20 64 61 79 73 0a 2a 2a 20 20 20    NNN days.**   
3300: 20 20 4e 4e 4e 20 68 6f 75 72 73 0a 2a 2a 20 20    NNN hours.**  
3310: 20 20 20 4e 4e 4e 20 6d 69 6e 75 74 65 73 0a 2a     NNN minutes.*
3320: 2a 20 20 20 20 20 4e 4e 4e 2e 4e 4e 4e 4e 20 73  *     NNN.NNNN s
3330: 65 63 6f 6e 64 73 0a 2a 2a 20 20 20 20 20 4e 4e  econds.**     NN
3340: 4e 20 6d 6f 6e 74 68 73 0a 2a 2a 20 20 20 20 20  N months.**     
3350: 4e 4e 4e 20 79 65 61 72 73 0a 2a 2a 20 20 20 20  NNN years.**    
3360: 20 73 74 61 72 74 20 6f 66 20 6d 6f 6e 74 68 0a   start of month.
3370: 2a 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66 20  **     start of 
3380: 79 65 61 72 0a 2a 2a 20 20 20 20 20 73 74 61 72  year.**     star
3390: 74 20 6f 66 20 77 65 65 6b 0a 2a 2a 20 20 20 20  t of week.**    
33a0: 20 73 74 61 72 74 20 6f 66 20 64 61 79 0a 2a 2a   start of day.**
33b0: 20 20 20 20 20 77 65 65 6b 64 61 79 20 4e 0a 2a       weekday N.*
33c0: 2a 20 20 20 20 20 75 6e 69 78 65 70 6f 63 68 0a  *     unixepoch.
33d0: 2a 2a 20 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65  **     localtime
33e0: 0a 2a 2a 20 20 20 20 20 75 74 63 0a 2a 2a 0a 2a  .**     utc.**.*
33f0: 2a 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * Return 0 on su
3400: 63 63 65 73 73 20 61 6e 64 20 31 20 69 66 20 74  ccess and 1 if t
3410: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
3420: 20 6f 66 20 65 72 72 6f 72 2e 20 49 66 20 74 68   of error. If th
3430: 65 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20 69 6e  e error.** is in
3440: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 28   a system call (
3450: 69 2e 65 2e 20 6c 6f 63 61 6c 74 69 6d 65 28 29  i.e. localtime()
3460: 29 2c 20 74 68 65 6e 20 61 6e 20 65 72 72 6f 72  ), then an error
3470: 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
3480: 74 65 6e 0a 2a 2a 20 74 6f 20 63 6f 6e 74 65 78  ten.** to contex
3490: 74 20 70 43 74 78 2e 20 49 66 20 74 68 65 20 65  t pCtx. If the e
34a0: 72 72 6f 72 20 69 73 20 61 6e 20 75 6e 72 65 63  rror is an unrec
34b0: 6f 67 6e 69 7a 65 64 20 6d 6f 64 69 66 69 65 72  ognized modifier
34c0: 2c 20 6e 6f 20 65 72 72 6f 72 20 69 73 0a 2a 2a  , no error is.**
34d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 74 78   written to pCtx
34e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34f0: 70 61 72 73 65 4d 6f 64 69 66 69 65 72 28 73 71  parseModifier(sq
3500: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
3510: 43 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Ctx, const char 
3520: 2a 7a 4d 6f 64 2c 20 44 61 74 65 54 69 6d 65 20  *zMod, DateTime 
3530: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
3540: 31 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 64 6f  1;.  int n;.  do
3550: 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 2a  uble r;.  char *
3560: 7a 2c 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 7a  z, zBuf[30];.  z
3570: 20 3d 20 7a 42 75 66 3b 0a 20 20 66 6f 72 28 6e   = zBuf;.  for(n
3580: 3d 30 3b 20 6e 3c 41 72 72 61 79 53 69 7a 65 28  =0; n<ArraySize(
3590: 7a 42 75 66 29 2d 31 20 26 26 20 7a 4d 6f 64 5b  zBuf)-1 && zMod[
35a0: 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 7a 5b  n]; n++){.    z[
35b0: 6e 5d 20 3d 20 28 63 68 61 72 29 73 71 6c 69 74  n] = (char)sqlit
35c0: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28  e3UpperToLower[(
35d0: 75 38 29 7a 4d 6f 64 5b 6e 5d 5d 3b 0a 20 20 7d  u8)zMod[n]];.  }
35e0: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 73  .  z[n] = 0;.  s
35f0: 77 69 74 63 68 28 20 7a 5b 30 5d 20 29 7b 0a 23  witch( z[0] ){.#
3600: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3610: 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 0a 20 20 20  IT_LOCALTIME.   
3620: 20 63 61 73 65 20 27 6c 27 3a 20 7b 0a 20 20 20   case 'l': {.   
3630: 20 20 20 2f 2a 20 20 20 20 6c 6f 63 61 6c 74 69     /*    localti
3640: 6d 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  me.      **.    
3650: 20 20 2a 2a 20 41 73 73 75 6d 69 6e 67 20 74 68    ** Assuming th
3660: 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 76  e current time v
3670: 61 6c 75 65 20 69 73 20 55 54 43 20 28 61 2e 6b  alue is UTC (a.k
3680: 2e 61 2e 20 47 4d 54 29 2c 20 73 68 69 66 74 20  .a. GMT), shift 
3690: 69 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  it to.      ** s
36a0: 68 6f 77 20 6c 6f 63 61 6c 20 74 69 6d 65 2e 0a  how local time..
36b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
36c0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 6c 6f  f( strcmp(z, "lo
36d0: 63 61 6c 74 69 6d 65 22 29 3d 3d 30 20 29 7b 0a  caltime")==0 ){.
36e0: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
36f0: 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  D(p);.        p-
3700: 3e 69 4a 44 20 2b 3d 20 6c 6f 63 61 6c 74 69 6d  >iJD += localtim
3710: 65 4f 66 66 73 65 74 28 70 2c 20 70 43 74 78 2c  eOffset(p, pCtx,
3720: 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 63   &rc);.        c
3730: 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70  learYMD_HMS_TZ(p
3740: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3760: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 27 75  ndif.    case 'u
3770: 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20  ': {.      /*.  
3780: 20 20 20 20 2a 2a 20 20 20 20 75 6e 69 78 65 70      **    unixep
3790: 6f 63 68 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  och.      **.   
37a0: 20 20 20 2a 2a 20 54 72 65 61 74 20 74 68 65 20     ** Treat the 
37b0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
37c0: 20 70 2d 3e 69 4a 44 20 61 73 20 74 68 65 20 6e   p->iJD as the n
37d0: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a  umber of.      *
37e0: 2a 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  * seconds since 
37f0: 31 39 37 30 2e 20 20 43 6f 6e 76 65 72 74 20 74  1970.  Convert t
3800: 6f 20 61 20 72 65 61 6c 20 6a 75 6c 69 61 6e 20  o a real julian 
3810: 64 61 79 20 6e 75 6d 62 65 72 2e 0a 20 20 20 20  day number..    
3820: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
3830: 74 72 63 6d 70 28 7a 2c 20 22 75 6e 69 78 65 70  trcmp(z, "unixep
3840: 6f 63 68 22 29 3d 3d 30 20 26 26 20 70 2d 3e 76  och")==0 && p->v
3850: 61 6c 69 64 4a 44 20 29 7b 0a 20 20 20 20 20 20  alidJD ){.      
3860: 20 20 70 2d 3e 69 4a 44 20 3d 20 28 70 2d 3e 69    p->iJD = (p->i
3870: 4a 44 20 2b 20 34 33 32 30 30 29 2f 38 36 34 30  JD + 43200)/8640
3880: 30 20 2b 20 32 31 30 38 36 36 37 36 2a 28 69 36  0 + 21086676*(i6
3890: 34 29 31 30 30 30 30 30 30 30 3b 0a 20 20 20 20  4)10000000;.    
38a0: 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53      clearYMD_HMS
38b0: 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20  _TZ(p);.        
38c0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  rc = 0;.      }.
38d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
38e0: 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 0a 20 20  MIT_LOCALTIME.  
38f0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 73 74 72      else if( str
3900: 63 6d 70 28 7a 2c 20 22 75 74 63 22 29 3d 3d 30  cmp(z, "utc")==0
3910: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3920: 74 65 33 5f 69 6e 74 36 34 20 63 31 3b 0a 20 20  te3_int64 c1;.  
3930: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28        computeJD(
3940: 70 29 3b 0a 20 20 20 20 20 20 20 20 63 31 20 3d  p);.        c1 =
3950: 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65 74   localtimeOffset
3960: 28 70 2c 20 70 43 74 78 2c 20 26 72 63 29 3b 0a  (p, pCtx, &rc);.
3970: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
3980: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3990: 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2d 3d         p->iJD -=
39a0: 20 63 31 3b 0a 20 20 20 20 20 20 20 20 20 20 63   c1;.          c
39b0: 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70  learYMD_HMS_TZ(p
39c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
39d0: 69 4a 44 20 2b 3d 20 63 31 20 2d 20 6c 6f 63 61  iJD += c1 - loca
39e0: 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 2c 20 70  ltimeOffset(p, p
39f0: 43 74 78 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  Ctx, &rc);.     
3a00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
3a10: 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
3a20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3a30: 27 77 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a  'w': {.      /*.
3a40: 20 20 20 20 20 20 2a 2a 20 20 20 20 77 65 65 6b        **    week
3a50: 64 61 79 20 4e 0a 20 20 20 20 20 20 2a 2a 0a 20  day N.      **. 
3a60: 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65       ** Move the
3a70: 20 64 61 74 65 20 74 6f 20 74 68 65 20 73 61 6d   date to the sam
3a80: 65 20 74 69 6d 65 20 6f 6e 20 74 68 65 20 6e 65  e time on the ne
3a90: 78 74 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66  xt occurrence of
3aa0: 0a 20 20 20 20 20 20 2a 2a 20 77 65 65 6b 64 61  .      ** weekda
3ab0: 79 20 4e 20 77 68 65 72 65 20 30 3d 3d 53 75 6e  y N where 0==Sun
3ac0: 64 61 79 2c 20 31 3d 3d 4d 6f 6e 64 61 79 2c 20  day, 1==Monday, 
3ad0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  and so forth.  I
3ae0: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  f the.      ** d
3af0: 61 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ate is already o
3b00: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
3b10: 65 20 77 65 65 6b 64 61 79 2c 20 74 68 69 73 20  e weekday, this 
3b20: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
3b30: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73    */.      if( s
3b40: 74 72 6e 63 6d 70 28 7a 2c 20 22 77 65 65 6b 64  trncmp(z, "weekd
3b50: 61 79 20 22 2c 20 38 29 3d 3d 30 0a 20 20 20 20  ay ", 8)==0.    
3b60: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
3b70: 6c 69 74 65 33 41 74 6f 46 28 26 7a 5b 38 5d 2c  lite3AtoF(&z[8],
3b80: 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72 6c   &r, sqlite3Strl
3b90: 65 6e 33 30 28 26 7a 5b 38 5d 29 2c 20 53 51 4c  en30(&z[8]), SQL
3ba0: 49 54 45 5f 55 54 46 38 29 0a 20 20 20 20 20 20  ITE_UTF8).      
3bb0: 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 3d 28           && (n=(
3bc0: 69 6e 74 29 72 29 3d 3d 72 20 26 26 20 6e 3e 3d  int)r)==r && n>=
3bd0: 30 20 26 26 20 72 3c 37 20 29 7b 0a 20 20 20 20  0 && r<7 ){.    
3be0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
3bf0: 34 20 5a 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  4 Z;.        com
3c00: 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a  puteYMD_HMS(p);.
3c10: 20 20 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64          p->valid
3c20: 54 5a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  TZ = 0;.        
3c30: 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a  p->validJD = 0;.
3c40: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
3c50: 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20 5a 20  D(p);.        Z 
3c60: 3d 20 28 28 70 2d 3e 69 4a 44 20 2b 20 31 32 39  = ((p->iJD + 129
3c70: 36 30 30 30 30 30 29 2f 38 36 34 30 30 30 30 30  600000)/86400000
3c80: 29 20 25 20 37 3b 0a 20 20 20 20 20 20 20 20 69  ) % 7;.        i
3c90: 66 28 20 5a 3e 6e 20 29 20 5a 20 2d 3d 20 37 3b  f( Z>n ) Z -= 7;
3ca0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20  .        p->iJD 
3cb0: 2b 3d 20 28 6e 20 2d 20 5a 29 2a 38 36 34 30 30  += (n - Z)*86400
3cc0: 30 30 30 3b 0a 20 20 20 20 20 20 20 20 63 6c 65  000;.        cle
3cd0: 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b  arYMD_HMS_TZ(p);
3ce0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b  .        rc = 0;
3cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d10: 63 61 73 65 20 27 73 27 3a 20 7b 0a 20 20 20 20  case 's': {.    
3d20: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    /*.      **   
3d30: 20 73 74 61 72 74 20 6f 66 20 54 54 54 54 54 0a   start of TTTTT.
3d40: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
3d50: 2a 20 4d 6f 76 65 20 74 68 65 20 64 61 74 65 20  * Move the date 
3d60: 62 61 63 6b 77 61 72 64 73 20 74 6f 20 74 68 65  backwards to the
3d70: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
3d80: 65 20 63 75 72 72 65 6e 74 20 64 61 79 2c 0a 20  e current day,. 
3d90: 20 20 20 20 20 2a 2a 20 6f 72 20 6d 6f 6e 74 68       ** or month
3da0: 20 6f 72 20 79 65 61 72 2e 0a 20 20 20 20 20 20   or year..      
3db0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  */.      if( str
3dc0: 6e 63 6d 70 28 7a 2c 20 22 73 74 61 72 74 20 6f  ncmp(z, "start o
3dd0: 66 20 22 2c 20 39 29 21 3d 30 20 29 20 62 72 65  f ", 9)!=0 ) bre
3de0: 61 6b 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 39  ak;.      z += 9
3df0: 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59  ;.      computeY
3e00: 4d 44 28 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  MD(p);.      p->
3e10: 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0a 20 20  validHMS = 1;.  
3e20: 20 20 20 20 70 2d 3e 68 20 3d 20 70 2d 3e 6d 20      p->h = p->m 
3e30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 73 20  = 0;.      p->s 
3e40: 3d 20 30 2e 30 3b 0a 20 20 20 20 20 20 70 2d 3e  = 0.0;.      p->
3e50: 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 20  validTZ = 0;.   
3e60: 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20     p->validJD = 
3e70: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  0;.      if( str
3e80: 63 6d 70 28 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d  cmp(z,"month")==
3e90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
3ea0: 44 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  D = 1;.        r
3eb0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 0;.      }el
3ec0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
3ed0: 22 79 65 61 72 22 29 3d 3d 30 20 29 7b 0a 20 20  "year")==0 ){.  
3ee0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44        computeYMD
3ef0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
3f00: 4d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  M = 1;.        p
3f10: 2d 3e 44 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ->D = 1;.       
3f20: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   rc = 0;.      }
3f30: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
3f40: 7a 2c 22 64 61 79 22 29 3d 3d 30 20 29 7b 0a 20  z,"day")==0 ){. 
3f50: 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
3f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3f70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3f80: 73 65 20 27 2b 27 3a 0a 20 20 20 20 63 61 73 65  se '+':.    case
3f90: 20 27 2d 27 3a 0a 20 20 20 20 63 61 73 65 20 27   '-':.    case '
3fa0: 30 27 3a 0a 20 20 20 20 63 61 73 65 20 27 31 27  0':.    case '1'
3fb0: 3a 0a 20 20 20 20 63 61 73 65 20 27 32 27 3a 0a  :.    case '2':.
3fc0: 20 20 20 20 63 61 73 65 20 27 33 27 3a 0a 20 20      case '3':.  
3fd0: 20 20 63 61 73 65 20 27 34 27 3a 0a 20 20 20 20    case '4':.    
3fe0: 63 61 73 65 20 27 35 27 3a 0a 20 20 20 20 63 61  case '5':.    ca
3ff0: 73 65 20 27 36 27 3a 0a 20 20 20 20 63 61 73 65  se '6':.    case
4000: 20 27 37 27 3a 0a 20 20 20 20 63 61 73 65 20 27   '7':.    case '
4010: 38 27 3a 0a 20 20 20 20 63 61 73 65 20 27 39 27  8':.    case '9'
4020: 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  : {.      double
4030: 20 72 52 6f 75 6e 64 65 72 3b 0a 20 20 20 20 20   rRounder;.     
4040: 20 66 6f 72 28 6e 3d 31 3b 20 7a 5b 6e 5d 20 26   for(n=1; z[n] &
4050: 26 20 7a 5b 6e 5d 21 3d 27 3a 27 20 26 26 20 21  & z[n]!=':' && !
4060: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
4070: 5b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20  [n]); n++){}.   
4080: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 41     if( !sqlite3A
4090: 74 6f 46 28 7a 2c 20 26 72 2c 20 6e 2c 20 53 51  toF(z, &r, n, SQ
40a0: 4c 49 54 45 5f 55 54 46 38 29 20 29 7b 0a 20 20  LITE_UTF8) ){.  
40b0: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
40c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
40d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a     }.      if( z
40e0: 5b 6e 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20  [n]==':' ){.    
40f0: 20 20 20 20 2f 2a 20 41 20 6d 6f 64 69 66 69 65      /* A modifie
4100: 72 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 2b  r of the form (+
4110: 7c 2d 29 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 20  |-)HH:MM:SS.FFF 
4120: 61 64 64 73 20 28 6f 72 20 73 75 62 74 72 61 63  adds (or subtrac
4130: 74 73 29 20 74 68 65 0a 20 20 20 20 20 20 20 20  ts) the.        
4140: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
4150: 62 65 72 20 6f 66 20 68 6f 75 72 73 2c 20 6d 69  ber of hours, mi
4160: 6e 75 74 65 73 2c 20 73 65 63 6f 6e 64 73 2c 20  nutes, seconds, 
4170: 61 6e 64 20 66 72 61 63 74 69 6f 6e 61 6c 20 73  and fractional s
4180: 65 63 6f 6e 64 73 0a 20 20 20 20 20 20 20 20 2a  econds.        *
4190: 2a 20 74 6f 20 74 68 65 20 74 69 6d 65 2e 20 20  * to the time.  
41a0: 54 68 65 20 22 2e 46 46 46 22 20 6d 61 79 20 62  The ".FFF" may b
41b0: 65 20 6f 6d 69 74 74 65 64 2e 20 20 54 68 65 20  e omitted.  The 
41c0: 22 3a 53 53 2e 46 46 46 22 20 6d 61 79 20 62 65  ":SS.FFF" may be
41d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6d 69 74  .        ** omit
41e0: 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
41f0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
4200: 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 20 20  ar *z2 = z;.    
4210: 20 20 20 20 44 61 74 65 54 69 6d 65 20 74 78 3b      DateTime tx;
4220: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4230: 5f 69 6e 74 36 34 20 64 61 79 3b 0a 20 20 20 20  _int64 day;.    
4240: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
4250: 49 73 64 69 67 69 74 28 2a 7a 32 29 20 29 20 7a  Isdigit(*z2) ) z
4260: 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  2++;.        mem
4270: 73 65 74 28 26 74 78 2c 20 30 2c 20 73 69 7a 65  set(&tx, 0, size
4280: 6f 66 28 74 78 29 29 3b 0a 20 20 20 20 20 20 20  of(tx));.       
4290: 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73   if( parseHhMmSs
42a0: 28 7a 32 2c 20 26 74 78 29 20 29 20 62 72 65 61  (z2, &tx) ) brea
42b0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  k;.        compu
42c0: 74 65 4a 44 28 26 74 78 29 3b 0a 20 20 20 20 20  teJD(&tx);.     
42d0: 20 20 20 74 78 2e 69 4a 44 20 2d 3d 20 34 33 32     tx.iJD -= 432
42e0: 30 30 30 30 30 3b 0a 20 20 20 20 20 20 20 20 64  00000;.        d
42f0: 61 79 20 3d 20 74 78 2e 69 4a 44 2f 38 36 34 30  ay = tx.iJD/8640
4300: 30 30 30 30 3b 0a 20 20 20 20 20 20 20 20 74 78  0000;.        tx
4310: 2e 69 4a 44 20 2d 3d 20 64 61 79 2a 38 36 34 30  .iJD -= day*8640
4320: 30 30 30 30 3b 0a 20 20 20 20 20 20 20 20 69 66  0000;.        if
4330: 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 74 78  ( z[0]=='-' ) tx
4340: 2e 69 4a 44 20 3d 20 2d 74 78 2e 69 4a 44 3b 0a  .iJD = -tx.iJD;.
4350: 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a          computeJ
4360: 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  D(p);.        cl
4370: 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29  earYMD_HMS_TZ(p)
4380: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44  ;.        p->iJD
4390: 20 2b 3d 20 74 78 2e 69 4a 44 3b 0a 20 20 20 20   += tx.iJD;.    
43a0: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
43b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
43c0: 20 7d 0a 20 20 20 20 20 20 7a 20 2b 3d 20 6e 3b   }.      z += n;
43d0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
43e0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
43f0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 6e 20   ) z++;.      n 
4400: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
4410: 30 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0(z);.      if( 
4420: 6e 3e 31 30 20 7c 7c 20 6e 3c 33 20 29 20 62 72  n>10 || n<3 ) br
4430: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  eak;.      if( z
4440: 5b 6e 2d 31 5d 3d 3d 27 73 27 20 29 7b 20 7a 5b  [n-1]=='s' ){ z[
4450: 6e 2d 31 5d 20 3d 20 30 3b 20 6e 2d 2d 3b 20 7d  n-1] = 0; n--; }
4460: 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44  .      computeJD
4470: 28 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  (p);.      rc = 
4480: 30 3b 0a 20 20 20 20 20 20 72 52 6f 75 6e 64 65  0;.      rRounde
4490: 72 20 3d 20 72 3c 30 20 3f 20 2d 30 2e 35 20 3a  r = r<0 ? -0.5 :
44a0: 20 2b 30 2e 35 3b 0a 20 20 20 20 20 20 69 66 28   +0.5;.      if(
44b0: 20 6e 3d 3d 33 20 26 26 20 73 74 72 63 6d 70 28   n==3 && strcmp(
44c0: 7a 2c 22 64 61 79 22 29 3d 3d 30 20 29 7b 0a 20  z,"day")==0 ){. 
44d0: 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d         p->iJD +=
44e0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
44f0: 28 72 2a 38 36 34 30 30 30 30 30 2e 30 20 2b 20  (r*86400000.0 + 
4500: 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20 20 20 20  rRounder);.     
4510: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 34 20   }else if( n==4 
4520: 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 68 6f 75  && strcmp(z,"hou
4530: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
4540: 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73 71 6c    p->iJD += (sql
4550: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 28 38  ite3_int64)(r*(8
4560: 36 34 30 30 30 30 30 2e 30 2f 32 34 2e 30 29 20  6400000.0/24.0) 
4570: 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20 20  + rRounder);.   
4580: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d     }else if( n==
4590: 36 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d  6 && strcmp(z,"m
45a0: 69 6e 75 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20  inute")==0 ){.  
45b0: 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20        p->iJD += 
45c0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
45d0: 72 2a 28 38 36 34 30 30 30 30 30 2e 30 2f 28 32  r*(86400000.0/(2
45e0: 34 2e 30 2a 36 30 2e 30 29 29 20 2b 20 72 52 6f  4.0*60.0)) + rRo
45f0: 75 6e 64 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  under);.      }e
4600: 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20 26 26 20  lse if( n==6 && 
4610: 73 74 72 63 6d 70 28 7a 2c 22 73 65 63 6f 6e 64  strcmp(z,"second
4620: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
4630: 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73 71 6c 69   p->iJD += (sqli
4640: 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 28 38 36  te3_int64)(r*(86
4650: 34 30 30 30 30 30 2e 30 2f 28 32 34 2e 30 2a 36  400000.0/(24.0*6
4660: 30 2e 30 2a 36 30 2e 30 29 29 20 2b 20 72 52 6f  0.0*60.0)) + rRo
4670: 75 6e 64 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  under);.      }e
4680: 6c 73 65 20 69 66 28 20 6e 3d 3d 35 20 26 26 20  lse if( n==5 && 
4690: 73 74 72 63 6d 70 28 7a 2c 22 6d 6f 6e 74 68 22  strcmp(z,"month"
46a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
46b0: 69 6e 74 20 78 2c 20 79 3b 0a 20 20 20 20 20 20  int x, y;.      
46c0: 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53    computeYMD_HMS
46d0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
46e0: 4d 20 2b 3d 20 28 69 6e 74 29 72 3b 0a 20 20 20  M += (int)r;.   
46f0: 20 20 20 20 20 78 20 3d 20 70 2d 3e 4d 3e 30 20       x = p->M>0 
4700: 3f 20 28 70 2d 3e 4d 2d 31 29 2f 31 32 20 3a 20  ? (p->M-1)/12 : 
4710: 28 70 2d 3e 4d 2d 31 32 29 2f 31 32 3b 0a 20 20  (p->M-12)/12;.  
4720: 20 20 20 20 20 20 70 2d 3e 59 20 2b 3d 20 78 3b        p->Y += x;
4730: 0a 20 20 20 20 20 20 20 20 70 2d 3e 4d 20 2d 3d  .        p->M -=
4740: 20 78 2a 31 32 3b 0a 20 20 20 20 20 20 20 20 70   x*12;.        p
4750: 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20  ->validJD = 0;. 
4760: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44         computeJD
4770: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 79 20 3d  (p);.        y =
4780: 20 28 69 6e 74 29 72 3b 0a 20 20 20 20 20 20 20   (int)r;.       
4790: 20 69 66 28 20 79 21 3d 72 20 29 7b 0a 20 20 20   if( y!=r ){.   
47a0: 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d         p->iJD +=
47b0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
47c0: 28 28 72 20 2d 20 79 29 2a 33 30 2e 30 2a 38 36  ((r - y)*30.0*86
47d0: 34 30 30 30 30 30 2e 30 20 2b 20 72 52 6f 75 6e  400000.0 + rRoun
47e0: 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  der);.        }.
47f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4800: 6e 3d 3d 34 20 26 26 20 73 74 72 63 6d 70 28 7a  n==4 && strcmp(z
4810: 2c 22 79 65 61 72 22 29 3d 3d 30 20 29 7b 0a 20  ,"year")==0 ){. 
4820: 20 20 20 20 20 20 20 69 6e 74 20 79 20 3d 20 28         int y = (
4830: 69 6e 74 29 72 3b 0a 20 20 20 20 20 20 20 20 63  int)r;.        c
4840: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29  omputeYMD_HMS(p)
4850: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 59 20 2b  ;.        p->Y +
4860: 3d 20 79 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = y;.        p->
4870: 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20  validJD = 0;.   
4880: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
4890: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 79  );.        if( y
48a0: 21 3d 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=r ){.         
48b0: 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73 71 6c 69   p->iJD += (sqli
48c0: 74 65 33 5f 69 6e 74 36 34 29 28 28 72 20 2d 20  te3_int64)((r - 
48d0: 79 29 2a 33 36 35 2e 30 2a 38 36 34 30 30 30 30  y)*365.0*8640000
48e0: 30 2e 30 20 2b 20 72 52 6f 75 6e 64 65 72 29 3b  0.0 + rRounder);
48f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4910: 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
4920: 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48        clearYMD_H
4930: 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20  MS_TZ(p);.      
4940: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4950: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
4960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4980: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
4990: 20 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 20 61   time function a
49a0: 72 67 75 6d 65 6e 74 73 2e 20 20 61 72 67 76 5b  rguments.  argv[
49b0: 30 5d 20 69 73 20 61 20 64 61 74 65 2d 74 69 6d  0] is a date-tim
49c0: 65 20 73 74 61 6d 70 2e 0a 2a 2a 20 61 72 67 76  e stamp..** argv
49d0: 5b 31 5d 20 61 6e 64 20 66 6f 6c 6c 6f 77 69 6e  [1] and followin
49e0: 67 20 61 72 65 20 6d 6f 64 69 66 69 65 72 73 2e  g are modifiers.
49f0: 20 20 50 61 72 73 65 20 74 68 65 6d 20 61 6c 6c    Parse them all
4a00: 20 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 74 68   and write.** th
4a10: 65 20 72 65 73 75 6c 74 69 6e 67 20 74 69 6d 65  e resulting time
4a20: 20 69 6e 74 6f 20 74 68 65 20 44 61 74 65 54 69   into the DateTi
4a30: 6d 65 20 73 74 72 75 63 74 75 72 65 20 70 2e 20  me structure p. 
4a40: 20 52 65 74 75 72 6e 20 30 0a 2a 2a 20 6f 6e 20   Return 0.** on 
4a50: 73 75 63 63 65 73 73 20 61 6e 64 20 31 20 69 66  success and 1 if
4a60: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 65   there are any e
4a70: 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rrors..**.** If 
4a80: 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 70  there are zero p
4a90: 61 72 61 6d 65 74 65 72 73 20 28 69 66 20 65 76  arameters (if ev
4aa0: 65 6e 20 61 72 67 76 5b 30 5d 20 69 73 20 75 6e  en argv[0] is un
4ab0: 64 65 66 69 6e 65 64 29 0a 2a 2a 20 74 68 65 6e  defined).** then
4ac0: 20 61 73 73 75 6d 65 20 61 20 64 65 66 61 75 6c   assume a defaul
4ad0: 74 20 76 61 6c 75 65 20 6f 66 20 22 6e 6f 77 22  t value of "now"
4ae0: 20 66 6f 72 20 61 72 67 76 5b 30 5d 2e 0a 2a 2f   for argv[0]..*/
4af0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 61  .static int isDa
4b00: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  te(.  sqlite3_co
4b10: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
4b20: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20 20  .  int argc, .  
4b30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4b40: 61 72 67 76 2c 20 0a 20 20 44 61 74 65 54 69 6d  argv, .  DateTim
4b50: 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e *p.){.  int i;
4b60: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
4b70: 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74  d char *z;.  int
4b80: 20 65 54 79 70 65 3b 0a 20 20 6d 65 6d 73 65 74   eType;.  memset
4b90: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
4ba0: 29 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  ));.  if( argc==
4bb0: 30 20 29 7b 0a 20 20 20 20 73 65 74 44 61 74 65  0 ){.    setDate
4bc0: 54 69 6d 65 54 6f 43 75 72 72 65 6e 74 28 63 6f  TimeToCurrent(co
4bd0: 6e 74 65 78 74 2c 20 70 29 3b 0a 20 20 7d 65 6c  ntext, p);.  }el
4be0: 73 65 20 69 66 28 20 28 65 54 79 70 65 20 3d 20  se if( (eType = 
4bf0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
4c00: 70 65 28 61 72 67 76 5b 30 5d 29 29 3d 3d 53 51  pe(argv[0]))==SQ
4c10: 4c 49 54 45 5f 46 4c 4f 41 54 0a 20 20 20 20 20  LITE_FLOAT.     
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
4c30: 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
4c40: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 70 2d  NTEGER ){.    p-
4c50: 3e 69 4a 44 20 3d 20 28 73 71 6c 69 74 65 33 5f  >iJD = (sqlite3_
4c60: 69 6e 74 36 34 29 28 73 71 6c 69 74 65 33 5f 76  int64)(sqlite3_v
4c70: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
4c80: 5b 30 5d 29 2a 38 36 34 30 30 30 30 30 2e 30 20  [0])*86400000.0 
4c90: 2b 20 30 2e 35 29 3b 0a 20 20 20 20 70 2d 3e 76  + 0.5);.    p->v
4ca0: 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 20 20 7d 65  alidJD = 1;.  }e
4cb0: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
4cc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
4cd0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
4ce0: 28 20 21 7a 20 7c 7c 20 70 61 72 73 65 44 61 74  ( !z || parseDat
4cf0: 65 4f 72 54 69 6d 65 28 63 6f 6e 74 65 78 74 2c  eOrTime(context,
4d00: 20 28 63 68 61 72 2a 29 7a 2c 20 70 29 20 29 7b   (char*)z, p) ){
4d10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
4d20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
4d30: 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=1; i<argc; i+
4d40: 2b 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  +){.    z = sqli
4d50: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
4d60: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[i]);.    if(
4d70: 20 7a 3d 3d 30 20 7c 7c 20 70 61 72 73 65 4d 6f   z==0 || parseMo
4d80: 64 69 66 69 65 72 28 63 6f 6e 74 65 78 74 2c 20  difier(context, 
4d90: 28 63 68 61 72 2a 29 7a 2c 20 70 29 20 29 20 72  (char*)z, p) ) r
4da0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
4db0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
4dc0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
4dd0: 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
4de0: 65 6e 74 20 74 68 65 20 76 61 72 69 6f 75 73 20  ent the various 
4df0: 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20 66 75  date and time fu
4e00: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  nctions.** of SQ
4e10: 4c 69 74 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  Lite..*/../*.** 
4e20: 20 20 20 6a 75 6c 69 61 6e 64 61 79 28 20 54 49     julianday( TI
4e30: 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d  MESTRING, MOD, M
4e40: 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52  OD, ...).**.** R
4e50: 65 74 75 72 6e 20 74 68 65 20 6a 75 6c 69 61 6e  eturn the julian
4e60: 20 64 61 79 20 6e 75 6d 62 65 72 20 6f 66 20 74   day number of t
4e70: 68 65 20 64 61 74 65 20 73 70 65 63 69 66 69 65  he date specifie
4e80: 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  d in the argumen
4e90: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
4ea0: 64 20 6a 75 6c 69 61 6e 64 61 79 46 75 6e 63 28  d juliandayFunc(
4eb0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
4ec0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
4ed0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
4ee0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
4ef0: 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b  ){.  DateTime x;
4f00: 0a 20 20 69 66 28 20 69 73 44 61 74 65 28 63 6f  .  if( isDate(co
4f10: 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
4f20: 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20  v, &x)==0 ){.   
4f30: 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 29 3b 0a   computeJD(&x);.
4f40: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4f50: 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78  lt_double(contex
4f60: 74 2c 20 78 2e 69 4a 44 2f 38 36 34 30 30 30 30  t, x.iJD/8640000
4f70: 30 2e 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  0.0);.  }.}../*.
4f80: 2a 2a 20 20 20 20 64 61 74 65 74 69 6d 65 28 20  **    datetime( 
4f90: 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c  TIMESTRING, MOD,
4fa0: 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a   MOD, ...).**.**
4fb0: 20 52 65 74 75 72 6e 20 59 59 59 59 2d 4d 4d 2d   Return YYYY-MM-
4fc0: 44 44 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2f 0a 73  DD HH:MM:SS.*/.s
4fd0: 74 61 74 69 63 20 76 6f 69 64 20 64 61 74 65 74  tatic void datet
4fe0: 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  imeFunc(.  sqlit
4ff0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5000: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
5010: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5020: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74   **argv.){.  Dat
5030: 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20 69  eTime x;.  if( i
5040: 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 61  sDate(context, a
5050: 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d  rgc, argv, &x)==
5060: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
5070: 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6d  uf[100];.    com
5080: 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78 29 3b  puteYMD_HMS(&x);
5090: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
50a0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
50b0: 66 29 2c 20 7a 42 75 66 2c 20 22 25 30 34 64 2d  f), zBuf, "%04d-
50c0: 25 30 32 64 2d 25 30 32 64 20 25 30 32 64 3a 25  %02d-%02d %02d:%
50d0: 30 32 64 3a 25 30 32 64 22 2c 0a 20 20 20 20 20  02d:%02d",.     
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 78 2e 59 2c 20 78 2e 4d 2c 20 78 2e 44 2c 20 78  x.Y, x.M, x.D, x
5100: 2e 68 2c 20 78 2e 6d 2c 20 28 69 6e 74 29 28 78  .h, x.m, (int)(x
5110: 2e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  .s));.    sqlite
5120: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
5130: 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c  ntext, zBuf, -1,
5140: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5150: 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  T);.  }.}../*.**
5160: 20 20 20 20 74 69 6d 65 28 20 54 49 4d 45 53 54      time( TIMEST
5170: 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20  RING, MOD, MOD, 
5180: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ...).**.** Retur
5190: 6e 20 48 48 3a 4d 4d 3a 53 53 0a 2a 2f 0a 73 74  n HH:MM:SS.*/.st
51a0: 61 74 69 63 20 76 6f 69 64 20 74 69 6d 65 46 75  atic void timeFu
51b0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
51c0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
51d0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
51e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
51f0: 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65  gv.){.  DateTime
5200: 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61 74 65   x;.  if( isDate
5210: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
5220: 61 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a  argv, &x)==0 ){.
5230: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30      char zBuf[10
5240: 30 5d 3b 0a 20 20 20 20 63 6f 6d 70 75 74 65 48  0];.    computeH
5250: 4d 53 28 26 78 29 3b 0a 20 20 20 20 73 71 6c 69  MS(&x);.    sqli
5260: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
5270: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
5280: 20 22 25 30 32 64 3a 25 30 32 64 3a 25 30 32 64   "%02d:%02d:%02d
5290: 22 2c 20 78 2e 68 2c 20 78 2e 6d 2c 20 28 69 6e  ", x.h, x.m, (in
52a0: 74 29 78 2e 73 29 3b 0a 20 20 20 20 73 71 6c 69  t)x.s);.    sqli
52b0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
52c0: 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d  context, zBuf, -
52d0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
52e0: 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ENT);.  }.}../*.
52f0: 2a 2a 20 20 20 20 64 61 74 65 28 20 54 49 4d 45  **    date( TIME
5300: 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44  STRING, MOD, MOD
5310: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74  , ...).**.** Ret
5320: 75 72 6e 20 59 59 59 59 2d 4d 4d 2d 44 44 0a 2a  urn YYYY-MM-DD.*
5330: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 61  /.static void da
5340: 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  teFunc(.  sqlite
5350: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
5360: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
5370: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
5380: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74 65  **argv.){.  Date
5390: 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20 69 73  Time x;.  if( is
53a0: 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  Date(context, ar
53b0: 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d 30  gc, argv, &x)==0
53c0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
53d0: 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6d 70  f[100];.    comp
53e0: 75 74 65 59 4d 44 28 26 78 29 3b 0a 20 20 20 20  uteYMD(&x);.    
53f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
5400: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
5410: 42 75 66 2c 20 22 25 30 34 64 2d 25 30 32 64 2d  Buf, "%04d-%02d-
5420: 25 30 32 64 22 2c 20 78 2e 59 2c 20 78 2e 4d 2c  %02d", x.Y, x.M,
5430: 20 78 2e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74   x.D);.    sqlit
5440: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5450: 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31  ontext, zBuf, -1
5460: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5470: 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  NT);.  }.}../*.*
5480: 2a 20 20 20 20 73 74 72 66 74 69 6d 65 28 20 46  *    strftime( F
5490: 4f 52 4d 41 54 2c 20 54 49 4d 45 53 54 52 49 4e  ORMAT, TIMESTRIN
54a0: 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e  G, MOD, MOD, ...
54b0: 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ).**.** Return a
54c0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 65   string describe
54d0: 64 20 62 79 20 46 4f 52 4d 41 54 2e 20 20 43 6f  d by FORMAT.  Co
54e0: 6e 76 65 72 73 69 6f 6e 73 20 61 73 20 66 6f 6c  nversions as fol
54f0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25 64  lows:.**.**   %d
5500: 20 20 64 61 79 20 6f 66 20 6d 6f 6e 74 68 0a 2a    day of month.*
5510: 2a 20 20 20 25 66 20 20 2a 2a 20 66 72 61 63 74  *   %f  ** fract
5520: 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 20 20 53  ional seconds  S
5530: 53 2e 53 53 53 0a 2a 2a 20 20 20 25 48 20 20 68  S.SSS.**   %H  h
5540: 6f 75 72 20 30 30 2d 32 34 0a 2a 2a 20 20 20 25  our 00-24.**   %
5550: 6a 20 20 64 61 79 20 6f 66 20 79 65 61 72 20 30  j  day of year 0
5560: 30 30 2d 33 36 36 0a 2a 2a 20 20 20 25 4a 20 20  00-366.**   %J  
5570: 2a 2a 20 4a 75 6c 69 61 6e 20 64 61 79 20 6e 75  ** Julian day nu
5580: 6d 62 65 72 0a 2a 2a 20 20 20 25 6d 20 20 6d 6f  mber.**   %m  mo
5590: 6e 74 68 20 30 31 2d 31 32 0a 2a 2a 20 20 20 25  nth 01-12.**   %
55a0: 4d 20 20 6d 69 6e 75 74 65 20 30 30 2d 35 39 0a  M  minute 00-59.
55b0: 2a 2a 20 20 20 25 73 20 20 73 65 63 6f 6e 64 73  **   %s  seconds
55c0: 20 73 69 6e 63 65 20 31 39 37 30 2d 30 31 2d 30   since 1970-01-0
55d0: 31 0a 2a 2a 20 20 20 25 53 20 20 73 65 63 6f 6e  1.**   %S  secon
55e0: 64 73 20 30 30 2d 35 39 0a 2a 2a 20 20 20 25 77  ds 00-59.**   %w
55f0: 20 20 64 61 79 20 6f 66 20 77 65 65 6b 20 30 2d    day of week 0-
5600: 36 20 20 73 75 6e 64 61 79 3d 3d 30 0a 2a 2a 20  6  sunday==0.** 
5610: 20 20 25 57 20 20 77 65 65 6b 20 6f 66 20 79 65    %W  week of ye
5620: 61 72 20 30 30 2d 35 33 0a 2a 2a 20 20 20 25 59  ar 00-53.**   %Y
5630: 20 20 79 65 61 72 20 30 30 30 30 2d 39 39 39 39    year 0000-9999
5640: 0a 2a 2a 20 20 20 25 25 20 20 25 0a 2a 2f 0a 73  .**   %%  %.*/.s
5650: 74 61 74 69 63 20 76 6f 69 64 20 73 74 72 66 74  tatic void strft
5660: 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  imeFunc(.  sqlit
5670: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5680: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
5690: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
56a0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74   **argv.){.  Dat
56b0: 65 54 69 6d 65 20 78 3b 0a 20 20 75 36 34 20 6e  eTime x;.  u64 n
56c0: 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 6a 3b 0a  ;.  size_t i,j;.
56d0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 71 6c    char *z;.  sql
56e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
56f0: 74 20 63 68 61 72 20 2a 7a 46 6d 74 20 3d 20 28  t char *zFmt = (
5700: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
5710: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5720: 72 67 76 5b 30 5d 29 3b 0a 20 20 63 68 61 72 20  rgv[0]);.  char 
5730: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66 28  zBuf[100];.  if(
5740: 20 7a 46 6d 74 3d 3d 30 20 7c 7c 20 69 73 44 61   zFmt==0 || isDa
5750: 74 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  te(context, argc
5760: 2d 31 2c 20 61 72 67 76 2b 31 2c 20 26 78 29 20  -1, argv+1, &x) 
5770: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
5780: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
5790: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
57a0: 78 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  xt);.  for(i=0, 
57b0: 6e 3d 31 3b 20 7a 46 6d 74 5b 69 5d 3b 20 69 2b  n=1; zFmt[i]; i+
57c0: 2b 2c 20 6e 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, n++){.    if(
57d0: 20 7a 46 6d 74 5b 69 5d 3d 3d 27 25 27 20 29 7b   zFmt[i]=='%' ){
57e0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 7a  .      switch( z
57f0: 46 6d 74 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20  Fmt[i+1] ){.    
5800: 20 20 20 20 63 61 73 65 20 27 64 27 3a 0a 20 20      case 'd':.  
5810: 20 20 20 20 20 20 63 61 73 65 20 27 48 27 3a 0a        case 'H':.
5820: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 6d 27          case 'm'
5830: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  :.        case '
5840: 4d 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  M':.        case
5850: 20 27 53 27 3a 0a 20 20 20 20 20 20 20 20 63 61   'S':.        ca
5860: 73 65 20 27 57 27 3a 0a 20 20 20 20 20 20 20 20  se 'W':.        
5870: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    n++;.         
5880: 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f   /* fall thru */
5890: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 77  .        case 'w
58a0: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
58b0: 27 25 27 3a 0a 20 20 20 20 20 20 20 20 20 20 62  '%':.          b
58c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
58d0: 73 65 20 27 66 27 3a 0a 20 20 20 20 20 20 20 20  se 'f':.        
58e0: 20 20 6e 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20    n += 8;.      
58f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5900: 20 20 20 63 61 73 65 20 27 6a 27 3a 0a 20 20 20     case 'j':.   
5910: 20 20 20 20 20 20 20 6e 20 2b 3d 20 33 3b 0a 20         n += 3;. 
5920: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5930: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 59 27          case 'Y'
5940: 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d  :.          n +=
5950: 20 38 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   8;.          br
5960: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
5970: 65 20 27 73 27 3a 0a 20 20 20 20 20 20 20 20 63  e 's':.        c
5980: 61 73 65 20 27 4a 27 3a 0a 20 20 20 20 20 20 20  ase 'J':.       
5990: 20 20 20 6e 20 2b 3d 20 35 30 3b 0a 20 20 20 20     n += 50;.    
59a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
59b0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
59c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20          return; 
59d0: 20 2f 2a 20 45 52 52 4f 52 2e 20 20 72 65 74 75   /* ERROR.  retu
59e0: 72 6e 20 61 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20  rn a NULL */.   
59f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 2b 2b 3b 0a     }.      i++;.
5a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 65 73 74      }.  }.  test
5a10: 63 61 73 65 28 20 6e 3d 3d 73 69 7a 65 6f 66 28  case( n==sizeof(
5a20: 7a 42 75 66 29 2d 31 20 29 3b 0a 20 20 74 65 73  zBuf)-1 );.  tes
5a30: 74 63 61 73 65 28 20 6e 3d 3d 73 69 7a 65 6f 66  tcase( n==sizeof
5a40: 28 7a 42 75 66 29 20 29 3b 0a 20 20 74 65 73 74  (zBuf) );.  test
5a50: 63 61 73 65 28 20 6e 3d 3d 28 75 36 34 29 64 62  case( n==(u64)db
5a60: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
5a70: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 2b 31 20  LIMIT_LENGTH]+1 
5a80: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
5a90: 3d 3d 28 75 36 34 29 64 62 2d 3e 61 4c 69 6d 69  ==(u64)db->aLimi
5aa0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
5ab0: 45 4e 47 54 48 5d 20 29 3b 0a 20 20 69 66 28 20  ENGTH] );.  if( 
5ac0: 6e 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 20 29  n<sizeof(zBuf) )
5ad0: 7b 0a 20 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a  {.    z = zBuf;.
5ae0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 28 75    }else if( n>(u
5af0: 36 34 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  64)db->aLimit[SQ
5b00: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
5b10: 48 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  H] ){.    sqlite
5b20: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 74  3_result_error_t
5b30: 6f 6f 62 69 67 28 63 6f 6e 74 65 78 74 29 3b 0a  oobig(context);.
5b40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
5b50: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
5b60: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
5b70: 64 62 2c 20 28 69 6e 74 29 6e 29 3b 0a 20 20 20  db, (int)n);.   
5b80: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
5b90: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5ba0: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
5bb0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 72 65  ntext);.      re
5bc0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
5bd0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 29 3b    computeJD(&x);
5be0: 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d  .  computeYMD_HM
5bf0: 53 28 26 78 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  S(&x);.  for(i=j
5c00: 3d 30 3b 20 7a 46 6d 74 5b 69 5d 3b 20 69 2b 2b  =0; zFmt[i]; i++
5c10: 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6d 74 5b  ){.    if( zFmt[
5c20: 69 5d 21 3d 27 25 27 20 29 7b 0a 20 20 20 20 20  i]!='%' ){.     
5c30: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 46 6d 74 5b 69   z[j++] = zFmt[i
5c40: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
5c50: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 73      i++;.      s
5c60: 77 69 74 63 68 28 20 7a 46 6d 74 5b 69 5d 20 29  witch( zFmt[i] )
5c70: 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  {.        case '
5c80: 64 27 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  d':  sqlite3_snp
5c90: 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22  rintf(3, &z[j],"
5ca0: 25 30 32 64 22 2c 78 2e 44 29 3b 20 6a 2b 3d 32  %02d",x.D); j+=2
5cb0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
5cc0: 20 63 61 73 65 20 27 66 27 3a 20 7b 0a 20 20 20   case 'f': {.   
5cd0: 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 73 20         double s 
5ce0: 3d 20 78 2e 73 3b 0a 20 20 20 20 20 20 20 20 20  = x.s;.         
5cf0: 20 69 66 28 20 73 3e 35 39 2e 39 39 39 20 29 20   if( s>59.999 ) 
5d00: 73 20 3d 20 35 39 2e 39 39 39 3b 0a 20 20 20 20  s = 59.999;.    
5d10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
5d20: 70 72 69 6e 74 66 28 37 2c 20 26 7a 5b 6a 5d 2c  printf(7, &z[j],
5d30: 22 25 30 36 2e 33 66 22 2c 20 73 29 3b 0a 20 20  "%06.3f", s);.  
5d40: 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 73 71 6c          j += sql
5d50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 5b  ite3Strlen30(&z[
5d60: 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  j]);.          b
5d70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5d80: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 48 27          case 'H'
5d90: 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  :  sqlite3_snpri
5da0: 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30  ntf(3, &z[j],"%0
5db0: 32 64 22 2c 78 2e 68 29 3b 20 6a 2b 3d 32 3b 20  2d",x.h); j+=2; 
5dc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
5dd0: 61 73 65 20 27 57 27 3a 20 2f 2a 20 46 61 6c 6c  ase 'W': /* Fall
5de0: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20   thru */.       
5df0: 20 63 61 73 65 20 27 6a 27 3a 20 7b 0a 20 20 20   case 'j': {.   
5e00: 20 20 20 20 20 20 20 69 6e 74 20 6e 44 61 79 3b         int nDay;
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e20: 4e 75 6d 62 65 72 20 6f 66 20 64 61 79 73 20 73  Number of days s
5e30: 69 6e 63 65 20 31 73 74 20 64 61 79 20 6f 66 20  ince 1st day of 
5e40: 79 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  year */.        
5e50: 20 20 44 61 74 65 54 69 6d 65 20 79 20 3d 20 78    DateTime y = x
5e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 79 2e 76 61  ;.          y.va
5e70: 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20  lidJD = 0;.     
5e80: 20 20 20 20 20 79 2e 4d 20 3d 20 31 3b 0a 20 20       y.M = 1;.  
5e90: 20 20 20 20 20 20 20 20 79 2e 44 20 3d 20 31 3b          y.D = 1;
5ea0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75  .          compu
5eb0: 74 65 4a 44 28 26 79 29 3b 0a 20 20 20 20 20 20  teJD(&y);.      
5ec0: 20 20 20 20 6e 44 61 79 20 3d 20 28 69 6e 74 29      nDay = (int)
5ed0: 28 28 78 2e 69 4a 44 2d 79 2e 69 4a 44 2b 34 33  ((x.iJD-y.iJD+43
5ee0: 32 30 30 30 30 30 29 2f 38 36 34 30 30 30 30 30  200000)/86400000
5ef0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
5f00: 20 7a 46 6d 74 5b 69 5d 3d 3d 27 57 27 20 29 7b   zFmt[i]=='W' ){
5f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
5f20: 20 77 64 3b 20 20 20 2f 2a 20 30 3d 4d 6f 6e 64   wd;   /* 0=Mond
5f30: 61 79 2c 20 31 3d 54 75 65 73 64 61 79 2c 20 2e  ay, 1=Tuesday, .
5f40: 2e 2e 20 36 3d 53 75 6e 64 61 79 20 2a 2f 0a 20  .. 6=Sunday */. 
5f50: 20 20 20 20 20 20 20 20 20 20 20 77 64 20 3d 20             wd = 
5f60: 28 69 6e 74 29 28 28 28 78 2e 69 4a 44 2b 34 33  (int)(((x.iJD+43
5f70: 32 30 30 30 30 30 29 2f 38 36 34 30 30 30 30 30  200000)/86400000
5f80: 29 25 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )%7);.          
5f90: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
5fa0: 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32  tf(3, &z[j],"%02
5fb0: 64 22 2c 28 6e 44 61 79 2b 37 2d 77 64 29 2f 37  d",(nDay+7-wd)/7
5fc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
5fd0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
5fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5ff0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6000: 69 6e 74 66 28 34 2c 20 26 7a 5b 6a 5d 2c 22 25  intf(4, &z[j],"%
6010: 30 33 64 22 2c 6e 44 61 79 2b 31 29 3b 0a 20 20  03d",nDay+1);.  
6020: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 33            j += 3
6030: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6040: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6060: 20 63 61 73 65 20 27 4a 27 3a 20 7b 0a 20 20 20   case 'J': {.   
6070: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6080: 6e 70 72 69 6e 74 66 28 32 30 2c 20 26 7a 5b 6a  nprintf(20, &z[j
6090: 5d 2c 22 25 2e 31 36 67 22 2c 78 2e 69 4a 44 2f  ],"%.16g",x.iJD/
60a0: 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 20  86400000.0);.   
60b0: 20 20 20 20 20 20 20 6a 2b 3d 73 71 6c 69 74 65         j+=sqlite
60c0: 33 53 74 72 6c 65 6e 33 30 28 26 7a 5b 6a 5d 29  3Strlen30(&z[j])
60d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
60e0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
60f0: 20 20 20 20 20 63 61 73 65 20 27 6d 27 3a 20 20       case 'm':  
6100: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6110: 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22  (3, &z[j],"%02d"
6120: 2c 78 2e 4d 29 3b 20 6a 2b 3d 32 3b 20 62 72 65  ,x.M); j+=2; bre
6130: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
6140: 20 27 4d 27 3a 20 20 73 71 6c 69 74 65 33 5f 73   'M':  sqlite3_s
6150: 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d  nprintf(3, &z[j]
6160: 2c 22 25 30 32 64 22 2c 78 2e 6d 29 3b 20 6a 2b  ,"%02d",x.m); j+
6170: 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  =2; break;.     
6180: 20 20 20 63 61 73 65 20 27 73 27 3a 20 7b 0a 20     case 's': {. 
6190: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
61a0: 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 26 7a 5b  _snprintf(30,&z[
61b0: 6a 5d 2c 22 25 6c 6c 64 22 2c 0a 20 20 20 20 20  j],"%lld",.     
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 20 20 20 20 20 28 69 36 34 29 28 78 2e 69 4a        (i64)(x.iJ
61e0: 44 2f 31 30 30 30 20 2d 20 32 31 30 38 36 36 37  D/1000 - 2108667
61f0: 36 2a 28 69 36 34 29 31 30 30 30 30 29 29 3b 0a  6*(i64)10000));.
6200: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 73            j += s
6210: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
6220: 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[j]);.         
6230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6240: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  }.        case '
6250: 53 27 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  S':  sqlite3_snp
6260: 72 69 6e 74 66 28 33 2c 26 7a 5b 6a 5d 2c 22 25  rintf(3,&z[j],"%
6270: 30 32 64 22 2c 28 69 6e 74 29 78 2e 73 29 3b 20  02d",(int)x.s); 
6280: 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20  j+=2; break;.   
6290: 20 20 20 20 20 63 61 73 65 20 27 77 27 3a 20 7b       case 'w': {
62a0: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
62b0: 5d 20 3d 20 28 63 68 61 72 29 28 28 28 78 2e 69  ] = (char)(((x.i
62c0: 4a 44 2b 31 32 39 36 30 30 30 30 30 29 2f 38 36  JD+129600000)/86
62d0: 34 30 30 30 30 30 29 20 25 20 37 29 20 2b 20 27  400000) % 7) + '
62e0: 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0';.          br
62f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
6300: 20 20 20 20 20 20 20 63 61 73 65 20 27 59 27 3a         case 'Y':
6310: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   {.          sql
6320: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 2c  ite3_snprintf(5,
6330: 26 7a 5b 6a 5d 2c 22 25 30 34 64 22 2c 78 2e 59  &z[j],"%04d",x.Y
6340: 29 3b 20 6a 2b 3d 73 71 6c 69 74 65 33 53 74 72  ); j+=sqlite3Str
6350: 6c 65 6e 33 30 28 26 7a 5b 6a 5d 29 3b 0a 20 20  len30(&z[j]);.  
6360: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
6370: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6380: 20 64 65 66 61 75 6c 74 3a 20 20 20 7a 5b 6a 2b   default:   z[j+
6390: 2b 5d 20 3d 20 27 25 27 3b 20 62 72 65 61 6b 3b  +] = '%'; break;
63a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
63b0: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20   }.  z[j] = 0;. 
63c0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
63d0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 2c  text(context, z,
63e0: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   -1,.           
63f0: 20 20 20 20 20 20 20 20 20 20 20 7a 3d 3d 7a 42             z==zB
6400: 75 66 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e  uf ? SQLITE_TRAN
6410: 53 49 45 4e 54 20 3a 20 53 51 4c 49 54 45 5f 44  SIENT : SQLITE_D
6420: 59 4e 41 4d 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  YNAMIC);.}../*.*
6430: 2a 20 63 75 72 72 65 6e 74 5f 74 69 6d 65 28 29  * current_time()
6440: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6450: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
6460: 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74   same value as t
6470: 69 6d 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73  ime('now')..*/.s
6480: 74 61 74 69 63 20 76 6f 69 64 20 63 74 69 6d 65  tatic void ctime
6490: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
64a0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
64b0: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
64c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
64d0: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
64e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
64f0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
6500: 73 65 64 32 29 3b 0a 20 20 74 69 6d 65 46 75 6e  sed2);.  timeFun
6510: 63 28 63 6f 6e 74 65 78 74 2c 20 30 2c 20 30 29  c(context, 0, 0)
6520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72 72 65  ;.}../*.** curre
6530: 6e 74 5f 64 61 74 65 28 29 0a 2a 2a 0a 2a 2a 20  nt_date().**.** 
6540: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
6550: 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 20 76  turns the same v
6560: 61 6c 75 65 20 61 73 20 64 61 74 65 28 27 6e 6f  alue as date('no
6570: 77 27 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  w')..*/.static v
6580: 6f 69 64 20 63 64 61 74 65 46 75 6e 63 28 0a 20  oid cdateFunc(. 
6590: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
65a0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
65b0: 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69   NotUsed,.  sqli
65c0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55  te3_value **NotU
65d0: 73 65 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44  sed2.){.  UNUSED
65e0: 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
65f0: 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
6600: 20 20 64 61 74 65 46 75 6e 63 28 63 6f 6e 74 65    dateFunc(conte
6610: 78 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  xt, 0, 0);.}../*
6620: 0a 2a 2a 20 63 75 72 72 65 6e 74 5f 74 69 6d 65  .** current_time
6630: 73 74 61 6d 70 28 29 0a 2a 2a 0a 2a 2a 20 54 68  stamp().**.** Th
6640: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
6650: 72 6e 73 20 74 68 65 20 73 61 6d 65 20 76 61 6c  rns the same val
6660: 75 65 20 61 73 20 64 61 74 65 74 69 6d 65 28 27  ue as datetime('
6670: 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  now')..*/.static
6680: 20 76 6f 69 64 20 63 74 69 6d 65 73 74 61 6d 70   void ctimestamp
6690: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
66a0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
66b0: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
66c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
66d0: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
66e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
66f0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
6700: 73 65 64 32 29 3b 0a 20 20 64 61 74 65 74 69 6d  sed2);.  datetim
6710: 65 46 75 6e 63 28 63 6f 6e 74 65 78 74 2c 20 30  eFunc(context, 0
6720: 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  , 0);.}.#endif /
6730: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
6740: 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f  E_OMIT_DATETIME_
6750: 46 55 4e 43 53 29 20 2a 2f 0a 0a 23 69 66 64 65  FUNCS) */..#ifde
6760: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41  f SQLITE_OMIT_DA
6770: 54 45 54 49 4d 45 5f 46 55 4e 43 53 0a 2f 2a 0a  TETIME_FUNCS./*.
6780: 2a 2a 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  ** If the librar
6790: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  y is compiled to
67a0: 20 6f 6d 69 74 20 74 68 65 20 66 75 6c 6c 2d 73   omit the full-s
67b0: 63 61 6c 65 20 64 61 74 65 20 61 6e 64 20 74 69  cale date and ti
67c0: 6d 65 0a 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 28  me.** handling (
67d0: 74 6f 20 67 65 74 20 61 20 73 6d 61 6c 6c 65 72  to get a smaller
67e0: 20 62 69 6e 61 72 79 29 2c 20 74 68 65 20 66 6f   binary), the fo
67f0: 6c 6c 6f 77 69 6e 67 20 6d 69 6e 69 6d 61 6c 20  llowing minimal 
6800: 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  version.** of th
6810: 65 20 66 75 6e 63 74 69 6f 6e 73 20 63 75 72 72  e functions curr
6820: 65 6e 74 5f 74 69 6d 65 28 29 2c 20 63 75 72 72  ent_time(), curr
6830: 65 6e 74 5f 64 61 74 65 28 29 20 61 6e 64 20 63  ent_date() and c
6840: 75 72 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70  urrent_timestamp
6850: 28 29 0a 2a 2a 20 61 72 65 20 69 6e 63 6c 75 64  ().** are includ
6860: 65 64 20 69 6e 73 74 65 61 64 2e 20 54 68 69 73  ed instead. This
6870: 20 69 73 20 74 6f 20 73 75 70 70 6f 72 74 20 63   is to support c
6880: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
6890: 6e 73 20 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75  ns that.** inclu
68a0: 64 65 20 22 44 45 46 41 55 4c 54 20 43 55 52 52  de "DEFAULT CURR
68b0: 45 4e 54 5f 54 49 4d 45 22 20 65 74 63 2e 0a 2a  ENT_TIME" etc..*
68c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
68d0: 6f 6e 20 75 73 65 73 20 74 68 65 20 43 2d 6c 69  on uses the C-li
68e0: 62 72 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20  brary functions 
68f0: 74 69 6d 65 28 29 2c 20 67 6d 74 69 6d 65 28 29  time(), gmtime()
6900: 0a 2a 2a 20 61 6e 64 20 73 74 72 66 74 69 6d 65  .** and strftime
6910: 28 29 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 73  (). The format s
6920: 74 72 69 6e 67 20 74 6f 20 70 61 73 73 20 74 6f  tring to pass to
6930: 20 73 74 72 66 74 69 6d 65 28 29 20 69 73 20 73   strftime() is s
6940: 75 70 70 6c 69 65 64 0a 2a 2a 20 61 73 20 74 68  upplied.** as th
6950: 65 20 75 73 65 72 2d 64 61 74 61 20 66 6f 72 20  e user-data for 
6960: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  the function..*/
6970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 75 72  .static void cur
6980: 72 65 6e 74 54 69 6d 65 46 75 6e 63 28 0a 20 20  rentTimeFunc(.  
6990: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
69a0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
69b0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
69c0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
69d0: 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 63 68    time_t t;.  ch
69e0: 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 28 63  ar *zFormat = (c
69f0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  har *)sqlite3_us
6a00: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
6a10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
6a20: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
6a30: 20 69 54 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   iT;.  char zBuf
6a40: 5b 32 30 5d 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  [20];..  UNUSED_
6a50: 50 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b  PARAMETER(argc);
6a60: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6a70: 54 45 52 28 61 72 67 76 29 3b 0a 0a 20 20 64 62  TER(argv);..  db
6a80: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
6a90: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
6aa0: 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  text);.  sqlite3
6ab0: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  OsCurrentTimeInt
6ac0: 36 34 28 64 62 2d 3e 70 56 66 73 2c 20 26 69 54  64(db->pVfs, &iT
6ad0: 29 3b 0a 20 20 74 20 3d 20 69 54 2f 31 30 30 30  );.  t = iT/1000
6ae0: 20 2d 20 31 30 30 30 30 2a 28 73 71 6c 69 74 65   - 10000*(sqlite
6af0: 33 5f 69 6e 74 36 34 29 32 31 30 38 36 36 37 36  3_int64)21086676
6b00: 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 4d  ;.#ifdef HAVE_GM
6b10: 54 49 4d 45 5f 52 0a 20 20 7b 0a 20 20 20 20 73  TIME_R.  {.    s
6b20: 74 72 75 63 74 20 74 6d 20 73 4e 6f 77 3b 0a 20  truct tm sNow;. 
6b30: 20 20 20 67 6d 74 69 6d 65 5f 72 28 26 74 2c 20     gmtime_r(&t, 
6b40: 26 73 4e 6f 77 29 3b 0a 20 20 20 20 73 74 72 66  &sNow);.    strf
6b50: 74 69 6d 65 28 7a 42 75 66 2c 20 32 30 2c 20 7a  time(zBuf, 20, z
6b60: 46 6f 72 6d 61 74 2c 20 26 73 4e 6f 77 29 3b 0a  Format, &sNow);.
6b70: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
6b80: 20 20 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d    struct tm *pTm
6b90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
6ba0: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
6bb0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
6bc0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
6bd0: 4d 41 53 54 45 52 29 29 3b 0a 20 20 20 20 70 54  MASTER));.    pT
6be0: 6d 20 3d 20 67 6d 74 69 6d 65 28 26 74 29 3b 0a  m = gmtime(&t);.
6bf0: 20 20 20 20 73 74 72 66 74 69 6d 65 28 7a 42 75      strftime(zBu
6c00: 66 2c 20 32 30 2c 20 7a 46 6f 72 6d 61 74 2c 20  f, 20, zFormat, 
6c10: 70 54 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pTm);.    sqlite
6c20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
6c30: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
6c40: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6c50: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 20 20  TIC_MASTER));.  
6c60: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
6c70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
6c80: 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d  context, zBuf, -
6c90: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
6ca0: 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ENT);.}.#endif..
6cb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
6cc0: 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 61  ion registered a
6cd0: 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
6ce0: 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 53  C functions as S
6cf0: 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e  QL.** functions.
6d00: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
6d10: 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e   the only routin
6d20: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 77  e in this file w
6d30: 69 74 68 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20  ith.** external 
6d40: 6c 69 6e 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  linkage..*/.void
6d50: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
6d60: 44 61 74 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e  DateTimeFunction
6d70: 73 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  s(void){.  stati
6d80: 63 20 53 51 4c 49 54 45 5f 57 53 44 20 46 75 6e  c SQLITE_WSD Fun
6d90: 63 44 65 66 20 61 44 61 74 65 54 69 6d 65 46 75  cDef aDateTimeFu
6da0: 6e 63 73 5b 5d 20 3d 20 7b 0a 23 69 66 6e 64 65  ncs[] = {.#ifnde
6db0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41  f SQLITE_OMIT_DA
6dc0: 54 45 54 49 4d 45 5f 46 55 4e 43 53 0a 20 20 20  TETIME_FUNCS.   
6dd0: 20 46 55 4e 43 54 49 4f 4e 28 6a 75 6c 69 61 6e   FUNCTION(julian
6de0: 64 61 79 2c 20 20 20 20 20 20 20 20 2d 31 2c 20  day,        -1, 
6df0: 30 2c 20 30 2c 20 6a 75 6c 69 61 6e 64 61 79 46  0, 0, juliandayF
6e00: 75 6e 63 20 29 2c 0a 20 20 20 20 46 55 4e 43 54  unc ),.    FUNCT
6e10: 49 4f 4e 28 64 61 74 65 2c 20 20 20 20 20 20 20  ION(date,       
6e20: 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20        -1, 0, 0, 
6e30: 64 61 74 65 46 75 6e 63 20 20 20 20 20 20 29 2c  dateFunc      ),
6e40: 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 74 69  .    FUNCTION(ti
6e50: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
6e60: 2d 31 2c 20 30 2c 20 30 2c 20 74 69 6d 65 46 75  -1, 0, 0, timeFu
6e70: 6e 63 20 20 20 20 20 20 29 2c 0a 20 20 20 20 46  nc      ),.    F
6e80: 55 4e 43 54 49 4f 4e 28 64 61 74 65 74 69 6d 65  UNCTION(datetime
6e90: 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c  ,         -1, 0,
6ea0: 20 30 2c 20 64 61 74 65 74 69 6d 65 46 75 6e 63   0, datetimeFunc
6eb0: 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f    ),.    FUNCTIO
6ec0: 4e 28 73 74 72 66 74 69 6d 65 2c 20 20 20 20 20  N(strftime,     
6ed0: 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 73 74      -1, 0, 0, st
6ee0: 72 66 74 69 6d 65 46 75 6e 63 20 20 29 2c 0a 20  rftimeFunc  ),. 
6ef0: 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 75 72 72     FUNCTION(curr
6f00: 65 6e 74 5f 74 69 6d 65 2c 20 20 20 20 20 20 30  ent_time,      0
6f10: 2c 20 30 2c 20 30 2c 20 63 74 69 6d 65 46 75 6e  , 0, 0, ctimeFun
6f20: 63 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e  c     ),.    FUN
6f30: 43 54 49 4f 4e 28 63 75 72 72 65 6e 74 5f 74 69  CTION(current_ti
6f40: 6d 65 73 74 61 6d 70 2c 20 30 2c 20 30 2c 20 30  mestamp, 0, 0, 0
6f50: 2c 20 63 74 69 6d 65 73 74 61 6d 70 46 75 6e 63  , ctimestampFunc
6f60: 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28  ),.    FUNCTION(
6f70: 63 75 72 72 65 6e 74 5f 64 61 74 65 2c 20 20 20  current_date,   
6f80: 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 64 61 74     0, 0, 0, cdat
6f90: 65 46 75 6e 63 20 20 20 20 20 29 2c 0a 23 65 6c  eFunc     ),.#el
6fa0: 73 65 0a 20 20 20 20 53 54 52 5f 46 55 4e 43 54  se.    STR_FUNCT
6fb0: 49 4f 4e 28 63 75 72 72 65 6e 74 5f 74 69 6d 65  ION(current_time
6fc0: 2c 20 20 20 20 20 20 30 2c 20 22 25 48 3a 25 4d  ,      0, "%H:%M
6fd0: 3a 25 53 22 2c 20 20 20 20 20 20 20 20 20 20 30  :%S",          0
6fe0: 2c 20 63 75 72 72 65 6e 74 54 69 6d 65 46 75 6e  , currentTimeFun
6ff0: 63 29 2c 0a 20 20 20 20 53 54 52 5f 46 55 4e 43  c),.    STR_FUNC
7000: 54 49 4f 4e 28 63 75 72 72 65 6e 74 5f 64 61 74  TION(current_dat
7010: 65 2c 20 20 20 20 20 20 30 2c 20 22 25 59 2d 25  e,      0, "%Y-%
7020: 6d 2d 25 64 22 2c 20 20 20 20 20 20 20 20 20 20  m-%d",          
7030: 30 2c 20 63 75 72 72 65 6e 74 54 69 6d 65 46 75  0, currentTimeFu
7040: 6e 63 29 2c 0a 20 20 20 20 53 54 52 5f 46 55 4e  nc),.    STR_FUN
7050: 43 54 49 4f 4e 28 63 75 72 72 65 6e 74 5f 74 69  CTION(current_ti
7060: 6d 65 73 74 61 6d 70 2c 20 30 2c 20 22 25 59 2d  mestamp, 0, "%Y-
7070: 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c  %m-%d %H:%M:%S",
7080: 20 30 2c 20 63 75 72 72 65 6e 74 54 69 6d 65 46   0, currentTimeF
7090: 75 6e 63 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d  unc),.#endif.  }
70a0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 75 6e  ;.  int i;.  Fun
70b0: 63 44 65 66 48 61 73 68 20 2a 70 48 61 73 68 20  cDefHash *pHash 
70c0: 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65  = &GLOBAL(FuncDe
70d0: 66 48 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c  fHash, sqlite3Gl
70e0: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a  obalFunctions);.
70f0: 20 20 46 75 6e 63 44 65 66 20 2a 61 46 75 6e 63    FuncDef *aFunc
7100: 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 26 47 4c   = (FuncDef*)&GL
7110: 4f 42 41 4c 28 46 75 6e 63 44 65 66 2c 20 61 44  OBAL(FuncDef, aD
7120: 61 74 65 54 69 6d 65 46 75 6e 63 73 29 3b 0a 0a  ateTimeFuncs);..
7130: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
7140: 61 79 53 69 7a 65 28 61 44 61 74 65 54 69 6d 65  aySize(aDateTime
7150: 46 75 6e 63 73 29 3b 20 69 2b 2b 29 7b 0a 20 20  Funcs); i++){.  
7160: 20 20 73 71 6c 69 74 65 33 46 75 6e 63 44 65 66    sqlite3FuncDef
7170: 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 26 61  Insert(pHash, &a
7180: 46 75 6e 63 5b 69 5d 29 3b 0a 20 20 7d 0a 7d 0a  Func[i]);.  }.}.