/ Hex Artifact Content
Login

Artifact d3c11de76392ea62637bfac0f4655889fc2f5a85:


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 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
29f0: 73 4c 6f 63 61 6c 74 69 6d 65 28 74 69 6d 65 5f  sLocaltime(time_
2a00: 74 20 2a 74 2c 20 73 74 72 75 63 74 20 74 6d 20  t *t, struct tm 
2a10: 2a 70 54 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pTm){.  int rc;
2a20: 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 48  .#if (!defined(H
2a30: 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 29  AVE_LOCALTIME_R)
2a40: 20 7c 7c 20 21 48 41 56 45 5f 4c 4f 43 41 4c 54   || !HAVE_LOCALT
2a50: 49 4d 45 5f 52 29 20 5c 0a 20 20 20 20 20 20 26  IME_R) \.      &
2a60: 26 20 28 21 64 65 66 69 6e 65 64 28 48 41 56 45  & (!defined(HAVE
2a70: 5f 4c 4f 43 41 4c 54 49 4d 45 5f 53 29 20 7c 7c  _LOCALTIME_S) ||
2a80: 20 21 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45   !HAVE_LOCALTIME
2a90: 5f 53 29 0a 20 20 73 74 72 75 63 74 20 74 6d 20  _S).  struct tm 
2aa0: 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  *pX;.  sqlite3_m
2ab0: 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
2ac0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
2ad0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
2ae0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73  TIC_MASTER);.  s
2af0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2b00: 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 70 58 20  er(mutex);.  pX 
2b10: 3d 20 6c 6f 63 61 6c 74 69 6d 65 28 74 29 3b 0a  = localtime(t);.
2b20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b30: 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
2b40: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2b50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61  obalConfig.bLoca
2b60: 6c 74 69 6d 65 46 61 75 6c 74 20 29 20 70 58 20  ltimeFault ) pX 
2b70: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
2b80: 28 20 70 58 20 29 20 2a 70 54 6d 20 3d 20 2a 70  ( pX ) *pTm = *p
2b90: 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  X;.  sqlite3_mut
2ba0: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
2bb0: 0a 20 20 72 63 20 3d 20 70 58 3d 3d 30 3b 0a 23  .  rc = pX==0;.#
2bc0: 65 6c 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c  else.#ifndef SQL
2bd0: 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
2be0: 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
2bf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2c00: 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20  bLocaltimeFault 
2c10: 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64  ) return 1;.#end
2c20: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
2c30: 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 29  AVE_LOCALTIME_R)
2c40: 20 26 26 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49   && HAVE_LOCALTI
2c50: 4d 45 5f 52 0a 20 20 72 63 20 3d 20 6c 6f 63 61  ME_R.  rc = loca
2c60: 6c 74 69 6d 65 5f 72 28 74 2c 20 70 54 6d 29 3d  ltime_r(t, pTm)=
2c70: 3d 30 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d  =0;.#else.  rc =
2c80: 20 6c 6f 63 61 6c 74 69 6d 65 5f 73 28 70 54 6d   localtime_s(pTm
2c90: 2c 20 74 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , t);.#endif /* 
2ca0: 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52  HAVE_LOCALTIME_R
2cb0: 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 48 41   */.#endif /* HA
2cc0: 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f 52 20 7c  VE_LOCALTIME_R |
2cd0: 7c 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45  | HAVE_LOCALTIME
2ce0: 5f 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  _S */.  return r
2cf0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2d00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c  QLITE_OMIT_LOCAL
2d10: 54 49 4d 45 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  TIME */...#ifnde
2d20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
2d30: 43 41 4c 54 49 4d 45 0a 2f 2a 0a 2a 2a 20 43 6f  CALTIME./*.** Co
2d40: 6d 70 75 74 65 20 74 68 65 20 64 69 66 66 65 72  mpute the differ
2d50: 65 6e 63 65 20 28 69 6e 20 6d 69 6c 6c 69 73 65  ence (in millise
2d60: 63 6f 6e 64 73 29 20 62 65 74 77 65 65 6e 20 6c  conds) between l
2d70: 6f 63 61 6c 74 69 6d 65 20 61 6e 64 20 55 54 43  ocaltime and UTC
2d80: 0a 2a 2a 20 28 61 2e 6b 2e 61 2e 20 47 4d 54 29  .** (a.k.a. GMT)
2d90: 20 66 6f 72 20 74 68 65 20 74 69 6d 65 20 76 61   for the time va
2da0: 6c 75 65 20 70 20 77 68 65 72 65 20 70 20 69 73  lue p where p is
2db0: 20 69 6e 20 55 54 43 2e 20 49 66 20 6e 6f 20 65   in UTC. If no e
2dc0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
2dd0: 72 65 74 75 72 6e 20 74 68 69 73 20 76 61 6c 75  return this valu
2de0: 65 20 61 6e 64 20 73 65 74 20 2a 70 52 63 20 74  e and set *pRc t
2df0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  o SQLITE_OK. .**
2e00: 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  .** Or, if an er
2e10: 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
2e20: 73 65 74 20 2a 70 52 63 20 74 6f 20 53 51 4c 49  set *pRc to SQLI
2e30: 54 45 5f 45 52 52 4f 52 2e 20 54 68 65 20 72 65  TE_ERROR. The re
2e40: 74 75 72 6e 65 64 20 76 61 6c 75 65 0a 2a 2a 20  turned value.** 
2e50: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
2e60: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
2e70: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74  atic sqlite3_int
2e80: 36 34 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73  64 localtimeOffs
2e90: 65 74 28 0a 20 20 44 61 74 65 54 69 6d 65 20 2a  et(.  DateTime *
2ea0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2eb0: 20 20 20 20 20 20 2f 2a 20 44 61 74 65 20 61 74        /* Date at
2ec0: 20 77 68 69 63 68 20 74 6f 20 63 61 6c 63 75 6c   which to calcul
2ed0: 61 74 65 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ate offset */.  
2ee0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2ef0: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
2f00: 2f 2a 20 57 72 69 74 65 20 65 72 72 6f 72 20 68  /* Write error h
2f10: 65 72 65 20 69 66 20 6f 6e 65 20 6f 63 63 75 72  ere if one occur
2f20: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 20  s */.  int *pRc 
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
2f50: 72 72 6f 72 20 63 6f 64 65 2e 20 53 51 4c 49 54  rror code. SQLIT
2f60: 45 5f 4f 4b 20 6f 72 20 45 52 52 4f 52 20 2a 2f  E_OK or ERROR */
2f70: 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78  .){.  DateTime x
2f80: 2c 20 79 3b 0a 20 20 74 69 6d 65 5f 74 20 74 3b  , y;.  time_t t;
2f90: 0a 20 20 73 74 72 75 63 74 20 74 6d 20 73 4c 6f  .  struct tm sLo
2fa0: 63 61 6c 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  cal;..  /* Initi
2fb0: 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
2fc0: 74 73 20 6f 66 20 73 4c 6f 63 61 6c 20 74 6f 20  ts of sLocal to 
2fd0: 61 76 6f 69 64 20 61 20 63 6f 6d 70 69 6c 65 72  avoid a compiler
2fe0: 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 6d   warning. */.  m
2ff0: 65 6d 73 65 74 28 26 73 4c 6f 63 61 6c 2c 20 30  emset(&sLocal, 0
3000: 2c 20 73 69 7a 65 6f 66 28 73 4c 6f 63 61 6c 29  , sizeof(sLocal)
3010: 29 3b 0a 0a 20 20 78 20 3d 20 2a 70 3b 0a 20 20  );..  x = *p;.  
3020: 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26  computeYMD_HMS(&
3030: 78 29 3b 0a 20 20 69 66 28 20 78 2e 59 3c 31 39  x);.  if( x.Y<19
3040: 37 31 20 7c 7c 20 78 2e 59 3e 3d 32 30 33 38 20  71 || x.Y>=2038 
3050: 29 7b 0a 20 20 20 20 78 2e 59 20 3d 20 32 30 30  ){.    x.Y = 200
3060: 30 3b 0a 20 20 20 20 78 2e 4d 20 3d 20 31 3b 0a  0;.    x.M = 1;.
3070: 20 20 20 20 78 2e 44 20 3d 20 31 3b 0a 20 20 20      x.D = 1;.   
3080: 20 78 2e 68 20 3d 20 30 3b 0a 20 20 20 20 78 2e   x.h = 0;.    x.
3090: 6d 20 3d 20 30 3b 0a 20 20 20 20 78 2e 73 20 3d  m = 0;.    x.s =
30a0: 20 30 2e 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b   0.0;.  } else {
30b0: 0a 20 20 20 20 69 6e 74 20 73 20 3d 20 28 69 6e  .    int s = (in
30c0: 74 29 28 78 2e 73 20 2b 20 30 2e 35 29 3b 0a 20  t)(x.s + 0.5);. 
30d0: 20 20 20 78 2e 73 20 3d 20 73 3b 0a 20 20 7d 0a     x.s = s;.  }.
30e0: 20 20 78 2e 74 7a 20 3d 20 30 3b 0a 20 20 78 2e    x.tz = 0;.  x.
30f0: 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 63  validJD = 0;.  c
3100: 6f 6d 70 75 74 65 4a 44 28 26 78 29 3b 0a 20 20  omputeJD(&x);.  
3110: 74 20 3d 20 28 74 69 6d 65 5f 74 29 28 78 2e 69  t = (time_t)(x.i
3120: 4a 44 2f 31 30 30 30 20 2d 20 32 31 30 38 36 36  JD/1000 - 210866
3130: 37 36 2a 28 69 36 34 29 31 30 30 30 30 29 3b 0a  76*(i64)10000);.
3140: 20 20 69 66 28 20 6f 73 4c 6f 63 61 6c 74 69 6d    if( osLocaltim
3150: 65 28 26 74 2c 20 26 73 4c 6f 63 61 6c 29 20 29  e(&t, &sLocal) )
3160: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
3170: 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
3180: 20 22 6c 6f 63 61 6c 20 74 69 6d 65 20 75 6e 61   "local time una
3190: 76 61 69 6c 61 62 6c 65 22 2c 20 2d 31 29 3b 0a  vailable", -1);.
31a0: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
31b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
31c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 79 2e 59  urn 0;.  }.  y.Y
31d0: 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 79 65 61   = sLocal.tm_yea
31e0: 72 20 2b 20 31 39 30 30 3b 0a 20 20 79 2e 4d 20  r + 1900;.  y.M 
31f0: 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d 6f 6e 20  = sLocal.tm_mon 
3200: 2b 20 31 3b 0a 20 20 79 2e 44 20 3d 20 73 4c 6f  + 1;.  y.D = sLo
3210: 63 61 6c 2e 74 6d 5f 6d 64 61 79 3b 0a 20 20 79  cal.tm_mday;.  y
3220: 2e 68 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 68  .h = sLocal.tm_h
3230: 6f 75 72 3b 0a 20 20 79 2e 6d 20 3d 20 73 4c 6f  our;.  y.m = sLo
3240: 63 61 6c 2e 74 6d 5f 6d 69 6e 3b 0a 20 20 79 2e  cal.tm_min;.  y.
3250: 73 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 73 65  s = sLocal.tm_se
3260: 63 3b 0a 20 20 79 2e 76 61 6c 69 64 59 4d 44 20  c;.  y.validYMD 
3270: 3d 20 31 3b 0a 20 20 79 2e 76 61 6c 69 64 48 4d  = 1;.  y.validHM
3280: 53 20 3d 20 31 3b 0a 20 20 79 2e 76 61 6c 69 64  S = 1;.  y.valid
3290: 4a 44 20 3d 20 30 3b 0a 20 20 79 2e 76 61 6c 69  JD = 0;.  y.vali
32a0: 64 54 5a 20 3d 20 30 3b 0a 20 20 63 6f 6d 70 75  dTZ = 0;.  compu
32b0: 74 65 4a 44 28 26 79 29 3b 0a 20 20 2a 70 52 63  teJD(&y);.  *pRc
32c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
32d0: 72 65 74 75 72 6e 20 79 2e 69 4a 44 20 2d 20 78  return y.iJD - x
32e0: 2e 69 4a 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  .iJD;.}.#endif /
32f0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
3300: 43 41 4c 54 49 4d 45 20 2a 2f 0a 0a 2f 2a 0a 2a  CALTIME */../*.*
3310: 2a 20 50 72 6f 63 65 73 73 20 61 20 6d 6f 64 69  * Process a modi
3320: 66 69 65 72 20 74 6f 20 61 20 64 61 74 65 2d 74  fier to a date-t
3330: 69 6d 65 20 73 74 61 6d 70 2e 20 20 54 68 65 20  ime stamp.  The 
3340: 6d 6f 64 69 66 69 65 72 73 20 61 72 65 0a 2a 2a  modifiers are.**
3350: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3360: 2a 2a 20 20 20 20 20 4e 4e 4e 20 64 61 79 73 0a  **     NNN days.
3370: 2a 2a 20 20 20 20 20 4e 4e 4e 20 68 6f 75 72 73  **     NNN hours
3380: 0a 2a 2a 20 20 20 20 20 4e 4e 4e 20 6d 69 6e 75  .**     NNN minu
3390: 74 65 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 2e 4e  tes.**     NNN.N
33a0: 4e 4e 4e 20 73 65 63 6f 6e 64 73 0a 2a 2a 20 20  NNN seconds.**  
33b0: 20 20 20 4e 4e 4e 20 6d 6f 6e 74 68 73 0a 2a 2a     NNN months.**
33c0: 20 20 20 20 20 4e 4e 4e 20 79 65 61 72 73 0a 2a       NNN years.*
33d0: 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 6d  *     start of m
33e0: 6f 6e 74 68 0a 2a 2a 20 20 20 20 20 73 74 61 72  onth.**     star
33f0: 74 20 6f 66 20 79 65 61 72 0a 2a 2a 20 20 20 20  t of year.**    
3400: 20 73 74 61 72 74 20 6f 66 20 77 65 65 6b 0a 2a   start of week.*
3410: 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 64  *     start of d
3420: 61 79 0a 2a 2a 20 20 20 20 20 77 65 65 6b 64 61  ay.**     weekda
3430: 79 20 4e 0a 2a 2a 20 20 20 20 20 75 6e 69 78 65  y N.**     unixe
3440: 70 6f 63 68 0a 2a 2a 20 20 20 20 20 6c 6f 63 61  poch.**     loca
3450: 6c 74 69 6d 65 0a 2a 2a 20 20 20 20 20 75 74 63  ltime.**     utc
3460: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
3470: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 31  on success and 1
3480: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
3490: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 2e 20   kind of error. 
34a0: 49 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  If the error.** 
34b0: 69 73 20 69 6e 20 61 20 73 79 73 74 65 6d 20 63  is in a system c
34c0: 61 6c 6c 20 28 69 2e 65 2e 20 6c 6f 63 61 6c 74  all (i.e. localt
34d0: 69 6d 65 28 29 29 2c 20 74 68 65 6e 20 61 6e 20  ime()), then an 
34e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
34f0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 63   written.** to c
3500: 6f 6e 74 65 78 74 20 70 43 74 78 2e 20 49 66 20  ontext pCtx. If 
3510: 74 68 65 20 65 72 72 6f 72 20 69 73 20 61 6e 20  the error is an 
3520: 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6d 6f 64  unrecognized mod
3530: 69 66 69 65 72 2c 20 6e 6f 20 65 72 72 6f 72 20  ifier, no error 
3540: 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  is.** written to
3550: 20 70 43 74 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   pCtx..*/.static
3560: 20 69 6e 74 20 70 61 72 73 65 4d 6f 64 69 66 69   int parseModifi
3570: 65 72 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  er(sqlite3_conte
3580: 78 74 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20  xt *pCtx, const 
3590: 63 68 61 72 20 2a 7a 4d 6f 64 2c 20 44 61 74 65  char *zMod, Date
35a0: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Time *p){.  int 
35b0: 72 63 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 3b  rc = 1;.  int n;
35c0: 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63  .  double r;.  c
35d0: 68 61 72 20 2a 7a 2c 20 7a 42 75 66 5b 33 30 5d  har *z, zBuf[30]
35e0: 3b 0a 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20  ;.  z = zBuf;.  
35f0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 41 72 72 61 79  for(n=0; n<Array
3600: 53 69 7a 65 28 7a 42 75 66 29 2d 31 20 26 26 20  Size(zBuf)-1 && 
3610: 7a 4d 6f 64 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20  zMod[n]; n++){. 
3620: 20 20 20 7a 5b 6e 5d 20 3d 20 28 63 68 61 72 29     z[n] = (char)
3630: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
3640: 77 65 72 5b 28 75 38 29 7a 4d 6f 64 5b 6e 5d 5d  wer[(u8)zMod[n]]
3650: 3b 0a 20 20 7d 0a 20 20 7a 5b 6e 5d 20 3d 20 30  ;.  }.  z[n] = 0
3660: 3b 0a 20 20 73 77 69 74 63 68 28 20 7a 5b 30 5d  ;.  switch( z[0]
3670: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
3680: 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d  TE_OMIT_LOCALTIM
3690: 45 0a 20 20 20 20 63 61 73 65 20 27 6c 27 3a 20  E.    case 'l': 
36a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 6c 6f  {.      /*    lo
36b0: 63 61 6c 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a  caltime.      **
36c0: 0a 20 20 20 20 20 20 2a 2a 20 41 73 73 75 6d 69  .      ** Assumi
36d0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
36e0: 69 6d 65 20 76 61 6c 75 65 20 69 73 20 55 54 43  ime value is UTC
36f0: 20 28 61 2e 6b 2e 61 2e 20 47 4d 54 29 2c 20 73   (a.k.a. GMT), s
3700: 68 69 66 74 20 69 74 20 74 6f 0a 20 20 20 20 20  hift it to.     
3710: 20 2a 2a 20 73 68 6f 77 20 6c 6f 63 61 6c 20 74   ** show local t
3720: 69 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ime..      */.  
3730: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
3740: 2c 20 22 6c 6f 63 61 6c 74 69 6d 65 22 29 3d 3d  , "localtime")==
3750: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6d  0 ){.        com
3760: 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20  puteJD(p);.     
3770: 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 6c 6f 63     p->iJD += loc
3780: 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 2c 20  altimeOffset(p, 
3790: 70 43 74 78 2c 20 26 72 63 29 3b 0a 20 20 20 20  pCtx, &rc);.    
37a0: 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53      clearYMD_HMS
37b0: 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  _TZ(p);.      }.
37c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
37d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
37e0: 73 65 20 27 75 27 3a 20 7b 0a 20 20 20 20 20 20  se 'u': {.      
37f0: 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 75  /*.      **    u
3800: 6e 69 78 65 70 6f 63 68 0a 20 20 20 20 20 20 2a  nixepoch.      *
3810: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 72 65 61 74  *.      ** Treat
3820: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
3830: 75 65 20 6f 66 20 70 2d 3e 69 4a 44 20 61 73 20  ue of p->iJD as 
3840: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
3850: 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 73 20 73      ** seconds s
3860: 69 6e 63 65 20 31 39 37 30 2e 20 20 43 6f 6e 76  ince 1970.  Conv
3870: 65 72 74 20 74 6f 20 61 20 72 65 61 6c 20 6a 75  ert to a real ju
3880: 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 2e  lian day number.
3890: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
38a0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 75  if( strcmp(z, "u
38b0: 6e 69 78 65 70 6f 63 68 22 29 3d 3d 30 20 26 26  nixepoch")==0 &&
38c0: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 29 7b 0a 20   p->validJD ){. 
38d0: 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 3d 20         p->iJD = 
38e0: 28 70 2d 3e 69 4a 44 20 2b 20 34 33 32 30 30 29  (p->iJD + 43200)
38f0: 2f 38 36 34 30 30 20 2b 20 32 31 30 38 36 36 37  /86400 + 2108667
3900: 36 2a 28 69 36 34 29 31 30 30 30 30 30 30 30 3b  6*(i64)10000000;
3910: 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d  .        clearYM
3920: 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20  D_HMS_TZ(p);.   
3930: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
3940: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
3950: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49  ITE_OMIT_LOCALTI
3960: 4d 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66  ME.      else if
3970: 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 75 74 63  ( strcmp(z, "utc
3980: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
3990: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 63   sqlite3_int64 c
39a0: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  1;.        compu
39b0: 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 20  teJD(p);.       
39c0: 20 63 31 20 3d 20 6c 6f 63 61 6c 74 69 6d 65 4f   c1 = localtimeO
39d0: 66 66 73 65 74 28 70 2c 20 70 43 74 78 2c 20 26  ffset(p, pCtx, &
39e0: 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
39f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3a00: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  {.          p->i
3a10: 4a 44 20 2d 3d 20 63 31 3b 0a 20 20 20 20 20 20  JD -= c1;.      
3a20: 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53      clearYMD_HMS
3a30: 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20  _TZ(p);.        
3a40: 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 63 31 20 2d    p->iJD += c1 -
3a50: 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65 74   localtimeOffset
3a60: 28 70 2c 20 70 43 74 78 2c 20 26 72 63 29 3b 0a  (p, pCtx, &rc);.
3a70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3a80: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  }.#endif.      b
3a90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3aa0: 63 61 73 65 20 27 77 27 3a 20 7b 0a 20 20 20 20  case 'w': {.    
3ab0: 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    /*.      **   
3ac0: 20 77 65 65 6b 64 61 79 20 4e 0a 20 20 20 20 20   weekday N.     
3ad0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76   **.      ** Mov
3ae0: 65 20 74 68 65 20 64 61 74 65 20 74 6f 20 74 68  e the date to th
3af0: 65 20 73 61 6d 65 20 74 69 6d 65 20 6f 6e 20 74  e same time on t
3b00: 68 65 20 6e 65 78 74 20 6f 63 63 75 72 72 65 6e  he next occurren
3b10: 63 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ce of.      ** w
3b20: 65 65 6b 64 61 79 20 4e 20 77 68 65 72 65 20 30  eekday N where 0
3b30: 3d 3d 53 75 6e 64 61 79 2c 20 31 3d 3d 4d 6f 6e  ==Sunday, 1==Mon
3b40: 64 61 79 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  day, and so fort
3b50: 68 2e 20 20 49 66 20 74 68 65 0a 20 20 20 20 20  h.  If the.     
3b60: 20 2a 2a 20 64 61 74 65 20 69 73 20 61 6c 72 65   ** date is alre
3b70: 61 64 79 20 6f 6e 20 74 68 65 20 61 70 70 72 6f  ady on the appro
3b80: 70 72 69 61 74 65 20 77 65 65 6b 64 61 79 2c 20  priate weekday, 
3b90: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
3ba0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
3bb0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22  if( strncmp(z, "
3bc0: 77 65 65 6b 64 61 79 20 22 2c 20 38 29 3d 3d 30  weekday ", 8)==0
3bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3be0: 26 26 20 73 71 6c 69 74 65 33 41 74 6f 46 28 26  && sqlite3AtoF(&
3bf0: 7a 5b 38 5d 2c 20 26 72 2c 20 73 71 6c 69 74 65  z[8], &r, sqlite
3c00: 33 53 74 72 6c 65 6e 33 30 28 26 7a 5b 38 5d 29  3Strlen30(&z[8])
3c10: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 0a 20  , SQLITE_UTF8). 
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
3c30: 20 28 6e 3d 28 69 6e 74 29 72 29 3d 3d 72 20 26   (n=(int)r)==r &
3c40: 26 20 6e 3e 3d 30 20 26 26 20 72 3c 37 20 29 7b  & n>=0 && r<7 ){
3c50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3c60: 5f 69 6e 74 36 34 20 5a 3b 0a 20 20 20 20 20 20  _int64 Z;.      
3c70: 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53    computeYMD_HMS
3c80: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
3c90: 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 20  validTZ = 0;.   
3ca0: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20       p->validJD 
3cb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  = 0;.        com
3cc0: 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20  puteJD(p);.     
3cd0: 20 20 20 5a 20 3d 20 28 28 70 2d 3e 69 4a 44 20     Z = ((p->iJD 
3ce0: 2b 20 31 32 39 36 30 30 30 30 30 29 2f 38 36 34  + 129600000)/864
3cf0: 30 30 30 30 30 29 20 25 20 37 3b 0a 20 20 20 20  00000) % 7;.    
3d00: 20 20 20 20 69 66 28 20 5a 3e 6e 20 29 20 5a 20      if( Z>n ) Z 
3d10: 2d 3d 20 37 3b 0a 20 20 20 20 20 20 20 20 70 2d  -= 7;.        p-
3d20: 3e 69 4a 44 20 2b 3d 20 28 6e 20 2d 20 5a 29 2a  >iJD += (n - Z)*
3d30: 38 36 34 30 30 30 30 30 3b 0a 20 20 20 20 20 20  86400000;.      
3d40: 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f 54    clearYMD_HMS_T
3d50: 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Z(p);.        rc
3d60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
3d70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3d80: 0a 20 20 20 20 63 61 73 65 20 27 73 27 3a 20 7b  .    case 's': {
3d90: 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20  .      /*.      
3da0: 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66 20 54  **    start of T
3db0: 54 54 54 54 0a 20 20 20 20 20 20 2a 2a 0a 20 20  TTTT.      **.  
3dc0: 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20      ** Move the 
3dd0: 64 61 74 65 20 62 61 63 6b 77 61 72 64 73 20 74  date backwards t
3de0: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
3df0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  of the current d
3e00: 61 79 2c 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  ay,.      ** or 
3e10: 6d 6f 6e 74 68 20 6f 72 20 79 65 61 72 2e 0a 20  month or year.. 
3e20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
3e30: 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20 22 73 74  ( strncmp(z, "st
3e40: 61 72 74 20 6f 66 20 22 2c 20 39 29 21 3d 30 20  art of ", 9)!=0 
3e50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7a  ) break;.      z
3e60: 20 2b 3d 20 39 3b 0a 20 20 20 20 20 20 63 6f 6d   += 9;.      com
3e70: 70 75 74 65 59 4d 44 28 70 29 3b 0a 20 20 20 20  puteYMD(p);.    
3e80: 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20    p->validHMS = 
3e90: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20  1;.      p->h = 
3ea0: 70 2d 3e 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p->m = 0;.      
3eb0: 70 2d 3e 73 20 3d 20 30 2e 30 3b 0a 20 20 20 20  p->s = 0.0;.    
3ec0: 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30    p->validTZ = 0
3ed0: 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64  ;.      p->valid
3ee0: 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  JD = 0;.      if
3ef0: 28 20 73 74 72 63 6d 70 28 7a 2c 22 6d 6f 6e 74  ( strcmp(z,"mont
3f00: 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  h")==0 ){.      
3f10: 20 20 70 2d 3e 44 20 3d 20 31 3b 0a 20 20 20 20    p->D = 1;.    
3f20: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
3f30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
3f40: 6d 70 28 7a 2c 22 79 65 61 72 22 29 3d 3d 30 20  mp(z,"year")==0 
3f50: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  ){.        compu
3f60: 74 65 59 4d 44 28 70 29 3b 0a 20 20 20 20 20 20  teYMD(p);.      
3f70: 20 20 70 2d 3e 4d 20 3d 20 31 3b 0a 20 20 20 20    p->M = 1;.    
3f80: 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0a 20 20      p->D = 1;.  
3f90: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
3fa0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
3fb0: 72 63 6d 70 28 7a 2c 22 64 61 79 22 29 3d 3d 30  rcmp(z,"day")==0
3fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
3fd0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
3fe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ff0: 20 20 20 63 61 73 65 20 27 2b 27 3a 0a 20 20 20     case '+':.   
4000: 20 63 61 73 65 20 27 2d 27 3a 0a 20 20 20 20 63   case '-':.    c
4010: 61 73 65 20 27 30 27 3a 0a 20 20 20 20 63 61 73  ase '0':.    cas
4020: 65 20 27 31 27 3a 0a 20 20 20 20 63 61 73 65 20  e '1':.    case 
4030: 27 32 27 3a 0a 20 20 20 20 63 61 73 65 20 27 33  '2':.    case '3
4040: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 34 27 3a  ':.    case '4':
4050: 0a 20 20 20 20 63 61 73 65 20 27 35 27 3a 0a 20  .    case '5':. 
4060: 20 20 20 63 61 73 65 20 27 36 27 3a 0a 20 20 20     case '6':.   
4070: 20 63 61 73 65 20 27 37 27 3a 0a 20 20 20 20 63   case '7':.    c
4080: 61 73 65 20 27 38 27 3a 0a 20 20 20 20 63 61 73  ase '8':.    cas
4090: 65 20 27 39 27 3a 20 7b 0a 20 20 20 20 20 20 64  e '9': {.      d
40a0: 6f 75 62 6c 65 20 72 52 6f 75 6e 64 65 72 3b 0a  ouble rRounder;.
40b0: 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 7a        for(n=1; z
40c0: 5b 6e 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27 3a 27  [n] && z[n]!=':'
40d0: 20 26 26 20 21 73 71 6c 69 74 65 33 49 73 73 70   && !sqlite3Issp
40e0: 61 63 65 28 7a 5b 6e 5d 29 3b 20 6e 2b 2b 29 7b  ace(z[n]); n++){
40f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c  }.      if( !sql
4100: 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 72 2c 20  ite3AtoF(z, &r, 
4110: 6e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 20  n, SQLITE_UTF8) 
4120: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
4130: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
4140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4150: 69 66 28 20 7a 5b 6e 5d 3d 3d 27 3a 27 20 29 7b  if( z[n]==':' ){
4160: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6d 6f  .        /* A mo
4170: 64 69 66 69 65 72 20 6f 66 20 74 68 65 20 66 6f  difier of the fo
4180: 72 6d 20 28 2b 7c 2d 29 48 48 3a 4d 4d 3a 53 53  rm (+|-)HH:MM:SS
4190: 2e 46 46 46 20 61 64 64 73 20 28 6f 72 20 73 75  .FFF adds (or su
41a0: 62 74 72 61 63 74 73 29 20 74 68 65 0a 20 20 20  btracts) the.   
41b0: 20 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65       ** specifie
41c0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 68 6f 75 72  d number of hour
41d0: 73 2c 20 6d 69 6e 75 74 65 73 2c 20 73 65 63 6f  s, minutes, seco
41e0: 6e 64 73 2c 20 61 6e 64 20 66 72 61 63 74 69 6f  nds, and fractio
41f0: 6e 61 6c 20 73 65 63 6f 6e 64 73 0a 20 20 20 20  nal seconds.    
4200: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 69      ** to the ti
4210: 6d 65 2e 20 20 54 68 65 20 22 2e 46 46 46 22 20  me.  The ".FFF" 
4220: 6d 61 79 20 62 65 20 6f 6d 69 74 74 65 64 2e 20  may be omitted. 
4230: 20 54 68 65 20 22 3a 53 53 2e 46 46 46 22 20 6d   The ":SS.FFF" m
4240: 61 79 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ay be.        **
4250: 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 20   omitted..      
4260: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
4270: 73 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b  st char *z2 = z;
4280: 0a 20 20 20 20 20 20 20 20 44 61 74 65 54 69 6d  .        DateTim
4290: 65 20 74 78 3b 0a 20 20 20 20 20 20 20 20 73 71  e tx;.        sq
42a0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 64 61 79 3b  lite3_int64 day;
42b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71  .        if( !sq
42c0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 2a 7a 32  lite3Isdigit(*z2
42d0: 29 20 29 20 7a 32 2b 2b 3b 0a 20 20 20 20 20 20  ) ) z2++;.      
42e0: 20 20 6d 65 6d 73 65 74 28 26 74 78 2c 20 30 2c    memset(&tx, 0,
42f0: 20 73 69 7a 65 6f 66 28 74 78 29 29 3b 0a 20 20   sizeof(tx));.  
4300: 20 20 20 20 20 20 69 66 28 20 70 61 72 73 65 48        if( parseH
4310: 68 4d 6d 53 73 28 7a 32 2c 20 26 74 78 29 20 29  hMmSs(z2, &tx) )
4320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4330: 63 6f 6d 70 75 74 65 4a 44 28 26 74 78 29 3b 0a  computeJD(&tx);.
4340: 20 20 20 20 20 20 20 20 74 78 2e 69 4a 44 20 2d          tx.iJD -
4350: 3d 20 34 33 32 30 30 30 30 30 3b 0a 20 20 20 20  = 43200000;.    
4360: 20 20 20 20 64 61 79 20 3d 20 74 78 2e 69 4a 44      day = tx.iJD
4370: 2f 38 36 34 30 30 30 30 30 3b 0a 20 20 20 20 20  /86400000;.     
4380: 20 20 20 74 78 2e 69 4a 44 20 2d 3d 20 64 61 79     tx.iJD -= day
4390: 2a 38 36 34 30 30 30 30 30 3b 0a 20 20 20 20 20  *86400000;.     
43a0: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
43b0: 20 29 20 74 78 2e 69 4a 44 20 3d 20 2d 74 78 2e   ) tx.iJD = -tx.
43c0: 69 4a 44 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  iJD;.        com
43d0: 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20  puteJD(p);.     
43e0: 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f     clearYMD_HMS_
43f0: 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  TZ(p);.        p
4400: 2d 3e 69 4a 44 20 2b 3d 20 74 78 2e 69 4a 44 3b  ->iJD += tx.iJD;
4410: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b  .        rc = 0;
4420: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 20        }.      z 
4440: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 77 68 69 6c  += n;.      whil
4450: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
4460: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
4470: 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
4480: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
4490: 20 69 66 28 20 6e 3e 31 30 20 7c 7c 20 6e 3c 33   if( n>10 || n<3
44a0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
44b0: 69 66 28 20 7a 5b 6e 2d 31 5d 3d 3d 27 73 27 20  if( z[n-1]=='s' 
44c0: 29 7b 20 7a 5b 6e 2d 31 5d 20 3d 20 30 3b 20 6e  ){ z[n-1] = 0; n
44d0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 63 6f 6d 70  --; }.      comp
44e0: 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20  uteJD(p);.      
44f0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 52  rc = 0;.      rR
4500: 6f 75 6e 64 65 72 20 3d 20 72 3c 30 20 3f 20 2d  ounder = r<0 ? -
4510: 30 2e 35 20 3a 20 2b 30 2e 35 3b 0a 20 20 20 20  0.5 : +0.5;.    
4520: 20 20 69 66 28 20 6e 3d 3d 33 20 26 26 20 73 74    if( n==3 && st
4530: 72 63 6d 70 28 7a 2c 22 64 61 79 22 29 3d 3d 30  rcmp(z,"day")==0
4540: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69   ){.        p->i
4550: 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65 33 5f 69  JD += (sqlite3_i
4560: 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30  nt64)(r*86400000
4570: 2e 30 20 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a  .0 + rRounder);.
4580: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4590: 6e 3d 3d 34 20 26 26 20 73 74 72 63 6d 70 28 7a  n==4 && strcmp(z
45a0: 2c 22 68 6f 75 72 22 29 3d 3d 30 20 29 7b 0a 20  ,"hour")==0 ){. 
45b0: 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d         p->iJD +=
45c0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
45d0: 28 72 2a 28 38 36 34 30 30 30 30 30 2e 30 2f 32  (r*(86400000.0/2
45e0: 34 2e 30 29 20 2b 20 72 52 6f 75 6e 64 65 72 29  4.0) + rRounder)
45f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4600: 28 20 6e 3d 3d 36 20 26 26 20 73 74 72 63 6d 70  ( n==6 && strcmp
4610: 28 7a 2c 22 6d 69 6e 75 74 65 22 29 3d 3d 30 20  (z,"minute")==0 
4620: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4a  ){.        p->iJ
4630: 44 20 2b 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e  D += (sqlite3_in
4640: 74 36 34 29 28 72 2a 28 38 36 34 30 30 30 30 30  t64)(r*(86400000
4650: 2e 30 2f 28 32 34 2e 30 2a 36 30 2e 30 29 29 20  .0/(24.0*60.0)) 
4660: 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20 20  + rRounder);.   
4670: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d     }else if( n==
4680: 36 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 73  6 && strcmp(z,"s
4690: 65 63 6f 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20  econd")==0 ){.  
46a0: 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20        p->iJD += 
46b0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
46c0: 72 2a 28 38 36 34 30 30 30 30 30 2e 30 2f 28 32  r*(86400000.0/(2
46d0: 34 2e 30 2a 36 30 2e 30 2a 36 30 2e 30 29 29 20  4.0*60.0*60.0)) 
46e0: 2b 20 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20 20  + rRounder);.   
46f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d     }else if( n==
4700: 35 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 6d  5 && strcmp(z,"m
4710: 6f 6e 74 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  onth")==0 ){.   
4720: 20 20 20 20 20 69 6e 74 20 78 2c 20 79 3b 0a 20       int x, y;. 
4730: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d         computeYM
4740: 44 5f 48 4d 53 28 70 29 3b 0a 20 20 20 20 20 20  D_HMS(p);.      
4750: 20 20 70 2d 3e 4d 20 2b 3d 20 28 69 6e 74 29 72    p->M += (int)r
4760: 3b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 70 2d  ;.        x = p-
4770: 3e 4d 3e 30 20 3f 20 28 70 2d 3e 4d 2d 31 29 2f  >M>0 ? (p->M-1)/
4780: 31 32 20 3a 20 28 70 2d 3e 4d 2d 31 32 29 2f 31  12 : (p->M-12)/1
4790: 32 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 59 20  2;.        p->Y 
47a0: 2b 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 2d  += x;.        p-
47b0: 3e 4d 20 2d 3d 20 78 2a 31 32 3b 0a 20 20 20 20  >M -= x*12;.    
47c0: 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d      p->validJD =
47d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70   0;.        comp
47e0: 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20  uteJD(p);.      
47f0: 20 20 79 20 3d 20 28 69 6e 74 29 72 3b 0a 20 20    y = (int)r;.  
4800: 20 20 20 20 20 20 69 66 28 20 79 21 3d 72 20 29        if( y!=r )
4810: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  {.          p->i
4820: 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65 33 5f 69  JD += (sqlite3_i
4830: 6e 74 36 34 29 28 28 72 20 2d 20 79 29 2a 33 30  nt64)((r - y)*30
4840: 2e 30 2a 38 36 34 30 30 30 30 30 2e 30 20 2b 20  .0*86400000.0 + 
4850: 72 52 6f 75 6e 64 65 72 29 3b 0a 20 20 20 20 20  rRounder);.     
4860: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
4870: 20 69 66 28 20 6e 3d 3d 34 20 26 26 20 73 74 72   if( n==4 && str
4880: 63 6d 70 28 7a 2c 22 79 65 61 72 22 29 3d 3d 30  cmp(z,"year")==0
4890: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
48a0: 79 20 3d 20 28 69 6e 74 29 72 3b 0a 20 20 20 20  y = (int)r;.    
48b0: 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48      computeYMD_H
48c0: 4d 53 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  MS(p);.        p
48d0: 2d 3e 59 20 2b 3d 20 79 3b 0a 20 20 20 20 20 20  ->Y += y;.      
48e0: 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30    p->validJD = 0
48f0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
4900: 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 20 20  eJD(p);.        
4910: 69 66 28 20 79 21 3d 72 20 29 7b 0a 20 20 20 20  if( y!=r ){.    
4920: 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20        p->iJD += 
4930: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
4940: 28 72 20 2d 20 79 29 2a 33 36 35 2e 30 2a 38 36  (r - y)*365.0*86
4950: 34 30 30 30 30 30 2e 30 20 2b 20 72 52 6f 75 6e  400000.0 + rRoun
4960: 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  der);.        }.
4970: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4980: 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
4990: 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
49a0: 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20  YMD_HMS_TZ(p);. 
49b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
49c0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
49d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
49f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72   rc;.}../*.** Pr
4a00: 6f 63 65 73 73 20 74 69 6d 65 20 66 75 6e 63 74  ocess time funct
4a10: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ion arguments.  
4a20: 61 72 67 76 5b 30 5d 20 69 73 20 61 20 64 61 74  argv[0] is a dat
4a30: 65 2d 74 69 6d 65 20 73 74 61 6d 70 2e 0a 2a 2a  e-time stamp..**
4a40: 20 61 72 67 76 5b 31 5d 20 61 6e 64 20 66 6f 6c   argv[1] and fol
4a50: 6c 6f 77 69 6e 67 20 61 72 65 20 6d 6f 64 69 66  lowing are modif
4a60: 69 65 72 73 2e 20 20 50 61 72 73 65 20 74 68 65  iers.  Parse the
4a70: 6d 20 61 6c 6c 20 61 6e 64 20 77 72 69 74 65 0a  m all and write.
4a80: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  ** the resulting
4a90: 20 74 69 6d 65 20 69 6e 74 6f 20 74 68 65 20 44   time into the D
4aa0: 61 74 65 54 69 6d 65 20 73 74 72 75 63 74 75 72  ateTime structur
4ab0: 65 20 70 2e 20 20 52 65 74 75 72 6e 20 30 0a 2a  e p.  Return 0.*
4ac0: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  * on success and
4ad0: 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20   1 if there are 
4ae0: 61 6e 79 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  any errors..**.*
4af0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 7a  * If there are z
4b00: 65 72 6f 20 70 61 72 61 6d 65 74 65 72 73 20 28  ero parameters (
4b10: 69 66 20 65 76 65 6e 20 61 72 67 76 5b 30 5d 20  if even argv[0] 
4b20: 69 73 20 75 6e 64 65 66 69 6e 65 64 29 0a 2a 2a  is undefined).**
4b30: 20 74 68 65 6e 20 61 73 73 75 6d 65 20 61 20 64   then assume a d
4b40: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
4b50: 22 6e 6f 77 22 20 66 6f 72 20 61 72 67 76 5b 30  "now" for argv[0
4b60: 5d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ]..*/.static int
4b70: 20 69 73 44 61 74 65 28 0a 20 20 73 71 6c 69 74   isDate(.  sqlit
4b80: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4b90: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
4ba0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  , .  sqlite3_val
4bb0: 75 65 20 2a 2a 61 72 67 76 2c 20 0a 20 20 44 61  ue **argv, .  Da
4bc0: 74 65 54 69 6d 65 20 2a 70 0a 29 7b 0a 20 20 69  teTime *p.){.  i
4bd0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt i;.  const un
4be0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
4bf0: 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 6d    int eType;.  m
4c00: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
4c10: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 61  of(*p));.  if( a
4c20: 72 67 63 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  rgc==0 ){.    se
4c30: 74 44 61 74 65 54 69 6d 65 54 6f 43 75 72 72 65  tDateTimeToCurre
4c40: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 29 3b 0a  nt(context, p);.
4c50: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 54 79    }else if( (eTy
4c60: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  pe = sqlite3_val
4c70: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
4c80: 29 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 0a  )==SQLITE_FLOAT.
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
4cb0: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
4cc0: 20 20 20 70 2d 3e 69 4a 44 20 3d 20 28 73 71 6c     p->iJD = (sql
4cd0: 69 74 65 33 5f 69 6e 74 36 34 29 28 73 71 6c 69  ite3_int64)(sqli
4ce0: 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65  te3_value_double
4cf0: 28 61 72 67 76 5b 30 5d 29 2a 38 36 34 30 30 30  (argv[0])*864000
4d00: 30 30 2e 30 20 2b 20 30 2e 35 29 3b 0a 20 20 20  00.0 + 0.5);.   
4d10: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b   p->validJD = 1;
4d20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
4d30: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
4d40: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
4d50: 20 20 20 69 66 28 20 21 7a 20 7c 7c 20 70 61 72     if( !z || par
4d60: 73 65 44 61 74 65 4f 72 54 69 6d 65 28 63 6f 6e  seDateOrTime(con
4d70: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20  text, (char*)z, 
4d80: 70 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  p) ){.      retu
4d90: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
4da0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
4db0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d  c; i++){.    z =
4dc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
4dd0: 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  ext(argv[i]);.  
4de0: 20 20 69 66 28 20 7a 3d 3d 30 20 7c 7c 20 70 61    if( z==0 || pa
4df0: 72 73 65 4d 6f 64 69 66 69 65 72 28 63 6f 6e 74  rseModifier(cont
4e00: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 2c 20 70  ext, (char*)z, p
4e10: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
4e20: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4e30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
4e40: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69  owing routines i
4e50: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 76 61 72  mplement the var
4e60: 69 6f 75 73 20 64 61 74 65 20 61 6e 64 20 74 69  ious date and ti
4e70: 6d 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  me functions.** 
4e80: 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 0a 2f  of SQLite..*/../
4e90: 2a 0a 2a 2a 20 20 20 20 6a 75 6c 69 61 6e 64 61  *.**    julianda
4ea0: 79 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d  y( TIMESTRING, M
4eb0: 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a  OD, MOD, ...).**
4ec0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6a  .** Return the j
4ed0: 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72  ulian day number
4ee0: 20 6f 66 20 74 68 65 20 64 61 74 65 20 73 70 65   of the date spe
4ef0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72  cified in the ar
4f00: 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  guments.*/.stati
4f10: 63 20 76 6f 69 64 20 6a 75 6c 69 61 6e 64 61 79  c void julianday
4f20: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
4f30: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
4f40: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
4f50: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
4f60: 61 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69  argv.){.  DateTi
4f70: 6d 65 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61  me x;.  if( isDa
4f80: 74 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63  te(context, argc
4f90: 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d 30 20 29  , argv, &x)==0 )
4fa0: 7b 0a 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28  {.    computeJD(
4fb0: 26 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  &x);.    sqlite3
4fc0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
4fd0: 6f 6e 74 65 78 74 2c 20 78 2e 69 4a 44 2f 38 36  ontext, x.iJD/86
4fe0: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 7d  400000.0);.  }.}
4ff0: 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64 61 74 65 74  ../*.**    datet
5000: 69 6d 65 28 20 54 49 4d 45 53 54 52 49 4e 47 2c  ime( TIMESTRING,
5010: 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a   MOD, MOD, ...).
5020: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 59 59 59  **.** Return YYY
5030: 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53 53  Y-MM-DD HH:MM:SS
5040: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5050: 64 61 74 65 74 69 6d 65 46 75 6e 63 28 0a 20 20  datetimeFunc(.  
5060: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5070: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
5080: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
5090: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
50a0: 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20    DateTime x;.  
50b0: 69 66 28 20 69 73 44 61 74 65 28 63 6f 6e 74 65  if( isDate(conte
50c0: 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  xt, argc, argv, 
50d0: 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  &x)==0 ){.    ch
50e0: 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20  ar zBuf[100];.  
50f0: 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53    computeYMD_HMS
5100: 28 26 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (&x);.    sqlite
5110: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
5120: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
5130: 25 30 34 64 2d 25 30 32 64 2d 25 30 32 64 20 25  %04d-%02d-%02d %
5140: 30 32 64 3a 25 30 32 64 3a 25 30 32 64 22 2c 0a  02d:%02d:%02d",.
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 20 20 20 20 78 2e 59 2c 20 78 2e 4d 2c 20 78       x.Y, x.M, x
5170: 2e 44 2c 20 78 2e 68 2c 20 78 2e 6d 2c 20 28 69  .D, x.h, x.m, (i
5180: 6e 74 29 28 78 2e 73 29 29 3b 0a 20 20 20 20 73  nt)(x.s));.    s
5190: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
51a0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75 66  xt(context, zBuf
51b0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
51c0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a 0a  NSIENT);.  }.}..
51d0: 2f 2a 0a 2a 2a 20 20 20 20 74 69 6d 65 28 20 54  /*.**    time( T
51e0: 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20  IMESTRING, MOD, 
51f0: 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  MOD, ...).**.** 
5200: 52 65 74 75 72 6e 20 48 48 3a 4d 4d 3a 53 53 0a  Return HH:MM:SS.
5210: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
5220: 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  imeFunc(.  sqlit
5230: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5240: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
5250: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5260: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 44 61 74   **argv.){.  Dat
5270: 65 54 69 6d 65 20 78 3b 0a 20 20 69 66 28 20 69  eTime x;.  if( i
5280: 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c 20 61  sDate(context, a
5290: 72 67 63 2c 20 61 72 67 76 2c 20 26 78 29 3d 3d  rgc, argv, &x)==
52a0: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  0 ){.    char zB
52b0: 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 63 6f 6d  uf[100];.    com
52c0: 70 75 74 65 48 4d 53 28 26 78 29 3b 0a 20 20 20  puteHMS(&x);.   
52d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
52e0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
52f0: 7a 42 75 66 2c 20 22 25 30 32 64 3a 25 30 32 64  zBuf, "%02d:%02d
5300: 3a 25 30 32 64 22 2c 20 78 2e 68 2c 20 78 2e 6d  :%02d", x.h, x.m
5310: 2c 20 28 69 6e 74 29 78 2e 73 29 3b 0a 20 20 20  , (int)x.s);.   
5320: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5330: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
5340: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
5350: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d  RANSIENT);.  }.}
5360: 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64 61 74 65 28  ../*.**    date(
5370: 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44   TIMESTRING, MOD
5380: 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  , MOD, ...).**.*
5390: 2a 20 52 65 74 75 72 6e 20 59 59 59 59 2d 4d 4d  * Return YYYY-MM
53a0: 2d 44 44 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  -DD.*/.static vo
53b0: 69 64 20 64 61 74 65 46 75 6e 63 28 0a 20 20 73  id dateFunc(.  s
53c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
53d0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
53e0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
53f0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5400: 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20 69   DateTime x;.  i
5410: 66 28 20 69 73 44 61 74 65 28 63 6f 6e 74 65 78  f( isDate(contex
5420: 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 26  t, argc, argv, &
5430: 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  x)==0 ){.    cha
5440: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20  r zBuf[100];.   
5450: 20 63 6f 6d 70 75 74 65 59 4d 44 28 26 78 29 3b   computeYMD(&x);
5460: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
5470: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
5480: 66 29 2c 20 7a 42 75 66 2c 20 22 25 30 34 64 2d  f), zBuf, "%04d-
5490: 25 30 32 64 2d 25 30 32 64 22 2c 20 78 2e 59 2c  %02d-%02d", x.Y,
54a0: 20 78 2e 4d 2c 20 78 2e 44 29 3b 0a 20 20 20 20   x.M, x.D);.    
54b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
54c0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42 75  ext(context, zBu
54d0: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
54e0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 7d 0a  ANSIENT);.  }.}.
54f0: 0a 2f 2a 0a 2a 2a 20 20 20 20 73 74 72 66 74 69  ./*.**    strfti
5500: 6d 65 28 20 46 4f 52 4d 41 54 2c 20 54 49 4d 45  me( FORMAT, TIME
5510: 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44  STRING, MOD, MOD
5520: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74  , ...).**.** Ret
5530: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 64 65 73  urn a string des
5540: 63 72 69 62 65 64 20 62 79 20 46 4f 52 4d 41 54  cribed by FORMAT
5550: 2e 20 20 43 6f 6e 76 65 72 73 69 6f 6e 73 20 61  .  Conversions a
5560: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
5570: 20 20 20 25 64 20 20 64 61 79 20 6f 66 20 6d 6f     %d  day of mo
5580: 6e 74 68 0a 2a 2a 20 20 20 25 66 20 20 2a 2a 20  nth.**   %f  ** 
5590: 66 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e  fractional secon
55a0: 64 73 20 20 53 53 2e 53 53 53 0a 2a 2a 20 20 20  ds  SS.SSS.**   
55b0: 25 48 20 20 68 6f 75 72 20 30 30 2d 32 34 0a 2a  %H  hour 00-24.*
55c0: 2a 20 20 20 25 6a 20 20 64 61 79 20 6f 66 20 79  *   %j  day of y
55d0: 65 61 72 20 30 30 30 2d 33 36 36 0a 2a 2a 20 20  ear 000-366.**  
55e0: 20 25 4a 20 20 2a 2a 20 4a 75 6c 69 61 6e 20 64   %J  ** Julian d
55f0: 61 79 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 25  ay number.**   %
5600: 6d 20 20 6d 6f 6e 74 68 20 30 31 2d 31 32 0a 2a  m  month 01-12.*
5610: 2a 20 20 20 25 4d 20 20 6d 69 6e 75 74 65 20 30  *   %M  minute 0
5620: 30 2d 35 39 0a 2a 2a 20 20 20 25 73 20 20 73 65  0-59.**   %s  se
5630: 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
5640: 2d 30 31 2d 30 31 0a 2a 2a 20 20 20 25 53 20 20  -01-01.**   %S  
5650: 73 65 63 6f 6e 64 73 20 30 30 2d 35 39 0a 2a 2a  seconds 00-59.**
5660: 20 20 20 25 77 20 20 64 61 79 20 6f 66 20 77 65     %w  day of we
5670: 65 6b 20 30 2d 36 20 20 73 75 6e 64 61 79 3d 3d  ek 0-6  sunday==
5680: 30 0a 2a 2a 20 20 20 25 57 20 20 77 65 65 6b 20  0.**   %W  week 
5690: 6f 66 20 79 65 61 72 20 30 30 2d 35 33 0a 2a 2a  of year 00-53.**
56a0: 20 20 20 25 59 20 20 79 65 61 72 20 30 30 30 30     %Y  year 0000
56b0: 2d 39 39 39 39 0a 2a 2a 20 20 20 25 25 20 20 25  -9999.**   %%  %
56c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
56d0: 73 74 72 66 74 69 6d 65 46 75 6e 63 28 0a 20 20  strftimeFunc(.  
56e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
56f0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
5700: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
5710: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
5720: 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20    DateTime x;.  
5730: 75 36 34 20 6e 3b 0a 20 20 73 69 7a 65 5f 74 20  u64 n;.  size_t 
5740: 69 2c 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  i,j;.  char *z;.
5750: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
5760: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
5770: 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
5780: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5790: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
57a0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
57b0: 20 20 69 66 28 20 7a 46 6d 74 3d 3d 30 20 7c 7c    if( zFmt==0 ||
57c0: 20 69 73 44 61 74 65 28 63 6f 6e 74 65 78 74 2c   isDate(context,
57d0: 20 61 72 67 63 2d 31 2c 20 61 72 67 76 2b 31 2c   argc-1, argv+1,
57e0: 20 26 78 29 20 29 20 72 65 74 75 72 6e 3b 0a 20   &x) ) return;. 
57f0: 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   db = sqlite3_co
5800: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
5810: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 66 6f 72 28  context);.  for(
5820: 69 3d 30 2c 20 6e 3d 31 3b 20 7a 46 6d 74 5b 69  i=0, n=1; zFmt[i
5830: 5d 3b 20 69 2b 2b 2c 20 6e 2b 2b 29 7b 0a 20 20  ]; i++, n++){.  
5840: 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27    if( zFmt[i]=='
5850: 25 27 20 29 7b 0a 20 20 20 20 20 20 73 77 69 74  %' ){.      swit
5860: 63 68 28 20 7a 46 6d 74 5b 69 2b 31 5d 20 29 7b  ch( zFmt[i+1] ){
5870: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 64  .        case 'd
5880: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
5890: 27 48 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73  'H':.        cas
58a0: 65 20 27 6d 27 3a 0a 20 20 20 20 20 20 20 20 63  e 'm':.        c
58b0: 61 73 65 20 27 4d 27 3a 0a 20 20 20 20 20 20 20  ase 'M':.       
58c0: 20 63 61 73 65 20 27 53 27 3a 0a 20 20 20 20 20   case 'S':.     
58d0: 20 20 20 63 61 73 65 20 27 57 27 3a 0a 20 20 20     case 'W':.   
58e0: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
58f0: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
5900: 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  ru */.        ca
5910: 73 65 20 27 77 27 3a 0a 20 20 20 20 20 20 20 20  se 'w':.        
5920: 63 61 73 65 20 27 25 27 3a 0a 20 20 20 20 20 20  case '%':.      
5930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5940: 20 20 20 63 61 73 65 20 27 66 27 3a 0a 20 20 20     case 'f':.   
5950: 20 20 20 20 20 20 20 6e 20 2b 3d 20 38 3b 0a 20         n += 8;. 
5960: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5970: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 6a 27          case 'j'
5980: 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d  :.          n +=
5990: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   3;.          br
59a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
59b0: 65 20 27 59 27 3a 0a 20 20 20 20 20 20 20 20 20  e 'Y':.         
59c0: 20 6e 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20   n += 8;.       
59d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
59e0: 20 20 63 61 73 65 20 27 73 27 3a 0a 20 20 20 20    case 's':.    
59f0: 20 20 20 20 63 61 73 65 20 27 4a 27 3a 0a 20 20      case 'J':.  
5a00: 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 35 30 3b          n += 50;
5a10: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5a20: 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c  ;.        defaul
5a30: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  t:.          ret
5a40: 75 72 6e 3b 20 20 2f 2a 20 45 52 52 4f 52 2e 20  urn;  /* ERROR. 
5a50: 20 72 65 74 75 72 6e 20 61 20 4e 55 4c 4c 20 2a   return a NULL *
5a60: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
5a70: 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i++;.    }.  }. 
5a80: 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 73 69   testcase( n==si
5a90: 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 3b 0a  zeof(zBuf)-1 );.
5aa0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 73    testcase( n==s
5ab0: 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 3b 0a 20  izeof(zBuf) );. 
5ac0: 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 28 75   testcase( n==(u
5ad0: 36 34 29 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  64)db->aLimit[SQ
5ae0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
5af0: 48 5d 2b 31 20 29 3b 0a 20 20 74 65 73 74 63 61  H]+1 );.  testca
5b00: 73 65 28 20 6e 3d 3d 28 75 36 34 29 64 62 2d 3e  se( n==(u64)db->
5b10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5b20: 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29 3b 0a 20  MIT_LENGTH] );. 
5b30: 20 69 66 28 20 6e 3c 73 69 7a 65 6f 66 28 7a 42   if( n<sizeof(zB
5b40: 75 66 29 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a  uf) ){.    z = z
5b50: 42 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Buf;.  }else if(
5b60: 20 6e 3e 28 75 36 34 29 64 62 2d 3e 61 4c 69 6d   n>(u64)db->aLim
5b70: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
5b80: 4c 45 4e 47 54 48 5d 20 29 7b 0a 20 20 20 20 73  LENGTH] ){.    s
5b90: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5ba0: 72 6f 72 5f 74 6f 6f 62 69 67 28 63 6f 6e 74 65  ror_toobig(conte
5bb0: 78 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  xt);.    return;
5bc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
5bd0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
5be0: 63 52 61 77 28 64 62 2c 20 28 69 6e 74 29 6e 29  cRaw(db, (int)n)
5bf0: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
5c00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
5c10: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
5c20: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
5c30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
5c40: 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4a 44  .  }.  computeJD
5c50: 28 26 78 29 3b 0a 20 20 63 6f 6d 70 75 74 65 59  (&x);.  computeY
5c60: 4d 44 5f 48 4d 53 28 26 78 29 3b 0a 20 20 66 6f  MD_HMS(&x);.  fo
5c70: 72 28 69 3d 6a 3d 30 3b 20 7a 46 6d 74 5b 69 5d  r(i=j=0; zFmt[i]
5c80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
5c90: 7a 46 6d 74 5b 69 5d 21 3d 27 25 27 20 29 7b 0a  zFmt[i]!='%' ){.
5ca0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
5cb0: 46 6d 74 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  Fmt[i];.    }els
5cc0: 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  e{.      i++;.  
5cd0: 20 20 20 20 73 77 69 74 63 68 28 20 7a 46 6d 74      switch( zFmt
5ce0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 63  [i] ){.        c
5cf0: 61 73 65 20 27 64 27 3a 20 20 73 71 6c 69 74 65  ase 'd':  sqlite
5d00: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a  3_snprintf(3, &z
5d10: 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 44 29 3b  [j],"%02d",x.D);
5d20: 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20   j+=2; break;.  
5d30: 20 20 20 20 20 20 63 61 73 65 20 27 66 27 3a 20        case 'f': 
5d40: 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  {.          doub
5d50: 6c 65 20 73 20 3d 20 78 2e 73 3b 0a 20 20 20 20  le s = x.s;.    
5d60: 20 20 20 20 20 20 69 66 28 20 73 3e 35 39 2e 39        if( s>59.9
5d70: 39 39 20 29 20 73 20 3d 20 35 39 2e 39 39 39 3b  99 ) s = 59.999;
5d80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5d90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 37 2c 20 26  e3_snprintf(7, &
5da0: 7a 5b 6a 5d 2c 22 25 30 36 2e 33 66 22 2c 20 73  z[j],"%06.3f", s
5db0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b  );.          j +
5dc0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5dd0: 30 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  0(&z[j]);.      
5de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5df0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
5e00: 65 20 27 48 27 3a 20 20 73 71 6c 69 74 65 33 5f  e 'H':  sqlite3_
5e10: 73 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a  snprintf(3, &z[j
5e20: 5d 2c 22 25 30 32 64 22 2c 78 2e 68 29 3b 20 6a  ],"%02d",x.h); j
5e30: 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  +=2; break;.    
5e40: 20 20 20 20 63 61 73 65 20 27 57 27 3a 20 2f 2a      case 'W': /*
5e50: 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   Fall thru */.  
5e60: 20 20 20 20 20 20 63 61 73 65 20 27 6a 27 3a 20        case 'j': 
5e70: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
5e80: 6e 44 61 79 3b 20 20 20 20 20 20 20 20 20 20 20  nDay;           
5e90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
5ea0: 61 79 73 20 73 69 6e 63 65 20 31 73 74 20 64 61  ays since 1st da
5eb0: 79 20 6f 66 20 79 65 61 72 20 2a 2f 0a 20 20 20  y of year */.   
5ec0: 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65 20         DateTime 
5ed0: 79 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20  y = x;.         
5ee0: 20 79 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a   y.validJD = 0;.
5ef0: 20 20 20 20 20 20 20 20 20 20 79 2e 4d 20 3d 20            y.M = 
5f00: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 79 2e 44  1;.          y.D
5f10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
5f20: 63 6f 6d 70 75 74 65 4a 44 28 26 79 29 3b 0a 20  computeJD(&y);. 
5f30: 20 20 20 20 20 20 20 20 20 6e 44 61 79 20 3d 20           nDay = 
5f40: 28 69 6e 74 29 28 28 78 2e 69 4a 44 2d 79 2e 69  (int)((x.iJD-y.i
5f50: 4a 44 2b 34 33 32 30 30 30 30 30 29 2f 38 36 34  JD+43200000)/864
5f60: 30 30 30 30 30 29 3b 0a 20 20 20 20 20 20 20 20  00000);.        
5f70: 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 3d 3d 27    if( zFmt[i]=='
5f80: 57 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  W' ){.          
5f90: 20 20 69 6e 74 20 77 64 3b 20 20 20 2f 2a 20 30    int wd;   /* 0
5fa0: 3d 4d 6f 6e 64 61 79 2c 20 31 3d 54 75 65 73 64  =Monday, 1=Tuesd
5fb0: 61 79 2c 20 2e 2e 2e 20 36 3d 53 75 6e 64 61 79  ay, ... 6=Sunday
5fc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5fd0: 77 64 20 3d 20 28 69 6e 74 29 28 28 28 78 2e 69  wd = (int)(((x.i
5fe0: 4a 44 2b 34 33 32 30 30 30 30 30 29 2f 38 36 34  JD+43200000)/864
5ff0: 30 30 30 30 30 29 25 37 29 3b 0a 20 20 20 20 20  00000)%7);.     
6000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6010: 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d  nprintf(3, &z[j]
6020: 2c 22 25 30 32 64 22 2c 28 6e 44 61 79 2b 37 2d  ,"%02d",(nDay+7-
6030: 77 64 29 2f 37 29 3b 0a 20 20 20 20 20 20 20 20  wd)/7);.        
6040: 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20 20 20      j += 2;.    
6050: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6060: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6070: 5f 73 6e 70 72 69 6e 74 66 28 34 2c 20 26 7a 5b  _snprintf(4, &z[
6080: 6a 5d 2c 22 25 30 33 64 22 2c 6e 44 61 79 2b 31  j],"%03d",nDay+1
6090: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
60a0: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
60b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
60c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
60d0: 20 20 20 20 20 20 63 61 73 65 20 27 4a 27 3a 20        case 'J': 
60e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
60f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c  te3_snprintf(20,
6100: 20 26 7a 5b 6a 5d 2c 22 25 2e 31 36 67 22 2c 78   &z[j],"%.16g",x
6110: 2e 69 4a 44 2f 38 36 34 30 30 30 30 30 2e 30 29  .iJD/86400000.0)
6120: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 3d 73  ;.          j+=s
6130: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26  qlite3Strlen30(&
6140: 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[j]);.         
6150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6160: 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  }.        case '
6170: 6d 27 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  m':  sqlite3_snp
6180: 72 69 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22  rintf(3, &z[j],"
6190: 25 30 32 64 22 2c 78 2e 4d 29 3b 20 6a 2b 3d 32  %02d",x.M); j+=2
61a0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
61b0: 20 63 61 73 65 20 27 4d 27 3a 20 20 73 71 6c 69   case 'M':  sqli
61c0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
61d0: 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 6d  &z[j],"%02d",x.m
61e0: 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a  ); j+=2; break;.
61f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 73 27          case 's'
6200: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  : {.          sq
6210: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
6220: 30 2c 26 7a 5b 6a 5d 2c 22 25 6c 6c 64 22 2c 0a  0,&z[j],"%lld",.
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29             (i64)
6250: 28 78 2e 69 4a 44 2f 31 30 30 30 20 2d 20 32 31  (x.iJD/1000 - 21
6260: 30 38 36 36 37 36 2a 28 69 36 34 29 31 30 30 30  086676*(i64)1000
6270: 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a  0));.          j
6280: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
6290: 6e 33 30 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20  n30(&z[j]);.    
62a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
62b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
62c0: 61 73 65 20 27 53 27 3a 20 20 73 71 6c 69 74 65  ase 'S':  sqlite
62d0: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 26 7a 5b  3_snprintf(3,&z[
62e0: 6a 5d 2c 22 25 30 32 64 22 2c 28 69 6e 74 29 78  j],"%02d",(int)x
62f0: 2e 73 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b  .s); j+=2; break
6300: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
6310: 77 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  w': {.          
6320: 7a 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72 29 28  z[j++] = (char)(
6330: 28 28 78 2e 69 4a 44 2b 31 32 39 36 30 30 30 30  ((x.iJD+12960000
6340: 30 29 2f 38 36 34 30 30 30 30 30 29 20 25 20 37  0)/86400000) % 7
6350: 29 20 2b 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ) + '0';.       
6360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6370: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
6380: 20 27 59 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'Y': {.        
6390: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
63a0: 74 66 28 35 2c 26 7a 5b 6a 5d 2c 22 25 30 34 64  tf(5,&z[j],"%04d
63b0: 22 2c 78 2e 59 29 3b 20 6a 2b 3d 73 71 6c 69 74  ",x.Y); j+=sqlit
63c0: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 5b 6a 5d  e3Strlen30(&z[j]
63d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
63e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
63f0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
6400: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 25 27 3b 20 62   z[j++] = '%'; b
6410: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6420: 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d    }.  }.  z[j] =
6430: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
6440: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
6450: 74 2c 20 7a 2c 20 2d 31 2c 0a 20 20 20 20 20 20  t, z, -1,.      
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 7a 3d 3d 7a 42 75 66 20 3f 20 53 51 4c 49 54 45  z==zBuf ? SQLITE
6480: 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 53 51 4c  _TRANSIENT : SQL
6490: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 7d 0a  ITE_DYNAMIC);.}.
64a0: 0a 2f 2a 0a 2a 2a 20 63 75 72 72 65 6e 74 5f 74  ./*.** current_t
64b0: 69 6d 65 28 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ime().**.** This
64c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
64d0: 73 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  s the same value
64e0: 20 61 73 20 74 69 6d 65 28 27 6e 6f 77 27 29 2e   as time('now').
64f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6500: 63 74 69 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c  ctimeFunc(.  sql
6510: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6520: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74  ntext,.  int Not
6530: 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  Used,.  sqlite3_
6540: 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32  value **NotUsed2
6550: 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
6560: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
6570: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 74 69   NotUsed2);.  ti
6580: 6d 65 46 75 6e 63 28 63 6f 6e 74 65 78 74 2c 20  meFunc(context, 
6590: 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
65a0: 63 75 72 72 65 6e 74 5f 64 61 74 65 28 29 0a 2a  current_date().*
65b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
65c0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
65d0: 61 6d 65 20 76 61 6c 75 65 20 61 73 20 64 61 74  ame value as dat
65e0: 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74 61  e('now')..*/.sta
65f0: 74 69 63 20 76 6f 69 64 20 63 64 61 74 65 46 75  tic void cdateFu
6600: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
6610: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
6620: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
6630: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
6640: 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 55  *NotUsed2.){.  U
6650: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
6660: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
6670: 64 32 29 3b 0a 20 20 64 61 74 65 46 75 6e 63 28  d2);.  dateFunc(
6680: 63 6f 6e 74 65 78 74 2c 20 30 2c 20 30 29 3b 0a  context, 0, 0);.
6690: 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72 72 65 6e 74  }../*.** current
66a0: 5f 74 69 6d 65 73 74 61 6d 70 28 29 0a 2a 2a 0a  _timestamp().**.
66b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
66c0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d   returns the sam
66d0: 65 20 76 61 6c 75 65 20 61 73 20 64 61 74 65 74  e value as datet
66e0: 69 6d 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73  ime('now')..*/.s
66f0: 74 61 74 69 63 20 76 6f 69 64 20 63 74 69 6d 65  tatic void ctime
6700: 73 74 61 6d 70 46 75 6e 63 28 0a 20 20 73 71 6c  stampFunc(.  sql
6710: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6720: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74  ntext,.  int Not
6730: 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f  Used,.  sqlite3_
6740: 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32  value **NotUsed2
6750: 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
6760: 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
6770: 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 64 61   NotUsed2);.  da
6780: 74 65 74 69 6d 65 46 75 6e 63 28 63 6f 6e 74 65  tetimeFunc(conte
6790: 78 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 23 65 6e  xt, 0, 0);.}.#en
67a0: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
67b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45  SQLITE_OMIT_DATE
67c0: 54 49 4d 45 5f 46 55 4e 43 53 29 20 2a 2f 0a 0a  TIME_FUNCS) */..
67d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
67e0: 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55 4e 43  IT_DATETIME_FUNC
67f0: 53 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  S./*.** If the l
6800: 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c  ibrary is compil
6810: 65 64 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 66  ed to omit the f
6820: 75 6c 6c 2d 73 63 61 6c 65 20 64 61 74 65 20 61  ull-scale date a
6830: 6e 64 20 74 69 6d 65 0a 2a 2a 20 68 61 6e 64 6c  nd time.** handl
6840: 69 6e 67 20 28 74 6f 20 67 65 74 20 61 20 73 6d  ing (to get a sm
6850: 61 6c 6c 65 72 20 62 69 6e 61 72 79 29 2c 20 74  aller binary), t
6860: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 69 6e  he following min
6870: 69 6d 61 6c 20 76 65 72 73 69 6f 6e 0a 2a 2a 20  imal version.** 
6880: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  of the functions
6890: 20 63 75 72 72 65 6e 74 5f 74 69 6d 65 28 29 2c   current_time(),
68a0: 20 63 75 72 72 65 6e 74 5f 64 61 74 65 28 29 20   current_date() 
68b0: 61 6e 64 20 63 75 72 72 65 6e 74 5f 74 69 6d 65  and current_time
68c0: 73 74 61 6d 70 28 29 0a 2a 2a 20 61 72 65 20 69  stamp().** are i
68d0: 6e 63 6c 75 64 65 64 20 69 6e 73 74 65 61 64 2e  ncluded instead.
68e0: 20 54 68 69 73 20 69 73 20 74 6f 20 73 75 70 70   This is to supp
68f0: 6f 72 74 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ort column decla
6900: 72 61 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  rations that.** 
6910: 69 6e 63 6c 75 64 65 20 22 44 45 46 41 55 4c 54  include "DEFAULT
6920: 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 20 65   CURRENT_TIME" e
6930: 74 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  tc..**.** This f
6940: 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74 68 65  unction uses the
6950: 20 43 2d 6c 69 62 72 61 72 79 20 66 75 6e 63 74   C-library funct
6960: 69 6f 6e 73 20 74 69 6d 65 28 29 2c 20 67 6d 74  ions time(), gmt
6970: 69 6d 65 28 29 0a 2a 2a 20 61 6e 64 20 73 74 72  ime().** and str
6980: 66 74 69 6d 65 28 29 2e 20 54 68 65 20 66 6f 72  ftime(). The for
6990: 6d 61 74 20 73 74 72 69 6e 67 20 74 6f 20 70 61  mat string to pa
69a0: 73 73 20 74 6f 20 73 74 72 66 74 69 6d 65 28 29  ss to strftime()
69b0: 20 69 73 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20   is supplied.** 
69c0: 61 73 20 74 68 65 20 75 73 65 72 2d 64 61 74 61  as the user-data
69d0: 20 66 6f 72 20 74 68 65 20 66 75 6e 63 74 69 6f   for the functio
69e0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
69f0: 64 20 63 75 72 72 65 6e 74 54 69 6d 65 46 75 6e  d currentTimeFun
6a00: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
6a10: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6a20: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6a30: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6a40: 76 0a 29 7b 0a 20 20 74 69 6d 65 5f 74 20 74 3b  v.){.  time_t t;
6a50: 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  .  char *zFormat
6a60: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
6a70: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
6a80: 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  text);.  sqlite3
6a90: 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
6aa0: 69 6e 74 36 34 20 69 54 3b 0a 20 20 63 68 61 72  int64 iT;.  char
6ab0: 20 7a 42 75 66 5b 32 30 5d 3b 0a 0a 20 20 55 4e   zBuf[20];..  UN
6ac0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
6ad0: 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
6ae0: 41 52 41 4d 45 54 45 52 28 61 72 67 76 29 3b 0a  ARAMETER(argv);.
6af0: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
6b00: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
6b10: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71  e(context);.  sq
6b20: 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
6b30: 6d 65 49 6e 74 36 34 28 64 62 2d 3e 70 56 66 73  meInt64(db->pVfs
6b40: 2c 20 26 69 54 29 3b 0a 20 20 74 20 3d 20 69 54  , &iT);.  t = iT
6b50: 2f 31 30 30 30 20 2d 20 31 30 30 30 30 2a 28 73  /1000 - 10000*(s
6b60: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 31 30  qlite3_int64)210
6b70: 38 36 36 37 36 3b 0a 23 69 66 64 65 66 20 48 41  86676;.#ifdef HA
6b80: 56 45 5f 47 4d 54 49 4d 45 5f 52 0a 20 20 7b 0a  VE_GMTIME_R.  {.
6b90: 20 20 20 20 73 74 72 75 63 74 20 74 6d 20 73 4e      struct tm sN
6ba0: 6f 77 3b 0a 20 20 20 20 67 6d 74 69 6d 65 5f 72  ow;.    gmtime_r
6bb0: 28 26 74 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 20  (&t, &sNow);.   
6bc0: 20 73 74 72 66 74 69 6d 65 28 7a 42 75 66 2c 20   strftime(zBuf, 
6bd0: 32 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 26 73 4e  20, zFormat, &sN
6be0: 6f 77 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ow);.  }.#else. 
6bf0: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 74 6d   {.    struct tm
6c00: 20 2a 70 54 6d 3b 0a 20 20 20 20 73 71 6c 69 74   *pTm;.    sqlit
6c10: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
6c20: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
6c30: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6c40: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 20  ATIC_MASTER));. 
6c50: 20 20 20 70 54 6d 20 3d 20 67 6d 74 69 6d 65 28     pTm = gmtime(
6c60: 26 74 29 3b 0a 20 20 20 20 73 74 72 66 74 69 6d  &t);.    strftim
6c70: 65 28 7a 42 75 66 2c 20 32 30 2c 20 7a 46 6f 72  e(zBuf, 20, zFor
6c80: 6d 61 74 2c 20 70 54 6d 29 3b 0a 20 20 20 20 73  mat, pTm);.    s
6c90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6ca0: 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
6cb0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6cc0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
6cd0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
6ce0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
6cf0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 42  text(context, zB
6d00: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
6d10: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e  RANSIENT);.}.#en
6d20: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
6d30: 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74 65  function registe
6d40: 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  red all of the a
6d50: 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f 6e 73  bove C functions
6d60: 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74   as SQL.** funct
6d70: 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68 6f 75  ions.  This shou
6d80: 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 72  ld be the only r
6d90: 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20 66  outine in this f
6da0: 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78 74 65  ile with.** exte
6db0: 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a 2f  rnal linkage..*/
6dc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 67  .void sqlite3Reg
6dd0: 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75 6e  isterDateTimeFun
6de0: 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20  ctions(void){.  
6df0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 57 53  static SQLITE_WS
6e00: 44 20 46 75 6e 63 44 65 66 20 61 44 61 74 65 54  D FuncDef aDateT
6e10: 69 6d 65 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 23  imeFuncs[] = {.#
6e20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6e30: 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55 4e 43  IT_DATETIME_FUNC
6e40: 53 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 6a  S.    FUNCTION(j
6e50: 75 6c 69 61 6e 64 61 79 2c 20 20 20 20 20 20 20  ulianday,       
6e60: 20 2d 31 2c 20 30 2c 20 30 2c 20 6a 75 6c 69 61   -1, 0, 0, julia
6e70: 6e 64 61 79 46 75 6e 63 20 29 2c 0a 20 20 20 20  ndayFunc ),.    
6e80: 46 55 4e 43 54 49 4f 4e 28 64 61 74 65 2c 20 20  FUNCTION(date,  
6e90: 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30             -1, 0
6ea0: 2c 20 30 2c 20 64 61 74 65 46 75 6e 63 20 20 20  , 0, dateFunc   
6eb0: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
6ec0: 4f 4e 28 74 69 6d 65 2c 20 20 20 20 20 20 20 20  ON(time,        
6ed0: 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 74       -1, 0, 0, t
6ee0: 69 6d 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a  imeFunc      ),.
6ef0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 64 61 74      FUNCTION(dat
6f00: 65 74 69 6d 65 2c 20 20 20 20 20 20 20 20 20 2d  etime,         -
6f10: 31 2c 20 30 2c 20 30 2c 20 64 61 74 65 74 69 6d  1, 0, 0, datetim
6f20: 65 46 75 6e 63 20 20 29 2c 0a 20 20 20 20 46 55  eFunc  ),.    FU
6f30: 4e 43 54 49 4f 4e 28 73 74 72 66 74 69 6d 65 2c  NCTION(strftime,
6f40: 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20           -1, 0, 
6f50: 30 2c 20 73 74 72 66 74 69 6d 65 46 75 6e 63 20  0, strftimeFunc 
6f60: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
6f70: 28 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 20  (current_time,  
6f80: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 63 74 69      0, 0, 0, cti
6f90: 6d 65 46 75 6e 63 20 20 20 20 20 29 2c 0a 20 20  meFunc     ),.  
6fa0: 20 20 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65    FUNCTION(curre
6fb0: 6e 74 5f 74 69 6d 65 73 74 61 6d 70 2c 20 30 2c  nt_timestamp, 0,
6fc0: 20 30 2c 20 30 2c 20 63 74 69 6d 65 73 74 61 6d   0, 0, ctimestam
6fd0: 70 46 75 6e 63 29 2c 0a 20 20 20 20 46 55 4e 43  pFunc),.    FUNC
6fe0: 54 49 4f 4e 28 63 75 72 72 65 6e 74 5f 64 61 74  TION(current_dat
6ff0: 65 2c 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c  e,      0, 0, 0,
7000: 20 63 64 61 74 65 46 75 6e 63 20 20 20 20 20 29   cdateFunc     )
7010: 2c 0a 23 65 6c 73 65 0a 20 20 20 20 53 54 52 5f  ,.#else.    STR_
7020: 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 6e 74  FUNCTION(current
7030: 5f 74 69 6d 65 2c 20 20 20 20 20 20 30 2c 20 22  _time,      0, "
7040: 25 48 3a 25 4d 3a 25 53 22 2c 20 20 20 20 20 20  %H:%M:%S",      
7050: 20 20 20 20 30 2c 20 63 75 72 72 65 6e 74 54 69      0, currentTi
7060: 6d 65 46 75 6e 63 29 2c 0a 20 20 20 20 53 54 52  meFunc),.    STR
7070: 5f 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 6e  _FUNCTION(curren
7080: 74 5f 64 61 74 65 2c 20 20 20 20 20 20 30 2c 20  t_date,      0, 
7090: 22 25 59 2d 25 6d 2d 25 64 22 2c 20 20 20 20 20  "%Y-%m-%d",     
70a0: 20 20 20 20 20 30 2c 20 63 75 72 72 65 6e 74 54       0, currentT
70b0: 69 6d 65 46 75 6e 63 29 2c 0a 20 20 20 20 53 54  imeFunc),.    ST
70c0: 52 5f 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65  R_FUNCTION(curre
70d0: 6e 74 5f 74 69 6d 65 73 74 61 6d 70 2c 20 30 2c  nt_timestamp, 0,
70e0: 20 22 25 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d   "%Y-%m-%d %H:%M
70f0: 3a 25 53 22 2c 20 30 2c 20 63 75 72 72 65 6e 74  :%S", 0, current
7100: 54 69 6d 65 46 75 6e 63 29 2c 0a 23 65 6e 64 69  TimeFunc),.#endi
7110: 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  f.  };.  int i;.
7120: 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70    FuncDefHash *p
7130: 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46  Hash = &GLOBAL(F
7140: 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69  uncDefHash, sqli
7150: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
7160: 6e 73 29 3b 0a 20 20 46 75 6e 63 44 65 66 20 2a  ns);.  FuncDef *
7170: 61 46 75 6e 63 20 3d 20 28 46 75 6e 63 44 65 66  aFunc = (FuncDef
7180: 2a 29 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65  *)&GLOBAL(FuncDe
7190: 66 2c 20 61 44 61 74 65 54 69 6d 65 46 75 6e 63  f, aDateTimeFunc
71a0: 73 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  s);..  for(i=0; 
71b0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 44 61 74  i<ArraySize(aDat
71c0: 65 54 69 6d 65 46 75 6e 63 73 29 3b 20 69 2b 2b  eTimeFuncs); i++
71d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 75  ){.    sqlite3Fu
71e0: 6e 63 44 65 66 49 6e 73 65 72 74 28 70 48 61 73  ncDefInsert(pHas
71f0: 68 2c 20 26 61 46 75 6e 63 5b 69 5d 29 3b 0a 20  h, &aFunc[i]);. 
7200: 20 7d 0a 7d 0a                                    }.}.