/ Hex Artifact Content
Login

Artifact a80b33f6e70d619978622547d2c78ab8b036b31a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 4f 63 74 6f 62  /*.** 2003 Octob
0010: 65 72 20 33 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 31.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c  ****.** This fil
0180: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  e contains the C
0190: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
01a0: 69 6d 70 6c 65 6d 65 6e 74 20 64 61 74 65 20 61  implement date a
01b0: 6e 64 20 74 69 6d 65 0a 2a 2a 20 66 75 6e 63 74  nd time.** funct
01c0: 69 6f 6e 73 20 66 6f 72 20 53 51 4c 69 74 65 2e  ions for SQLite.
01d0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69    .**.** There i
01e0: 73 20 6f 6e 6c 79 20 6f 6e 65 20 65 78 70 6f 72  s only one expor
01f0: 74 65 64 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  ted symbol in th
0200: 69 73 20 66 69 6c 65 20 2d 20 74 68 65 20 66 75  is file - the fu
0210: 6e 63 74 69 6f 6e 0a 2a 2a 20 73 71 6c 69 74 65  nction.** sqlite
0220: 33 52 65 67 69 73 74 65 72 44 61 74 65 54 69 6d  3RegisterDateTim
0230: 65 46 75 6e 63 74 69 6f 6e 73 28 29 20 66 6f 75  eFunctions() fou
0240: 6e 64 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  nd at the bottom
0250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   of the file..**
0260: 20 41 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20   All other code 
0270: 68 61 73 20 66 69 6c 65 20 73 63 6f 70 65 2e 0a  has file scope..
0280: 2a 2a 0a 2a 2a 20 24 49 64 3a 20 64 61 74 65 2e  **.** $Id: date.
0290: 63 2c 76 20 31 2e 37 31 20 32 30 30 37 2f 30 38  c,v 1.71 2007/08
02a0: 2f 32 31 20 31 39 3a 33 33 3a 35 36 20 64 72 68  /21 19:33:56 drh
02b0: 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 53 51 4c   Exp $.**.** SQL
02c0: 69 74 65 20 70 72 6f 63 65 73 73 65 73 20 61 6c  ite processes al
02d0: 6c 20 74 69 6d 65 73 20 61 6e 64 20 64 61 74 65  l times and date
02e0: 73 20 61 73 20 4a 75 6c 69 61 6e 20 44 61 79 20  s as Julian Day 
02f0: 6e 75 6d 62 65 72 73 2e 20 20 54 68 65 0a 2a 2a  numbers.  The.**
0300: 20 64 61 74 65 73 20 61 6e 64 20 74 69 6d 65 73   dates and times
0310: 20 61 72 65 20 73 74 6f 72 65 64 20 61 73 20 74   are stored as t
0320: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 61 79  he number of day
0330: 73 20 73 69 6e 63 65 20 6e 6f 6f 6e 0a 2a 2a 20  s since noon.** 
0340: 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
0350: 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
0360: 34 20 42 2e 43 2e 20 61 63 63 6f 72 64 69 6e 67  4 B.C. according
0370: 20 74 6f 20 74 68 65 20 47 72 65 67 6f 72 69 61   to the Gregoria
0380: 6e 0a 2a 2a 20 63 61 6c 65 6e 64 61 72 20 73 79  n.** calendar sy
0390: 73 74 65 6d 2e 20 0a 2a 2a 0a 2a 2a 20 31 39 37  stem. .**.** 197
03a0: 30 2d 30 31 2d 30 31 20 30 30 3a 30 30 3a 30 30  0-01-01 00:00:00
03b0: 20 69 73 20 4a 44 20 32 34 34 30 35 38 37 2e 35   is JD 2440587.5
03c0: 0a 2a 2a 20 32 30 30 30 2d 30 31 2d 30 31 20 30  .** 2000-01-01 0
03d0: 30 3a 30 30 3a 30 30 20 69 73 20 4a 44 20 32 34  0:00:00 is JD 24
03e0: 35 31 35 34 34 2e 35 0a 2a 2a 0a 2a 2a 20 54 68  51544.5.**.** Th
03f0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 69 6f 6e 20  is implemention 
0400: 72 65 71 75 69 72 65 73 20 79 65 61 72 73 20 74  requires years t
0410: 6f 20 62 65 20 65 78 70 72 65 73 73 65 64 20 61  o be expressed a
0420: 73 20 61 20 34 2d 64 69 67 69 74 20 6e 75 6d 62  s a 4-digit numb
0430: 65 72 0a 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e  er.** which mean
0440: 73 20 74 68 61 74 20 6f 6e 6c 79 20 64 61 74 65  s that only date
0450: 73 20 62 65 74 77 65 65 6e 20 30 30 30 30 2d 30  s between 0000-0
0460: 31 2d 30 31 20 61 6e 64 20 39 39 39 39 2d 31 32  1-01 and 9999-12
0470: 2d 33 31 20 63 61 6e 0a 2a 2a 20 62 65 20 72 65  -31 can.** be re
0480: 70 72 65 73 65 6e 74 65 64 2c 20 65 76 65 6e 20  presented, even 
0490: 74 68 6f 75 67 68 20 6a 75 6c 69 61 6e 20 64 61  though julian da
04a0: 79 20 6e 75 6d 62 65 72 73 20 61 6c 6c 6f 77 20  y numbers allow 
04b0: 61 20 6d 75 63 68 20 77 69 64 65 72 0a 2a 2a 20  a much wider.** 
04c0: 72 61 6e 67 65 20 6f 66 20 64 61 74 65 73 2e 0a  range of dates..
04d0: 2a 2a 0a 2a 2a 20 54 68 65 20 47 72 65 67 6f 72  **.** The Gregor
04e0: 69 61 6e 20 63 61 6c 65 6e 64 61 72 20 73 79 73  ian calendar sys
04f0: 74 65 6d 20 69 73 20 75 73 65 64 20 66 6f 72 20  tem is used for 
0500: 61 6c 6c 20 64 61 74 65 73 20 61 6e 64 20 74 69  all dates and ti
0510: 6d 65 73 2c 0a 2a 2a 20 65 76 65 6e 20 74 68 6f  mes,.** even tho
0520: 73 65 20 74 68 61 74 20 70 72 65 64 61 74 65 20  se that predate 
0530: 74 68 65 20 47 72 65 67 6f 72 69 61 6e 20 63 61  the Gregorian ca
0540: 6c 65 6e 64 61 72 2e 20 20 48 69 73 74 6f 72 69  lendar.  Histori
0550: 61 6e 73 20 75 73 75 61 6c 6c 79 0a 2a 2a 20 75  ans usually.** u
0560: 73 65 20 74 68 65 20 4a 75 6c 69 61 6e 20 63 61  se the Julian ca
0570: 6c 65 6e 64 61 72 20 66 6f 72 20 64 61 74 65 73  lendar for dates
0580: 20 70 72 69 6f 72 20 74 6f 20 31 35 38 32 2d 31   prior to 1582-1
0590: 30 2d 31 35 20 61 6e 64 20 66 6f 72 20 73 6f 6d  0-15 and for som
05a0: 65 0a 2a 2a 20 64 61 74 65 73 20 61 66 74 65 72  e.** dates after
05b0: 77 61 72 64 73 2c 20 64 65 70 65 6e 64 69 6e 67  wards, depending
05c0: 20 6f 6e 20 6c 6f 63 61 6c 65 2e 20 20 42 65 77   on locale.  Bew
05d0: 61 72 65 20 6f 66 20 74 68 69 73 20 64 69 66 66  are of this diff
05e0: 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erence..**.** Th
05f0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 61 6c 67  e conversion alg
0600: 6f 72 69 74 68 6d 73 20 61 72 65 20 69 6d 70 6c  orithms are impl
0610: 65 6d 65 6e 74 65 64 20 62 61 73 65 64 20 6f 6e  emented based on
0620: 20 64 65 73 63 72 69 70 74 69 6f 6e 73 0a 2a 2a   descriptions.**
0630: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
0640: 67 20 74 65 78 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  g text:.**.**   
0650: 20 20 20 4a 65 61 6e 20 4d 65 65 75 73 0a 2a 2a     Jean Meeus.**
0660: 20 20 20 20 20 20 41 73 74 72 6f 6e 6f 6d 69 63        Astronomic
0670: 61 6c 20 41 6c 67 6f 72 69 74 68 6d 73 2c 20 32  al Algorithms, 2
0680: 6e 64 20 45 64 69 74 69 6f 6e 2c 20 31 39 39 38  nd Edition, 1998
0690: 0a 2a 2a 20 20 20 20 20 20 49 53 42 4d 20 30 2d  .**      ISBM 0-
06a0: 39 34 33 33 39 36 2d 36 31 2d 31 0a 2a 2a 20 20  943396-61-1.**  
06b0: 20 20 20 20 57 69 6c 6c 6d 61 6e 6e 2d 42 65 6c      Willmann-Bel
06c0: 6c 2c 20 49 6e 63 0a 2a 2a 20 20 20 20 20 20 52  l, Inc.**      R
06d0: 69 63 68 6d 6f 6e 64 2c 20 56 69 72 67 69 6e 69  ichmond, Virgini
06e0: 61 20 28 55 53 41 29 0a 2a 2f 0a 23 69 6e 63 6c  a (USA).*/.#incl
06f0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0700: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70  ".#include <ctyp
0710: 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  e.h>.#include <s
0720: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
0730: 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e  e <assert.h>.#in
0740: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 0a  clude <time.h>..
0750: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0760: 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55 4e  MIT_DATETIME_FUN
0770: 43 53 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  CS../*.** A stru
0780: 63 74 75 72 65 20 66 6f 72 20 68 6f 6c 64 69 6e  cture for holdin
0790: 67 20 61 20 73 69 6e 67 6c 65 20 64 61 74 65 20  g a single date 
07a0: 61 6e 64 20 74 69 6d 65 2e 0a 2a 2f 0a 74 79 70  and time..*/.typ
07b0: 65 64 65 66 20 73 74 72 75 63 74 20 44 61 74 65  edef struct Date
07c0: 54 69 6d 65 20 44 61 74 65 54 69 6d 65 3b 0a 73  Time DateTime;.s
07d0: 74 72 75 63 74 20 44 61 74 65 54 69 6d 65 20 7b  truct DateTime {
07e0: 0a 20 20 64 6f 75 62 6c 65 20 72 4a 44 3b 20 20  .  double rJD;  
07f0: 20 20 20 20 2f 2a 20 54 68 65 20 6a 75 6c 69 61      /* The julia
0800: 6e 20 64 61 79 20 6e 75 6d 62 65 72 20 2a 2f 0a  n day number */.
0810: 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 3b 20 20    int Y, M, D;  
0820: 20 20 20 2f 2a 20 59 65 61 72 2c 20 6d 6f 6e 74     /* Year, mont
0830: 68 2c 20 61 6e 64 20 64 61 79 20 2a 2f 0a 20 20  h, and day */.  
0840: 69 6e 74 20 68 2c 20 6d 3b 20 20 20 20 20 20 20  int h, m;       
0850: 20 2f 2a 20 48 6f 75 72 20 61 6e 64 20 6d 69 6e   /* Hour and min
0860: 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 74 7a  utes */.  int tz
0870: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 69  ;          /* Ti
0880: 6d 65 7a 6f 6e 65 20 6f 66 66 73 65 74 20 69 6e  mezone offset in
0890: 20 6d 69 6e 75 74 65 73 20 2a 2f 0a 20 20 64 6f   minutes */.  do
08a0: 75 62 6c 65 20 73 3b 20 20 20 20 20 20 20 20 2f  uble s;        /
08b0: 2a 20 53 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 63  * Seconds */.  c
08c0: 68 61 72 20 76 61 6c 69 64 59 4d 44 3b 20 20 20  har validYMD;   
08d0: 2f 2a 20 54 72 75 65 20 69 66 20 59 2c 4d 2c 44  /* True if Y,M,D
08e0: 20 61 72 65 20 76 61 6c 69 64 20 2a 2f 0a 20 20   are valid */.  
08f0: 63 68 61 72 20 76 61 6c 69 64 48 4d 53 3b 20 20  char validHMS;  
0900: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 2c 6d 2c   /* True if h,m,
0910: 73 20 61 72 65 20 76 61 6c 69 64 20 2a 2f 0a 20  s are valid */. 
0920: 20 63 68 61 72 20 76 61 6c 69 64 4a 44 3b 20 20   char validJD;  
0930: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 4a 44    /* True if rJD
0940: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 63   is valid */.  c
0950: 68 61 72 20 76 61 6c 69 64 54 5a 3b 20 20 20 20  har validTZ;    
0960: 2f 2a 20 54 72 75 65 20 69 66 20 74 7a 20 69 73  /* True if tz is
0970: 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a 0a 0a 2f   valid */.};.../
0980: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 7a 44 61  *.** Convert zDa
0990: 74 65 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  te into one or m
09a0: 6f 72 65 20 69 6e 74 65 67 65 72 73 2e 20 20 41  ore integers.  A
09b0: 64 64 69 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65  dditional argume
09c0: 6e 74 73 0a 2a 2a 20 63 6f 6d 65 20 69 6e 20 67  nts.** come in g
09d0: 72 6f 75 70 73 20 6f 66 20 35 20 61 73 20 66 6f  roups of 5 as fo
09e0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
09f0: 20 20 20 4e 20 20 20 20 20 20 20 6e 75 6d 62 65     N       numbe
0a00: 72 20 6f 66 20 64 69 67 69 74 73 20 69 6e 20 74  r of digits in t
0a10: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  he integer.**   
0a20: 20 20 20 20 6d 69 6e 20 20 20 20 20 6d 69 6e 69      min     mini
0a30: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75  mum allowed valu
0a40: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
0a50: 0a 2a 2a 20 20 20 20 20 20 20 6d 61 78 20 20 20  .**       max   
0a60: 20 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65    maximum allowe
0a70: 64 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69  d value of the i
0a80: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  nteger.**       
0a90: 6e 65 78 74 43 20 20 20 66 69 72 73 74 20 63 68  nextC   first ch
0aa0: 61 72 61 63 74 65 72 20 61 66 74 65 72 20 74 68  aracter after th
0ab0: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  e integer.**    
0ac0: 20 20 20 70 56 61 6c 20 20 20 20 77 68 65 72 65     pVal    where
0ad0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e   to write the in
0ae0: 74 65 67 65 72 73 20 76 61 6c 75 65 2e 0a 2a 2a  tegers value..**
0af0: 0a 2a 2a 20 43 6f 6e 76 65 72 73 69 6f 6e 73 20  .** Conversions 
0b00: 63 6f 6e 74 69 6e 75 65 20 75 6e 74 69 6c 20 6f  continue until o
0b10: 6e 65 20 77 69 74 68 20 6e 65 78 74 43 3d 3d 30  ne with nextC==0
0b20: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e   is encountered.
0b30: 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  .** The function
0b40: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
0b50: 62 65 72 20 6f 66 20 73 75 63 63 65 73 73 66 75  ber of successfu
0b60: 6c 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 0a 2a  l conversions..*
0b70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
0b80: 44 69 67 69 74 73 28 63 6f 6e 73 74 20 63 68 61  Digits(const cha
0b90: 72 20 2a 7a 44 61 74 65 2c 20 2e 2e 2e 29 7b 0a  r *zDate, ...){.
0ba0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
0bb0: 69 6e 74 20 76 61 6c 3b 0a 20 20 69 6e 74 20 4e  int val;.  int N
0bc0: 3b 0a 20 20 69 6e 74 20 6d 69 6e 3b 0a 20 20 69  ;.  int min;.  i
0bd0: 6e 74 20 6d 61 78 3b 0a 20 20 69 6e 74 20 6e 65  nt max;.  int ne
0be0: 78 74 43 3b 0a 20 20 69 6e 74 20 2a 70 56 61 6c  xtC;.  int *pVal
0bf0: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
0c00: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
0c10: 7a 44 61 74 65 29 3b 0a 20 20 64 6f 7b 0a 20 20  zDate);.  do{.  
0c20: 20 20 4e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c    N = va_arg(ap,
0c30: 20 69 6e 74 29 3b 0a 20 20 20 20 6d 69 6e 20 3d   int);.    min =
0c40: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
0c50: 3b 0a 20 20 20 20 6d 61 78 20 3d 20 76 61 5f 61  ;.    max = va_a
0c60: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
0c70: 20 6e 65 78 74 43 20 3d 20 76 61 5f 61 72 67 28   nextC = va_arg(
0c80: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 70 56  ap, int);.    pV
0c90: 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
0ca0: 69 6e 74 2a 29 3b 0a 20 20 20 20 76 61 6c 20 3d  int*);.    val =
0cb0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e   0;.    while( N
0cc0: 2d 2d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  -- ){.      if( 
0cd0: 21 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29 7a  !isdigit(*(u8*)z
0ce0: 44 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Date) ){.       
0cf0: 20 67 6f 74 6f 20 65 6e 64 5f 67 65 74 44 69 67   goto end_getDig
0d00: 69 74 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  its;.      }.   
0d10: 20 20 20 76 61 6c 20 3d 20 76 61 6c 2a 31 30 20     val = val*10 
0d20: 2b 20 2a 7a 44 61 74 65 20 2d 20 27 30 27 3b 0a  + *zDate - '0';.
0d30: 20 20 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20        zDate++;. 
0d40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c     }.    if( val
0d50: 3c 6d 69 6e 20 7c 7c 20 76 61 6c 3e 6d 61 78 20  <min || val>max 
0d60: 7c 7c 20 28 6e 65 78 74 43 21 3d 30 20 26 26 20  || (nextC!=0 && 
0d70: 6e 65 78 74 43 21 3d 2a 7a 44 61 74 65 29 20 29  nextC!=*zDate) )
0d80: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
0d90: 5f 67 65 74 44 69 67 69 74 73 3b 0a 20 20 20 20  _getDigits;.    
0da0: 7d 0a 20 20 20 20 2a 70 56 61 6c 20 3d 20 76 61  }.    *pVal = va
0db0: 6c 3b 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a  l;.    zDate++;.
0dc0: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 7d 77 68      cnt++;.  }wh
0dd0: 69 6c 65 28 20 6e 65 78 74 43 20 29 3b 0a 65 6e  ile( nextC );.en
0de0: 64 5f 67 65 74 44 69 67 69 74 73 3a 0a 20 20 76  d_getDigits:.  v
0df0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
0e00: 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn cnt;.}../*.*
0e10: 2a 20 52 65 61 64 20 74 65 78 74 20 66 72 6f 6d  * Read text from
0e20: 20 7a 5b 5d 20 61 6e 64 20 63 6f 6e 76 65 72 74   z[] and convert
0e30: 20 69 6e 74 6f 20 61 20 66 6c 6f 61 74 69 6e 67   into a floating
0e40: 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 20   point number.  
0e50: 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
0e60: 6d 62 65 72 20 6f 66 20 64 69 67 69 74 73 20 63  mber of digits c
0e70: 6f 6e 76 65 72 74 65 64 2e 0a 2a 2f 0a 23 64 65  onverted..*/.#de
0e80: 66 69 6e 65 20 67 65 74 56 61 6c 75 65 20 73 71  fine getValue sq
0e90: 6c 69 74 65 33 41 74 6f 46 0a 0a 2f 2a 0a 2a 2a  lite3AtoF../*.**
0ea0: 20 50 61 72 73 65 20 61 20 74 69 6d 65 7a 6f 6e   Parse a timezon
0eb0: 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 20 74  e extension on t
0ec0: 68 65 20 65 6e 64 20 6f 66 20 61 20 64 61 74 65  he end of a date
0ed0: 2d 74 69 6d 65 2e 0a 2a 2a 20 54 68 65 20 65 78  -time..** The ex
0ee0: 74 65 6e 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  tension is of th
0ef0: 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
0f00: 20 20 20 20 20 28 2b 2f 2d 29 48 48 3a 4d 4d 0a       (+/-)HH:MM.
0f10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72  **.** If the par
0f20: 73 65 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  se is successful
0f30: 2c 20 77 72 69 74 65 20 74 68 65 20 6e 75 6d 62  , write the numb
0f40: 65 72 20 6f 66 20 6d 69 6e 75 74 65 73 0a 2a 2a  er of minutes.**
0f50: 20 6f 66 20 63 68 61 6e 67 65 20 69 6e 20 2a 70   of change in *p
0f60: 6e 4d 69 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  nMin and return 
0f70: 30 2e 20 20 49 66 20 61 20 70 61 72 73 65 72 20  0.  If a parser 
0f80: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
0f90: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
0fa0: 20 41 20 6d 69 73 73 69 6e 67 20 73 70 65 63 69   A missing speci
0fb0: 66 69 65 72 20 69 73 20 6e 6f 74 20 63 6f 6e 73  fier is not cons
0fc0: 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 2e  idered an error.
0fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
0fe0: 61 72 73 65 54 69 6d 65 7a 6f 6e 65 28 63 6f 6e  arseTimezone(con
0ff0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65 2c 20  st char *zDate, 
1000: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
1010: 69 6e 74 20 73 67 6e 20 3d 20 30 3b 0a 20 20 69  int sgn = 0;.  i
1020: 6e 74 20 6e 48 72 2c 20 6e 4d 6e 3b 0a 20 20 77  nt nHr, nMn;.  w
1030: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
1040: 75 38 2a 29 7a 44 61 74 65 29 20 29 7b 20 7a 44  u8*)zDate) ){ zD
1050: 61 74 65 2b 2b 3b 20 7d 0a 20 20 70 2d 3e 74 7a  ate++; }.  p->tz
1060: 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 7a 44 61   = 0;.  if( *zDa
1070: 74 65 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 73  te=='-' ){.    s
1080: 67 6e 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  gn = -1;.  }else
1090: 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d 27 2b 27   if( *zDate=='+'
10a0: 20 29 7b 0a 20 20 20 20 73 67 6e 20 3d 20 2b 31   ){.    sgn = +1
10b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
10c0: 65 74 75 72 6e 20 2a 7a 44 61 74 65 21 3d 30 3b  eturn *zDate!=0;
10d0: 0a 20 20 7d 0a 20 20 7a 44 61 74 65 2b 2b 3b 0a  .  }.  zDate++;.
10e0: 20 20 69 66 28 20 67 65 74 44 69 67 69 74 73 28    if( getDigits(
10f0: 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 31 34 2c  zDate, 2, 0, 14,
1100: 20 27 3a 27 2c 20 26 6e 48 72 2c 20 32 2c 20 30   ':', &nHr, 2, 0
1110: 2c 20 35 39 2c 20 30 2c 20 26 6e 4d 6e 29 21 3d  , 59, 0, &nMn)!=
1120: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
1130: 31 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b  1;.  }.  zDate +
1140: 3d 20 35 3b 0a 20 20 70 2d 3e 74 7a 20 3d 20 73  = 5;.  p->tz = s
1150: 67 6e 2a 28 6e 4d 6e 20 2b 20 6e 48 72 2a 36 30  gn*(nMn + nHr*60
1160: 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70  );.  while( issp
1170: 61 63 65 28 2a 28 75 38 2a 29 7a 44 61 74 65 29  ace(*(u8*)zDate)
1180: 20 29 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d 0a 20   ){ zDate++; }. 
1190: 20 72 65 74 75 72 6e 20 2a 7a 44 61 74 65 21 3d   return *zDate!=
11a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  0;.}../*.** Pars
11b0: 65 20 74 69 6d 65 73 20 6f 66 20 74 68 65 20 66  e times of the f
11c0: 6f 72 6d 20 48 48 3a 4d 4d 20 6f 72 20 48 48 3a  orm HH:MM or HH:
11d0: 4d 4d 3a 53 53 20 6f 72 20 48 48 3a 4d 4d 3a 53  MM:SS or HH:MM:S
11e0: 53 2e 46 46 46 46 2e 0a 2a 2a 20 54 68 65 20 48  S.FFFF..** The H
11f0: 48 2c 20 4d 4d 2c 20 61 6e 64 20 53 53 20 6d 75  H, MM, and SS mu
1200: 73 74 20 65 61 63 68 20 62 65 20 65 78 61 63 74  st each be exact
1210: 6c 79 20 32 20 64 69 67 69 74 73 2e 20 20 54 68  ly 2 digits.  Th
1220: 65 0a 2a 2a 20 66 72 61 63 74 69 6f 6e 61 6c 20  e.** fractional 
1230: 73 65 63 6f 6e 64 73 20 46 46 46 46 20 63 61 6e  seconds FFFF can
1240: 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   be one or more 
1250: 64 69 67 69 74 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  digits..**.** Re
1260: 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20  turn 1 if there 
1270: 69 73 20 61 20 70 61 72 73 69 6e 67 20 65 72 72  is a parsing err
1280: 6f 72 20 61 6e 64 20 30 20 6f 6e 20 73 75 63 63  or and 0 on succ
1290: 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
12a0: 6e 74 20 70 61 72 73 65 48 68 4d 6d 53 73 28 63  nt parseHhMmSs(c
12b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 65  onst char *zDate
12c0: 2c 20 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a  , DateTime *p){.
12d0: 20 20 69 6e 74 20 68 2c 20 6d 2c 20 73 3b 0a 20    int h, m, s;. 
12e0: 20 64 6f 75 62 6c 65 20 6d 73 20 3d 20 30 2e 30   double ms = 0.0
12f0: 3b 0a 20 20 69 66 28 20 67 65 74 44 69 67 69 74  ;.  if( getDigit
1300: 73 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 32  s(zDate, 2, 0, 2
1310: 34 2c 20 27 3a 27 2c 20 26 68 2c 20 32 2c 20 30  4, ':', &h, 2, 0
1320: 2c 20 35 39 2c 20 30 2c 20 26 6d 29 21 3d 32 20  , 59, 0, &m)!=2 
1330: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1340: 0a 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b 3d 20  .  }.  zDate += 
1350: 35 3b 0a 20 20 69 66 28 20 2a 7a 44 61 74 65 3d  5;.  if( *zDate=
1360: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 44 61 74  =':' ){.    zDat
1370: 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 67 65 74  e++;.    if( get
1380: 44 69 67 69 74 73 28 7a 44 61 74 65 2c 20 32 2c  Digits(zDate, 2,
1390: 20 30 2c 20 35 39 2c 20 30 2c 20 26 73 29 21 3d   0, 59, 0, &s)!=
13a0: 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  1 ){.      retur
13b0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  n 1;.    }.    z
13c0: 44 61 74 65 20 2b 3d 20 32 3b 0a 20 20 20 20 69  Date += 2;.    i
13d0: 66 28 20 2a 7a 44 61 74 65 3d 3d 27 2e 27 20 26  f( *zDate=='.' &
13e0: 26 20 69 73 64 69 67 69 74 28 28 75 38 29 7a 44  & isdigit((u8)zD
13f0: 61 74 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  ate[1]) ){.     
1400: 20 64 6f 75 62 6c 65 20 72 53 63 61 6c 65 20 3d   double rScale =
1410: 20 31 2e 30 3b 0a 20 20 20 20 20 20 7a 44 61 74   1.0;.      zDat
1420: 65 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  e++;.      while
1430: 28 20 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29  ( isdigit(*(u8*)
1440: 7a 44 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20  zDate) ){.      
1450: 20 20 6d 73 20 3d 20 6d 73 2a 31 30 2e 30 20 2b    ms = ms*10.0 +
1460: 20 2a 7a 44 61 74 65 20 2d 20 27 30 27 3b 0a 20   *zDate - '0';. 
1470: 20 20 20 20 20 20 20 72 53 63 61 6c 65 20 2a 3d         rScale *=
1480: 20 31 30 2e 30 3b 0a 20 20 20 20 20 20 20 20 7a   10.0;.        z
1490: 44 61 74 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Date++;.      }.
14a0: 20 20 20 20 20 20 6d 73 20 2f 3d 20 72 53 63 61        ms /= rSca
14b0: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  le;.    }.  }els
14c0: 65 7b 0a 20 20 20 20 73 20 3d 20 30 3b 0a 20 20  e{.    s = 0;.  
14d0: 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d  }.  p->validJD =
14e0: 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 48 4d   0;.  p->validHM
14f0: 53 20 3d 20 31 3b 0a 20 20 70 2d 3e 68 20 3d 20  S = 1;.  p->h = 
1500: 68 3b 0a 20 20 70 2d 3e 6d 20 3d 20 6d 3b 0a 20  h;.  p->m = m;. 
1510: 20 70 2d 3e 73 20 3d 20 73 20 2b 20 6d 73 3b 0a   p->s = s + ms;.
1520: 20 20 69 66 28 20 70 61 72 73 65 54 69 6d 65 7a    if( parseTimez
1530: 6f 6e 65 28 7a 44 61 74 65 2c 20 70 29 20 29 20  one(zDate, p) ) 
1540: 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 2d 3e 76  return 1;.  p->v
1550: 61 6c 69 64 54 5a 20 3d 20 70 2d 3e 74 7a 21 3d  alidTZ = p->tz!=
1560: 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  0;.  return 0;.}
1570: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1580: 66 72 6f 6d 20 59 59 59 59 2d 4d 4d 2d 44 44 20  from YYYY-MM-DD 
1590: 48 48 3a 4d 4d 3a 53 53 20 74 6f 20 6a 75 6c 69  HH:MM:SS to juli
15a0: 61 6e 20 64 61 79 2e 20 20 57 65 20 61 6c 77 61  an day.  We alwa
15b0: 79 73 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61  ys assume.** tha
15c0: 74 20 74 68 65 20 59 59 59 59 2d 4d 4d 2d 44 44  t the YYYY-MM-DD
15d0: 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   is according to
15e0: 20 74 68 65 20 47 72 65 67 6f 72 69 61 6e 20 63   the Gregorian c
15f0: 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 52  alendar..**.** R
1600: 65 66 65 72 65 6e 63 65 3a 20 20 4d 65 65 75 73  eference:  Meeus
1610: 20 70 61 67 65 20 36 31 0a 2a 2f 0a 73 74 61 74   page 61.*/.stat
1620: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4a  ic void computeJ
1630: 44 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a  D(DateTime *p){.
1640: 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c 20 41    int Y, M, D, A
1650: 2c 20 42 2c 20 58 31 2c 20 58 32 3b 0a 0a 20 20  , B, X1, X2;..  
1660: 69 66 28 20 70 2d 3e 76 61 6c 69 64 4a 44 20 29  if( p->validJD )
1670: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
1680: 2d 3e 76 61 6c 69 64 59 4d 44 20 29 7b 0a 20 20  ->validYMD ){.  
1690: 20 20 59 20 3d 20 70 2d 3e 59 3b 0a 20 20 20 20    Y = p->Y;.    
16a0: 4d 20 3d 20 70 2d 3e 4d 3b 0a 20 20 20 20 44 20  M = p->M;.    D 
16b0: 3d 20 70 2d 3e 44 3b 0a 20 20 7d 65 6c 73 65 7b  = p->D;.  }else{
16c0: 0a 20 20 20 20 59 20 3d 20 32 30 30 30 3b 20 20  .    Y = 2000;  
16d0: 2f 2a 20 49 66 20 6e 6f 20 59 4d 44 20 73 70 65  /* If no YMD spe
16e0: 63 69 66 69 65 64 2c 20 61 73 73 75 6d 65 20 32  cified, assume 2
16f0: 30 30 30 2d 4a 61 6e 2d 30 31 20 2a 2f 0a 20 20  000-Jan-01 */.  
1700: 20 20 4d 20 3d 20 31 3b 0a 20 20 20 20 44 20 3d    M = 1;.    D =
1710: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 3c   1;.  }.  if( M<
1720: 3d 32 20 29 7b 0a 20 20 20 20 59 2d 2d 3b 0a 20  =2 ){.    Y--;. 
1730: 20 20 20 4d 20 2b 3d 20 31 32 3b 0a 20 20 7d 0a     M += 12;.  }.
1740: 20 20 41 20 3d 20 59 2f 31 30 30 3b 0a 20 20 42    A = Y/100;.  B
1750: 20 3d 20 32 20 2d 20 41 20 2b 20 28 41 2f 34 29   = 2 - A + (A/4)
1760: 3b 0a 20 20 58 31 20 3d 20 33 36 35 2e 32 35 2a  ;.  X1 = 365.25*
1770: 28 59 2b 34 37 31 36 29 3b 0a 20 20 58 32 20 3d  (Y+4716);.  X2 =
1780: 20 33 30 2e 36 30 30 31 2a 28 4d 2b 31 29 3b 0a   30.6001*(M+1);.
1790: 20 20 70 2d 3e 72 4a 44 20 3d 20 58 31 20 2b 20    p->rJD = X1 + 
17a0: 58 32 20 2b 20 44 20 2b 20 42 20 2d 20 31 35 32  X2 + D + B - 152
17b0: 34 2e 35 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 4a  4.5;.  p->validJ
17c0: 44 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e  D = 1;.  if( p->
17d0: 76 61 6c 69 64 48 4d 53 20 29 7b 0a 20 20 20 20  validHMS ){.    
17e0: 70 2d 3e 72 4a 44 20 2b 3d 20 28 70 2d 3e 68 2a  p->rJD += (p->h*
17f0: 33 36 30 30 2e 30 20 2b 20 70 2d 3e 6d 2a 36 30  3600.0 + p->m*60
1800: 2e 30 20 2b 20 70 2d 3e 73 29 2f 38 36 34 30 30  .0 + p->s)/86400
1810: 2e 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 76  .0;.    if( p->v
1820: 61 6c 69 64 54 5a 20 29 7b 0a 20 20 20 20 20 20  alidTZ ){.      
1830: 70 2d 3e 72 4a 44 20 2d 3d 20 70 2d 3e 74 7a 2a  p->rJD -= p->tz*
1840: 36 30 2f 38 36 34 30 30 2e 30 3b 0a 20 20 20 20  60/86400.0;.    
1850: 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d 20    p->validYMD = 
1860: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69  0;.      p->vali
1870: 64 48 4d 53 20 3d 20 30 3b 0a 20 20 20 20 20 20  dHMS = 0;.      
1880: 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a  p->validTZ = 0;.
1890: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
18a0: 2a 2a 20 50 61 72 73 65 20 64 61 74 65 73 20 6f  ** Parse dates o
18b0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
18c0: 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20       YYYY-MM-DD 
18d0: 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 0a 2a 2a 20  HH:MM:SS.FFF.** 
18e0: 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48      YYYY-MM-DD H
18f0: 48 3a 4d 4d 3a 53 53 0a 2a 2a 20 20 20 20 20 59  H:MM:SS.**     Y
1900: 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 0a  YYY-MM-DD HH:MM.
1910: 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44  **     YYYY-MM-D
1920: 44 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  D.**.** Write th
1930: 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 74 68  e result into th
1940: 65 20 44 61 74 65 54 69 6d 65 20 73 74 72 75 63  e DateTime struc
1950: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
1960: 30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  0.** on success 
1970: 61 6e 64 20 31 20 69 66 20 74 68 65 20 69 6e 70  and 1 if the inp
1980: 75 74 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74  ut string is not
1990: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
19a0: 2a 20 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  * date..*/.stati
19b0: 63 20 69 6e 74 20 70 61 72 73 65 59 79 79 79 4d  c int parseYyyyM
19c0: 6d 44 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mDd(const char *
19d0: 7a 44 61 74 65 2c 20 44 61 74 65 54 69 6d 65 20  zDate, DateTime 
19e0: 2a 70 29 7b 0a 20 20 69 6e 74 20 59 2c 20 4d 2c  *p){.  int Y, M,
19f0: 20 44 2c 20 6e 65 67 3b 0a 0a 20 20 69 66 28 20   D, neg;..  if( 
1a00: 7a 44 61 74 65 5b 30 5d 3d 3d 27 2d 27 20 29 7b  zDate[0]=='-' ){
1a10: 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20  .    zDate++;.  
1a20: 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20 7d 65 6c    neg = 1;.  }el
1a30: 73 65 7b 0a 20 20 20 20 6e 65 67 20 3d 20 30 3b  se{.    neg = 0;
1a40: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 69  .  }.  if( getDi
1a50: 67 69 74 73 28 7a 44 61 74 65 2c 34 2c 30 2c 39  gits(zDate,4,0,9
1a60: 39 39 39 2c 27 2d 27 2c 26 59 2c 32 2c 31 2c 31  999,'-',&Y,2,1,1
1a70: 32 2c 27 2d 27 2c 26 4d 2c 32 2c 31 2c 33 31 2c  2,'-',&M,2,1,31,
1a80: 30 2c 26 44 29 21 3d 33 20 29 7b 0a 20 20 20 20  0,&D)!=3 ){.    
1a90: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1aa0: 7a 44 61 74 65 20 2b 3d 20 31 30 3b 0a 20 20 77  zDate += 10;.  w
1ab0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
1ac0: 75 38 2a 29 7a 44 61 74 65 29 20 7c 7c 20 27 54  u8*)zDate) || 'T
1ad0: 27 3d 3d 2a 28 75 38 2a 29 7a 44 61 74 65 20 29  '==*(u8*)zDate )
1ae0: 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d 0a 20 20 69  { zDate++; }.  i
1af0: 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73 28 7a  f( parseHhMmSs(z
1b00: 44 61 74 65 2c 20 70 29 3d 3d 30 20 29 7b 0a 20  Date, p)==0 ){. 
1b10: 20 20 20 2f 2a 20 57 65 20 67 6f 74 20 74 68 65     /* We got the
1b20: 20 74 69 6d 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   time */.  }else
1b30: 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d 30 20 29   if( *zDate==0 )
1b40: 7b 0a 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d  {.    p->validHM
1b50: 53 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  S = 0;.  }else{.
1b60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b70: 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d  }.  p->validJD =
1b80: 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 59 4d   0;.  p->validYM
1b90: 44 20 3d 20 31 3b 0a 20 20 70 2d 3e 59 20 3d 20  D = 1;.  p->Y = 
1ba0: 6e 65 67 20 3f 20 2d 59 20 3a 20 59 3b 0a 20 20  neg ? -Y : Y;.  
1bb0: 70 2d 3e 4d 20 3d 20 4d 3b 0a 20 20 70 2d 3e 44  p->M = M;.  p->D
1bc0: 20 3d 20 44 3b 0a 20 20 69 66 28 20 70 2d 3e 76   = D;.  if( p->v
1bd0: 61 6c 69 64 54 5a 20 29 7b 0a 20 20 20 20 63 6f  alidTZ ){.    co
1be0: 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 7d 0a  mputeJD(p);.  }.
1bf0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1c00: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1c10: 70 61 72 73 65 20 74 68 65 20 67 69 76 65 6e 20  parse the given 
1c20: 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20 4a 75  string into a Ju
1c30: 6c 69 61 6e 20 44 61 79 20 4e 75 6d 62 65 72 2e  lian Day Number.
1c40: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
1c50: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
1c60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
1c70: 6f 77 69 6e 67 20 61 72 65 20 61 63 63 65 70 74  owing are accept
1c80: 61 62 6c 65 20 66 6f 72 6d 73 20 66 6f 72 20 74  able forms for t
1c90: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 3a  he input string:
1ca0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 59 59 59  .**.**      YYYY
1cb0: 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53 53 2e  -MM-DD HH:MM:SS.
1cc0: 46 46 46 20 20 2b 2f 2d 48 48 3a 4d 4d 0a 2a 2a  FFF  +/-HH:MM.**
1cd0: 20 20 20 20 20 20 44 44 44 44 2e 44 44 20 0a 2a        DDDD.DD .*
1ce0: 2a 20 20 20 20 20 20 6e 6f 77 0a 2a 2a 0a 2a 2a  *      now.**.**
1cf0: 20 49 6e 20 74 68 65 20 66 69 72 73 74 20 66 6f   In the first fo
1d00: 72 6d 2c 20 74 68 65 20 2b 2f 2d 48 48 3a 4d 4d  rm, the +/-HH:MM
1d10: 20 69 73 20 61 6c 77 61 79 73 20 6f 70 74 69 6f   is always optio
1d20: 6e 61 6c 2e 20 20 54 68 65 20 66 72 61 63 74 69  nal.  The fracti
1d30: 6f 6e 61 6c 0a 2a 2a 20 73 65 63 6f 6e 64 73 20  onal.** seconds 
1d40: 65 78 74 65 6e 73 69 6f 6e 20 28 74 68 65 20 22  extension (the "
1d50: 2e 46 46 46 22 29 20 69 73 20 6f 70 74 69 6f 6e  .FFF") is option
1d60: 61 6c 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 73  al.  The seconds
1d70: 20 70 6f 72 74 69 6f 6e 0a 2a 2a 20 28 22 3a 53   portion.** (":S
1d80: 53 2e 46 46 46 22 29 20 69 73 20 6f 70 74 69 6f  S.FFF") is optio
1d90: 6e 2e 20 20 54 68 65 20 79 65 61 72 20 61 6e 64  n.  The year and
1da0: 20 64 61 74 65 20 63 61 6e 20 62 65 20 6f 6d 69   date can be omi
1db0: 74 74 65 64 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20  tted as long.** 
1dc0: 61 73 20 74 68 65 72 65 20 69 73 20 61 20 74 69  as there is a ti
1dd0: 6d 65 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  me string.  The 
1de0: 74 69 6d 65 20 73 74 72 69 6e 67 20 63 61 6e 20  time string can 
1df0: 62 65 20 6f 6d 69 74 74 65 64 20 61 73 20 6c 6f  be omitted as lo
1e00: 6e 67 0a 2a 2a 20 61 73 20 74 68 65 72 65 20 69  ng.** as there i
1e10: 73 20 61 20 79 65 61 72 20 61 6e 64 20 64 61 74  s a year and dat
1e20: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e30: 20 70 61 72 73 65 44 61 74 65 4f 72 54 69 6d 65   parseDateOrTime
1e40: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1e50: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
1e60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1e70: 74 65 2c 20 0a 20 20 44 61 74 65 54 69 6d 65 20  te, .  DateTime 
1e80: 2a 70 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  *p.){.  memset(p
1e90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
1ea0: 3b 0a 20 20 69 66 28 20 70 61 72 73 65 59 79 79  ;.  if( parseYyy
1eb0: 79 4d 6d 44 64 28 7a 44 61 74 65 2c 70 29 3d 3d  yMmDd(zDate,p)==
1ec0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ed0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
1ee0: 61 72 73 65 48 68 4d 6d 53 73 28 7a 44 61 74 65  arseHhMmSs(zDate
1ef0: 2c 20 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , p)==0 ){.    r
1f00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1f10: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1f20: 43 6d 70 28 7a 44 61 74 65 2c 22 6e 6f 77 22 29  Cmp(zDate,"now")
1f30: 3d 3d 30 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  ==0){.    double
1f40: 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   r;.    sqlite3O
1f50: 73 43 75 72 72 65 6e 74 54 69 6d 65 28 28 73 71  sCurrentTime((sq
1f60: 6c 69 74 65 33 5f 76 66 73 20 2a 29 73 71 6c 69  lite3_vfs *)sqli
1f70: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
1f80: 6e 74 65 78 74 29 2c 20 26 72 29 3b 0a 20 20 20  ntext), &r);.   
1f90: 20 70 2d 3e 72 4a 44 20 3d 20 72 3b 0a 20 20 20   p->rJD = r;.   
1fa0: 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b   p->validJD = 1;
1fb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1fc0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
1fd0: 65 33 49 73 4e 75 6d 62 65 72 28 7a 44 61 74 65  e3IsNumber(zDate
1fe0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
1ff0: 29 20 29 7b 0a 20 20 20 20 67 65 74 56 61 6c 75  ) ){.    getValu
2000: 65 28 7a 44 61 74 65 2c 20 26 70 2d 3e 72 4a 44  e(zDate, &p->rJD
2010: 29 3b 0a 20 20 20 20 70 2d 3e 76 61 6c 69 64 4a  );.    p->validJ
2020: 44 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  D = 1;.    retur
2030: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
2040: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 1;.}../*.** Co
2050: 6d 70 75 74 65 20 74 68 65 20 59 65 61 72 2c 20  mpute the Year, 
2060: 4d 6f 6e 74 68 2c 20 61 6e 64 20 44 61 79 20 66  Month, and Day f
2070: 72 6f 6d 20 74 68 65 20 6a 75 6c 69 61 6e 20 64  rom the julian d
2080: 61 79 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  ay number..*/.st
2090: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
20a0: 65 59 4d 44 28 44 61 74 65 54 69 6d 65 20 2a 70  eYMD(DateTime *p
20b0: 29 7b 0a 20 20 69 6e 74 20 5a 2c 20 41 2c 20 42  ){.  int Z, A, B
20c0: 2c 20 43 2c 20 44 2c 20 45 2c 20 58 31 3b 0a 20  , C, D, E, X1;. 
20d0: 20 69 66 28 20 70 2d 3e 76 61 6c 69 64 59 4d 44   if( p->validYMD
20e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
20f0: 20 21 70 2d 3e 76 61 6c 69 64 4a 44 20 29 7b 0a   !p->validJD ){.
2100: 20 20 20 20 70 2d 3e 59 20 3d 20 32 30 30 30 3b      p->Y = 2000;
2110: 0a 20 20 20 20 70 2d 3e 4d 20 3d 20 31 3b 0a 20  .    p->M = 1;. 
2120: 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0a 20 20 7d     p->D = 1;.  }
2130: 65 6c 73 65 7b 0a 20 20 20 20 5a 20 3d 20 70 2d  else{.    Z = p-
2140: 3e 72 4a 44 20 2b 20 30 2e 35 3b 0a 20 20 20 20  >rJD + 0.5;.    
2150: 41 20 3d 20 28 5a 20 2d 20 31 38 36 37 32 31 36  A = (Z - 1867216
2160: 2e 32 35 29 2f 33 36 35 32 34 2e 32 35 3b 0a 20  .25)/36524.25;. 
2170: 20 20 20 41 20 3d 20 5a 20 2b 20 31 20 2b 20 41     A = Z + 1 + A
2180: 20 2d 20 28 41 2f 34 29 3b 0a 20 20 20 20 42 20   - (A/4);.    B 
2190: 3d 20 41 20 2b 20 31 35 32 34 3b 0a 20 20 20 20  = A + 1524;.    
21a0: 43 20 3d 20 28 42 20 2d 20 31 32 32 2e 31 29 2f  C = (B - 122.1)/
21b0: 33 36 35 2e 32 35 3b 0a 20 20 20 20 44 20 3d 20  365.25;.    D = 
21c0: 33 36 35 2e 32 35 2a 43 3b 0a 20 20 20 20 45 20  365.25*C;.    E 
21d0: 3d 20 28 42 2d 44 29 2f 33 30 2e 36 30 30 31 3b  = (B-D)/30.6001;
21e0: 0a 20 20 20 20 58 31 20 3d 20 33 30 2e 36 30 30  .    X1 = 30.600
21f0: 31 2a 45 3b 0a 20 20 20 20 70 2d 3e 44 20 3d 20  1*E;.    p->D = 
2200: 42 20 2d 20 44 20 2d 20 58 31 3b 0a 20 20 20 20  B - D - X1;.    
2210: 70 2d 3e 4d 20 3d 20 45 3c 31 34 20 3f 20 45 2d  p->M = E<14 ? E-
2220: 31 20 3a 20 45 2d 31 33 3b 0a 20 20 20 20 70 2d  1 : E-13;.    p-
2230: 3e 59 20 3d 20 70 2d 3e 4d 3e 32 20 3f 20 43 20  >Y = p->M>2 ? C 
2240: 2d 20 34 37 31 36 20 3a 20 43 20 2d 20 34 37 31  - 4716 : C - 471
2250: 35 3b 0a 20 20 7d 0a 20 20 70 2d 3e 76 61 6c 69  5;.  }.  p->vali
2260: 64 59 4d 44 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  dYMD = 1;.}../*.
2270: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 48  ** Compute the H
2280: 6f 75 72 2c 20 4d 69 6e 75 74 65 2c 20 61 6e 64  our, Minute, and
2290: 20 53 65 63 6f 6e 64 73 20 66 72 6f 6d 20 74 68   Seconds from th
22a0: 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d  e julian day num
22b0: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ber..*/.static v
22c0: 6f 69 64 20 63 6f 6d 70 75 74 65 48 4d 53 28 44  oid computeHMS(D
22d0: 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69  ateTime *p){.  i
22e0: 6e 74 20 5a 2c 20 73 3b 0a 20 20 69 66 28 20 70  nt Z, s;.  if( p
22f0: 2d 3e 76 61 6c 69 64 48 4d 53 20 29 20 72 65 74  ->validHMS ) ret
2300: 75 72 6e 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44  urn;.  computeJD
2310: 28 70 29 3b 0a 20 20 5a 20 3d 20 70 2d 3e 72 4a  (p);.  Z = p->rJ
2320: 44 20 2b 20 30 2e 35 3b 0a 20 20 73 20 3d 20 28  D + 0.5;.  s = (
2330: 70 2d 3e 72 4a 44 20 2b 20 30 2e 35 20 2d 20 5a  p->rJD + 0.5 - Z
2340: 29 2a 38 36 34 30 30 30 30 30 2e 30 20 2b 20 30  )*86400000.0 + 0
2350: 2e 35 3b 0a 20 20 70 2d 3e 73 20 3d 20 30 2e 30  .5;.  p->s = 0.0
2360: 30 31 2a 73 3b 0a 20 20 73 20 3d 20 70 2d 3e 73  01*s;.  s = p->s
2370: 3b 0a 20 20 70 2d 3e 73 20 2d 3d 20 73 3b 0a 20  ;.  p->s -= s;. 
2380: 20 70 2d 3e 68 20 3d 20 73 2f 33 36 30 30 3b 0a   p->h = s/3600;.
2390: 20 20 73 20 2d 3d 20 70 2d 3e 68 2a 33 36 30 30    s -= p->h*3600
23a0: 3b 0a 20 20 70 2d 3e 6d 20 3d 20 73 2f 36 30 3b  ;.  p->m = s/60;
23b0: 0a 20 20 70 2d 3e 73 20 2b 3d 20 73 20 2d 20 70  .  p->s += s - p
23c0: 2d 3e 6d 2a 36 30 3b 0a 20 20 70 2d 3e 76 61 6c  ->m*60;.  p->val
23d0: 69 64 48 4d 53 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  idHMS = 1;.}../*
23e0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 62 6f 74 68  .** Compute both
23f0: 20 59 4d 44 20 61 6e 64 20 48 4d 53 0a 2a 2f 0a   YMD and HMS.*/.
2400: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
2410: 75 74 65 59 4d 44 5f 48 4d 53 28 44 61 74 65 54  uteYMD_HMS(DateT
2420: 69 6d 65 20 2a 70 29 7b 0a 20 20 63 6f 6d 70 75  ime *p){.  compu
2430: 74 65 59 4d 44 28 70 29 3b 0a 20 20 63 6f 6d 70  teYMD(p);.  comp
2440: 75 74 65 48 4d 53 28 70 29 3b 0a 7d 0a 0a 2f 2a  uteHMS(p);.}../*
2450: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 59 4d  .** Clear the YM
2460: 44 20 61 6e 64 20 48 4d 53 20 61 6e 64 20 74 68  D and HMS and th
2470: 65 20 54 5a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e TZ.*/.static v
2480: 6f 69 64 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53  oid clearYMD_HMS
2490: 5f 54 5a 28 44 61 74 65 54 69 6d 65 20 2a 70 29  _TZ(DateTime *p)
24a0: 7b 0a 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20  {.  p->validYMD 
24b0: 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 48  = 0;.  p->validH
24c0: 4d 53 20 3d 20 30 3b 0a 20 20 70 2d 3e 76 61 6c  MS = 0;.  p->val
24d0: 69 64 54 5a 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  idTZ = 0;.}../*.
24e0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 64  ** Compute the d
24f0: 69 66 66 65 72 65 6e 63 65 20 28 69 6e 20 64 61  ifference (in da
2500: 79 73 29 20 62 65 74 77 65 65 6e 20 6c 6f 63 61  ys) between loca
2510: 6c 74 69 6d 65 20 61 6e 64 20 55 54 43 20 28 61  ltime and UTC (a
2520: 2e 6b 2e 61 2e 20 47 4d 54 29 0a 2a 2a 20 66 6f  .k.a. GMT).** fo
2530: 72 20 74 68 65 20 74 69 6d 65 20 76 61 6c 75 65  r the time value
2540: 20 70 20 77 68 65 72 65 20 70 20 69 73 20 69 6e   p where p is in
2550: 20 55 54 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   UTC..*/.static 
2560: 64 6f 75 62 6c 65 20 6c 6f 63 61 6c 74 69 6d 65  double localtime
2570: 4f 66 66 73 65 74 28 44 61 74 65 54 69 6d 65 20  Offset(DateTime 
2580: 2a 70 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20  *p){.  DateTime 
2590: 78 2c 20 79 3b 0a 20 20 74 69 6d 65 5f 74 20 74  x, y;.  time_t t
25a0: 3b 0a 20 20 78 20 3d 20 2a 70 3b 0a 20 20 63 6f  ;.  x = *p;.  co
25b0: 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78 29  mputeYMD_HMS(&x)
25c0: 3b 0a 20 20 69 66 28 20 78 2e 59 3c 31 39 37 31  ;.  if( x.Y<1971
25d0: 20 7c 7c 20 78 2e 59 3e 3d 32 30 33 38 20 29 7b   || x.Y>=2038 ){
25e0: 0a 20 20 20 20 78 2e 59 20 3d 20 32 30 30 30 3b  .    x.Y = 2000;
25f0: 0a 20 20 20 20 78 2e 4d 20 3d 20 31 3b 0a 20 20  .    x.M = 1;.  
2600: 20 20 78 2e 44 20 3d 20 31 3b 0a 20 20 20 20 78    x.D = 1;.    x
2610: 2e 68 20 3d 20 30 3b 0a 20 20 20 20 78 2e 6d 20  .h = 0;.    x.m 
2620: 3d 20 30 3b 0a 20 20 20 20 78 2e 73 20 3d 20 30  = 0;.    x.s = 0
2630: 2e 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  .0;.  } else {. 
2640: 20 20 20 69 6e 74 20 73 20 3d 20 78 2e 73 20 2b     int s = x.s +
2650: 20 30 2e 35 3b 0a 20 20 20 20 78 2e 73 20 3d 20   0.5;.    x.s = 
2660: 73 3b 0a 20 20 7d 0a 20 20 78 2e 74 7a 20 3d 20  s;.  }.  x.tz = 
2670: 30 3b 0a 20 20 78 2e 76 61 6c 69 64 4a 44 20 3d  0;.  x.validJD =
2680: 20 30 3b 0a 20 20 63 6f 6d 70 75 74 65 4a 44 28   0;.  computeJD(
2690: 26 78 29 3b 0a 20 20 74 20 3d 20 28 78 2e 72 4a  &x);.  t = (x.rJ
26a0: 44 2d 32 34 34 30 35 38 37 2e 35 29 2a 38 36 34  D-2440587.5)*864
26b0: 30 30 2e 30 20 2b 20 30 2e 35 3b 0a 23 69 66 64  00.0 + 0.5;.#ifd
26c0: 65 66 20 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d  ef HAVE_LOCALTIM
26d0: 45 5f 52 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  E_R.  {.    stru
26e0: 63 74 20 74 6d 20 73 4c 6f 63 61 6c 3b 0a 20 20  ct tm sLocal;.  
26f0: 20 20 6c 6f 63 61 6c 74 69 6d 65 5f 72 28 26 74    localtime_r(&t
2700: 2c 20 26 73 4c 6f 63 61 6c 29 3b 0a 20 20 20 20  , &sLocal);.    
2710: 79 2e 59 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f  y.Y = sLocal.tm_
2720: 79 65 61 72 20 2b 20 31 39 30 30 3b 0a 20 20 20  year + 1900;.   
2730: 20 79 2e 4d 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d   y.M = sLocal.tm
2740: 5f 6d 6f 6e 20 2b 20 31 3b 0a 20 20 20 20 79 2e  _mon + 1;.    y.
2750: 44 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f 6d 64  D = sLocal.tm_md
2760: 61 79 3b 0a 20 20 20 20 79 2e 68 20 3d 20 73 4c  ay;.    y.h = sL
2770: 6f 63 61 6c 2e 74 6d 5f 68 6f 75 72 3b 0a 20 20  ocal.tm_hour;.  
2780: 20 20 79 2e 6d 20 3d 20 73 4c 6f 63 61 6c 2e 74    y.m = sLocal.t
2790: 6d 5f 6d 69 6e 3b 0a 20 20 20 20 79 2e 73 20 3d  m_min;.    y.s =
27a0: 20 73 4c 6f 63 61 6c 2e 74 6d 5f 73 65 63 3b 0a   sLocal.tm_sec;.
27b0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
27c0: 20 20 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d    struct tm *pTm
27d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
27e0: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
27f0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
2800: 4c 49 54 45 5f 4d 55 54 45 58 5f 47 4c 4f 42 41  LITE_MUTEX_GLOBA
2810: 4c 29 29 3b 0a 20 20 20 20 70 54 6d 20 3d 20 6c  L));.    pTm = l
2820: 6f 63 61 6c 74 69 6d 65 28 26 74 29 3b 0a 20 20  ocaltime(&t);.  
2830: 20 20 79 2e 59 20 3d 20 70 54 6d 2d 3e 74 6d 5f    y.Y = pTm->tm_
2840: 79 65 61 72 20 2b 20 31 39 30 30 3b 0a 20 20 20  year + 1900;.   
2850: 20 79 2e 4d 20 3d 20 70 54 6d 2d 3e 74 6d 5f 6d   y.M = pTm->tm_m
2860: 6f 6e 20 2b 20 31 3b 0a 20 20 20 20 79 2e 44 20  on + 1;.    y.D 
2870: 3d 20 70 54 6d 2d 3e 74 6d 5f 6d 64 61 79 3b 0a  = pTm->tm_mday;.
2880: 20 20 20 20 79 2e 68 20 3d 20 70 54 6d 2d 3e 74      y.h = pTm->t
2890: 6d 5f 68 6f 75 72 3b 0a 20 20 20 20 79 2e 6d 20  m_hour;.    y.m 
28a0: 3d 20 70 54 6d 2d 3e 74 6d 5f 6d 69 6e 3b 0a 20  = pTm->tm_min;. 
28b0: 20 20 20 79 2e 73 20 3d 20 70 54 6d 2d 3e 74 6d     y.s = pTm->tm
28c0: 5f 73 65 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  _sec;.    sqlite
28d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
28e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
28f0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 47  c(SQLITE_MUTEX_G
2900: 4c 4f 42 41 4c 29 29 3b 0a 20 20 7d 0a 23 65 6e  LOBAL));.  }.#en
2910: 64 69 66 0a 20 20 79 2e 76 61 6c 69 64 59 4d 44  dif.  y.validYMD
2920: 20 3d 20 31 3b 0a 20 20 79 2e 76 61 6c 69 64 48   = 1;.  y.validH
2930: 4d 53 20 3d 20 31 3b 0a 20 20 79 2e 76 61 6c 69  MS = 1;.  y.vali
2940: 64 4a 44 20 3d 20 30 3b 0a 20 20 79 2e 76 61 6c  dJD = 0;.  y.val
2950: 69 64 54 5a 20 3d 20 30 3b 0a 20 20 63 6f 6d 70  idTZ = 0;.  comp
2960: 75 74 65 4a 44 28 26 79 29 3b 0a 20 20 72 65 74  uteJD(&y);.  ret
2970: 75 72 6e 20 79 2e 72 4a 44 20 2d 20 78 2e 72 4a  urn y.rJD - x.rJ
2980: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  D;.}../*.** Proc
2990: 65 73 73 20 61 20 6d 6f 64 69 66 69 65 72 20 74  ess a modifier t
29a0: 6f 20 61 20 64 61 74 65 2d 74 69 6d 65 20 73 74  o a date-time st
29b0: 61 6d 70 2e 20 20 54 68 65 20 6d 6f 64 69 66 69  amp.  The modifi
29c0: 65 72 73 20 61 72 65 0a 2a 2a 20 61 73 20 66 6f  ers are.** as fo
29d0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
29e0: 20 4e 4e 4e 20 64 61 79 73 0a 2a 2a 20 20 20 20   NNN days.**    
29f0: 20 4e 4e 4e 20 68 6f 75 72 73 0a 2a 2a 20 20 20   NNN hours.**   
2a00: 20 20 4e 4e 4e 20 6d 69 6e 75 74 65 73 0a 2a 2a    NNN minutes.**
2a10: 20 20 20 20 20 4e 4e 4e 2e 4e 4e 4e 4e 20 73 65       NNN.NNNN se
2a20: 63 6f 6e 64 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e  conds.**     NNN
2a30: 20 6d 6f 6e 74 68 73 0a 2a 2a 20 20 20 20 20 4e   months.**     N
2a40: 4e 4e 20 79 65 61 72 73 0a 2a 2a 20 20 20 20 20  NN years.**     
2a50: 73 74 61 72 74 20 6f 66 20 6d 6f 6e 74 68 0a 2a  start of month.*
2a60: 2a 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 79  *     start of y
2a70: 65 61 72 0a 2a 2a 20 20 20 20 20 73 74 61 72 74  ear.**     start
2a80: 20 6f 66 20 77 65 65 6b 0a 2a 2a 20 20 20 20 20   of week.**     
2a90: 73 74 61 72 74 20 6f 66 20 64 61 79 0a 2a 2a 20  start of day.** 
2aa0: 20 20 20 20 77 65 65 6b 64 61 79 20 4e 0a 2a 2a      weekday N.**
2ab0: 20 20 20 20 20 75 6e 69 78 65 70 6f 63 68 0a 2a       unixepoch.*
2ac0: 2a 20 20 20 20 20 6c 6f 63 61 6c 74 69 6d 65 0a  *     localtime.
2ad0: 2a 2a 20 20 20 20 20 75 74 63 0a 2a 2a 0a 2a 2a  **     utc.**.**
2ae0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
2af0: 63 65 73 73 20 61 6e 64 20 31 20 69 66 20 74 68  cess and 1 if th
2b00: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
2b10: 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  of error..*/.sta
2b20: 74 69 63 20 69 6e 74 20 70 61 72 73 65 4d 6f 64  tic int parseMod
2b30: 69 66 69 65 72 28 63 6f 6e 73 74 20 63 68 61 72  ifier(const char
2b40: 20 2a 7a 4d 6f 64 2c 20 44 61 74 65 54 69 6d 65   *zMod, DateTime
2b50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
2b60: 20 31 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 64   1;.  int n;.  d
2b70: 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20  ouble r;.  char 
2b80: 2a 7a 2c 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  *z, zBuf[30];.  
2b90: 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 66 6f 72 28  z = zBuf;.  for(
2ba0: 6e 3d 30 3b 20 6e 3c 73 69 7a 65 6f 66 28 7a 42  n=0; n<sizeof(zB
2bb0: 75 66 29 2d 31 20 26 26 20 7a 4d 6f 64 5b 6e 5d  uf)-1 && zMod[n]
2bc0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 5d  ; n++){.    z[n]
2bd0: 20 3d 20 74 6f 6c 6f 77 65 72 28 7a 4d 6f 64 5b   = tolower(zMod[
2be0: 6e 5d 29 3b 0a 20 20 7d 0a 20 20 7a 5b 6e 5d 20  n]);.  }.  z[n] 
2bf0: 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 7a  = 0;.  switch( z
2c00: 5b 30 5d 20 29 7b 0a 20 20 20 20 63 61 73 65 20  [0] ){.    case 
2c10: 27 6c 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  'l': {.      /* 
2c20: 20 20 20 6c 6f 63 61 6c 74 69 6d 65 0a 20 20 20     localtime.   
2c30: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
2c40: 73 73 75 6d 69 6e 67 20 74 68 65 20 63 75 72 72  ssuming the curr
2c50: 65 6e 74 20 74 69 6d 65 20 76 61 6c 75 65 20 69  ent time value i
2c60: 73 20 55 54 43 20 28 61 2e 6b 2e 61 2e 20 47 4d  s UTC (a.k.a. GM
2c70: 54 29 2c 20 73 68 69 66 74 20 69 74 20 74 6f 0a  T), shift it to.
2c80: 20 20 20 20 20 20 2a 2a 20 73 68 6f 77 20 6c 6f        ** show lo
2c90: 63 61 6c 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  cal time..      
2ca0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  */.      if( str
2cb0: 63 6d 70 28 7a 2c 20 22 6c 6f 63 61 6c 74 69 6d  cmp(z, "localtim
2cc0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
2cd0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a    computeJD(p);.
2ce0: 20 20 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b          p->rJD +
2cf0: 3d 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65  = localtimeOffse
2d00: 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  t(p);.        cl
2d10: 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29  earYMD_HMS_TZ(p)
2d20: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30  ;.        rc = 0
2d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2d50: 20 63 61 73 65 20 27 75 27 3a 20 7b 0a 20 20 20   case 'u': {.   
2d60: 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a 2a 20 20     /*.      **  
2d70: 20 20 75 6e 69 78 65 70 6f 63 68 0a 20 20 20 20    unixepoch.    
2d80: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 72    **.      ** Tr
2d90: 65 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  eat the current 
2da0: 76 61 6c 75 65 20 6f 66 20 70 2d 3e 72 4a 44 20  value of p->rJD 
2db0: 61 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  as the number of
2dc0: 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
2dd0: 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 20 43  s since 1970.  C
2de0: 6f 6e 76 65 72 74 20 74 6f 20 61 20 72 65 61 6c  onvert to a real
2df0: 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62   julian day numb
2e00: 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
2e10: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
2e20: 20 22 75 6e 69 78 65 70 6f 63 68 22 29 3d 3d 30   "unixepoch")==0
2e30: 20 26 26 20 70 2d 3e 76 61 6c 69 64 4a 44 20 29   && p->validJD )
2e40: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 4a 44  {.        p->rJD
2e50: 20 3d 20 70 2d 3e 72 4a 44 2f 38 36 34 30 30 2e   = p->rJD/86400.
2e60: 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20  0 + 2440587.5;. 
2e70: 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f         clearYMD_
2e80: 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20  HMS_TZ(p);.     
2e90: 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
2ea0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
2eb0: 70 28 7a 2c 20 22 75 74 63 22 29 3d 3d 30 20 29  p(z, "utc")==0 )
2ec0: 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  {.        double
2ed0: 20 63 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d   c1;.        com
2ee0: 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20  puteJD(p);.     
2ef0: 20 20 20 63 31 20 3d 20 6c 6f 63 61 6c 74 69 6d     c1 = localtim
2f00: 65 4f 66 66 73 65 74 28 70 29 3b 0a 20 20 20 20  eOffset(p);.    
2f10: 20 20 20 20 70 2d 3e 72 4a 44 20 2d 3d 20 63 31      p->rJD -= c1
2f20: 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72 59  ;.        clearY
2f30: 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20  MD_HMS_TZ(p);.  
2f40: 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20        p->rJD += 
2f50: 63 31 20 2d 20 6c 6f 63 61 6c 74 69 6d 65 4f 66  c1 - localtimeOf
2f60: 66 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20  fset(p);.       
2f70: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   rc = 0;.      }
2f80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2f90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27 77 27    }.    case 'w'
2fa0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20  : {.      /*.   
2fb0: 20 20 20 2a 2a 20 20 20 20 77 65 65 6b 64 61 79     **    weekday
2fc0: 20 4e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   N.      **.    
2fd0: 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 61    ** Move the da
2fe0: 74 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  te to the same t
2ff0: 69 6d 65 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  ime on the next 
3000: 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 0a 20 20  occurrence of.  
3010: 20 20 20 20 2a 2a 20 77 65 65 6b 64 61 79 20 4e      ** weekday N
3020: 20 77 68 65 72 65 20 30 3d 3d 53 75 6e 64 61 79   where 0==Sunday
3030: 2c 20 31 3d 3d 4d 6f 6e 64 61 79 2c 20 61 6e 64  , 1==Monday, and
3040: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
3050: 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 65  he.      ** date
3060: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74   is already on t
3070: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 77  he appropriate w
3080: 65 65 6b 64 61 79 2c 20 74 68 69 73 20 69 73 20  eekday, this is 
3090: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a  a no-op..      *
30a0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  /.      if( strn
30b0: 63 6d 70 28 7a 2c 20 22 77 65 65 6b 64 61 79 20  cmp(z, "weekday 
30c0: 22 2c 20 38 29 3d 3d 30 20 26 26 20 67 65 74 56  ", 8)==0 && getV
30d0: 61 6c 75 65 28 26 7a 5b 38 5d 2c 26 72 29 3e 30  alue(&z[8],&r)>0
30e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30f0: 20 20 26 26 20 28 6e 3d 72 29 3d 3d 72 20 26 26    && (n=r)==r &&
3100: 20 6e 3e 3d 30 20 26 26 20 72 3c 37 20 29 7b 0a   n>=0 && r<7 ){.
3110: 20 20 20 20 20 20 20 20 69 6e 74 20 5a 3b 0a 20          int Z;. 
3120: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d         computeYM
3130: 44 5f 48 4d 53 28 70 29 3b 0a 20 20 20 20 20 20  D_HMS(p);.      
3140: 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30    p->validTZ = 0
3150: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 76 61 6c  ;.        p->val
3160: 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20  idJD = 0;.      
3170: 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a    computeJD(p);.
3180: 20 20 20 20 20 20 20 20 5a 20 3d 20 70 2d 3e 72          Z = p->r
3190: 4a 44 20 2b 20 31 2e 35 3b 0a 20 20 20 20 20 20  JD + 1.5;.      
31a0: 20 20 5a 20 25 3d 20 37 3b 0a 20 20 20 20 20 20    Z %= 7;.      
31b0: 20 20 69 66 28 20 5a 3e 6e 20 29 20 5a 20 2d 3d    if( Z>n ) Z -=
31c0: 20 37 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   7;.        p->r
31d0: 4a 44 20 2b 3d 20 6e 20 2d 20 5a 3b 0a 20 20 20  JD += n - Z;.   
31e0: 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d       clearYMD_HM
31f0: 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20  S_TZ(p);.       
3200: 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d   rc = 0;.      }
3210: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3220: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27 73 27    }.    case 's'
3230: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20  : {.      /*.   
3240: 20 20 20 2a 2a 20 20 20 20 73 74 61 72 74 20 6f     **    start o
3250: 66 20 54 54 54 54 54 0a 20 20 20 20 20 20 2a 2a  f TTTTT.      **
3260: 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20 74  .      ** Move t
3270: 68 65 20 64 61 74 65 20 62 61 63 6b 77 61 72 64  he date backward
3280: 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
3290: 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ng of the curren
32a0: 74 20 64 61 79 2c 0a 20 20 20 20 20 20 2a 2a 20  t day,.      ** 
32b0: 6f 72 20 6d 6f 6e 74 68 20 6f 72 20 79 65 61 72  or month or year
32c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32d0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c 20   if( strncmp(z, 
32e0: 22 73 74 61 72 74 20 6f 66 20 22 2c 20 39 29 21  "start of ", 9)!
32f0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
3300: 20 20 7a 20 2b 3d 20 39 3b 0a 20 20 20 20 20 20    z += 9;.      
3310: 63 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a 20  computeYMD(p);. 
3320: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d 53       p->validHMS
3330: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 68   = 1;.      p->h
3340: 20 3d 20 70 2d 3e 6d 20 3d 20 30 3b 0a 20 20 20   = p->m = 0;.   
3350: 20 20 20 70 2d 3e 73 20 3d 20 30 2e 30 3b 0a 20     p->s = 0.0;. 
3360: 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a 20       p->validTZ 
3370: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61  = 0;.      p->va
3380: 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20  lidJD = 0;.     
3390: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6d   if( strcmp(z,"m
33a0: 6f 6e 74 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  onth")==0 ){.   
33b0: 20 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0a 20       p->D = 1;. 
33c0: 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
33d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
33e0: 74 72 63 6d 70 28 7a 2c 22 79 65 61 72 22 29 3d  trcmp(z,"year")=
33f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
3400: 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a 20 20 20  mputeYMD(p);.   
3410: 20 20 20 20 20 70 2d 3e 4d 20 3d 20 31 3b 0a 20       p->M = 1;. 
3420: 20 20 20 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b         p->D = 1;
3430: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b  .        rc = 0;
3440: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
3450: 20 73 74 72 63 6d 70 28 7a 2c 22 64 61 79 22 29   strcmp(z,"day")
3460: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
3470: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 0;.      }. 
3480: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3490: 7d 0a 20 20 20 20 63 61 73 65 20 27 2b 27 3a 0a  }.    case '+':.
34a0: 20 20 20 20 63 61 73 65 20 27 2d 27 3a 0a 20 20      case '-':.  
34b0: 20 20 63 61 73 65 20 27 30 27 3a 0a 20 20 20 20    case '0':.    
34c0: 63 61 73 65 20 27 31 27 3a 0a 20 20 20 20 63 61  case '1':.    ca
34d0: 73 65 20 27 32 27 3a 0a 20 20 20 20 63 61 73 65  se '2':.    case
34e0: 20 27 33 27 3a 0a 20 20 20 20 63 61 73 65 20 27   '3':.    case '
34f0: 34 27 3a 0a 20 20 20 20 63 61 73 65 20 27 35 27  4':.    case '5'
3500: 3a 0a 20 20 20 20 63 61 73 65 20 27 36 27 3a 0a  :.    case '6':.
3510: 20 20 20 20 63 61 73 65 20 27 37 27 3a 0a 20 20      case '7':.  
3520: 20 20 63 61 73 65 20 27 38 27 3a 0a 20 20 20 20    case '8':.    
3530: 63 61 73 65 20 27 39 27 3a 20 7b 0a 20 20 20 20  case '9': {.    
3540: 20 20 6e 20 3d 20 67 65 74 56 61 6c 75 65 28 7a    n = getValue(z
3550: 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 61 73 73  , &r);.      ass
3560: 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 20  ert( n>=1 );.   
3570: 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 3a 27     if( z[n]==':'
3580: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
3590: 20 6d 6f 64 69 66 69 65 72 20 6f 66 20 74 68 65   modifier of the
35a0: 20 66 6f 72 6d 20 28 2b 7c 2d 29 48 48 3a 4d 4d   form (+|-)HH:MM
35b0: 3a 53 53 2e 46 46 46 20 61 64 64 73 20 28 6f 72  :SS.FFF adds (or
35c0: 20 73 75 62 74 72 61 63 74 73 29 20 74 68 65 0a   subtracts) the.
35d0: 20 20 20 20 20 20 20 20 2a 2a 20 73 70 65 63 69          ** speci
35e0: 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 68  fied number of h
35f0: 6f 75 72 73 2c 20 6d 69 6e 75 74 65 73 2c 20 73  ours, minutes, s
3600: 65 63 6f 6e 64 73 2c 20 61 6e 64 20 66 72 61 63  econds, and frac
3610: 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 0a 20  tional seconds. 
3620: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65         ** to the
3630: 20 74 69 6d 65 2e 20 20 54 68 65 20 22 2e 46 46   time.  The ".FF
3640: 46 22 20 6d 61 79 20 62 65 20 6f 6d 69 74 74 65  F" may be omitte
3650: 64 2e 20 20 54 68 65 20 22 3a 53 53 2e 46 46 46  d.  The ":SS.FFF
3660: 22 20 6d 61 79 20 62 65 0a 20 20 20 20 20 20 20  " may be.       
3670: 20 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 20 20 20   ** omitted..   
3680: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
3690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d  const char *z2 =
36a0: 20 7a 3b 0a 20 20 20 20 20 20 20 20 44 61 74 65   z;.        Date
36b0: 54 69 6d 65 20 74 78 3b 0a 20 20 20 20 20 20 20  Time tx;.       
36c0: 20 69 6e 74 20 64 61 79 3b 0a 20 20 20 20 20 20   int day;.      
36d0: 20 20 69 66 28 20 21 69 73 64 69 67 69 74 28 2a    if( !isdigit(*
36e0: 28 75 38 2a 29 7a 32 29 20 29 20 7a 32 2b 2b 3b  (u8*)z2) ) z2++;
36f0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
3700: 26 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74  &tx, 0, sizeof(t
3710: 78 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  x));.        if(
3720: 20 70 61 72 73 65 48 68 4d 6d 53 73 28 7a 32 2c   parseHhMmSs(z2,
3730: 20 26 74 78 29 20 29 20 62 72 65 61 6b 3b 0a 20   &tx) ) break;. 
3740: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44         computeJD
3750: 28 26 74 78 29 3b 0a 20 20 20 20 20 20 20 20 74  (&tx);.        t
3760: 78 2e 72 4a 44 20 2d 3d 20 30 2e 35 3b 0a 20 20  x.rJD -= 0.5;.  
3770: 20 20 20 20 20 20 64 61 79 20 3d 20 28 69 6e 74        day = (int
3780: 29 74 78 2e 72 4a 44 3b 0a 20 20 20 20 20 20 20  )tx.rJD;.       
3790: 20 74 78 2e 72 4a 44 20 2d 3d 20 64 61 79 3b 0a   tx.rJD -= day;.
37a0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
37b0: 3d 3d 27 2d 27 20 29 20 74 78 2e 72 4a 44 20 3d  =='-' ) tx.rJD =
37c0: 20 2d 74 78 2e 72 4a 44 3b 0a 20 20 20 20 20 20   -tx.rJD;.      
37d0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a    computeJD(p);.
37e0: 20 20 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44          clearYMD
37f0: 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20  _HMS_TZ(p);.    
3800: 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 74 78      p->rJD += tx
3810: 2e 72 4a 44 3b 0a 20 20 20 20 20 20 20 20 72 63  .rJD;.        rc
3820: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
3830: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3840: 20 20 20 7a 20 2b 3d 20 6e 3b 0a 20 20 20 20 20     z += n;.     
3850: 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
3860: 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a  *(u8*)z) ) z++;.
3870: 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e        n = strlen
3880: 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  (z);.      if( n
3890: 3e 31 30 20 7c 7c 20 6e 3c 33 20 29 20 62 72 65  >10 || n<3 ) bre
38a0: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ak;.      if( z[
38b0: 6e 2d 31 5d 3d 3d 27 73 27 20 29 7b 20 7a 5b 6e  n-1]=='s' ){ z[n
38c0: 2d 31 5d 20 3d 20 30 3b 20 6e 2d 2d 3b 20 7d 0a  -1] = 0; n--; }.
38d0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28        computeJD(
38e0: 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 30  p);.      rc = 0
38f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 33  ;.      if( n==3
3900: 20 26 26 20 73 74 72 63 6d 70 28 7a 2c 22 64 61   && strcmp(z,"da
3910: 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
3920: 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 72 3b 0a 20    p->rJD += r;. 
3930: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
3940: 3d 3d 34 20 26 26 20 73 74 72 63 6d 70 28 7a 2c  ==4 && strcmp(z,
3950: 22 68 6f 75 72 22 29 3d 3d 30 20 29 7b 0a 20 20  "hour")==0 ){.  
3960: 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20        p->rJD += 
3970: 72 2f 32 34 2e 30 3b 0a 20 20 20 20 20 20 7d 65  r/24.0;.      }e
3980: 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20 26 26 20  lse if( n==6 && 
3990: 73 74 72 63 6d 70 28 7a 2c 22 6d 69 6e 75 74 65  strcmp(z,"minute
39a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
39b0: 20 70 2d 3e 72 4a 44 20 2b 3d 20 72 2f 28 32 34   p->rJD += r/(24
39c0: 2e 30 2a 36 30 2e 30 29 3b 0a 20 20 20 20 20 20  .0*60.0);.      
39d0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20 26  }else if( n==6 &
39e0: 26 20 73 74 72 63 6d 70 28 7a 2c 22 73 65 63 6f  & strcmp(z,"seco
39f0: 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nd")==0 ){.     
3a00: 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20 72 2f 28     p->rJD += r/(
3a10: 32 34 2e 30 2a 36 30 2e 30 2a 36 30 2e 30 29 3b  24.0*60.0*60.0);
3a20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
3a30: 20 6e 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28   n==5 && strcmp(
3a40: 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d 30 20 29 7b  z,"month")==0 ){
3a50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 2c 20  .        int x, 
3a60: 79 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  y;.        compu
3a70: 74 65 59 4d 44 5f 48 4d 53 28 70 29 3b 0a 20 20  teYMD_HMS(p);.  
3a80: 20 20 20 20 20 20 70 2d 3e 4d 20 2b 3d 20 72 3b        p->M += r;
3a90: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 70 2d 3e  .        x = p->
3aa0: 4d 3e 30 20 3f 20 28 70 2d 3e 4d 2d 31 29 2f 31  M>0 ? (p->M-1)/1
3ab0: 32 20 3a 20 28 70 2d 3e 4d 2d 31 32 29 2f 31 32  2 : (p->M-12)/12
3ac0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 59 20 2b  ;.        p->Y +
3ad0: 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = x;.        p->
3ae0: 4d 20 2d 3d 20 78 2a 31 32 3b 0a 20 20 20 20 20  M -= x*12;.     
3af0: 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20     p->validJD = 
3b00: 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  0;.        compu
3b10: 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 20  teJD(p);.       
3b20: 20 79 20 3d 20 72 3b 0a 20 20 20 20 20 20 20 20   y = r;.        
3b30: 69 66 28 20 79 21 3d 72 20 29 7b 0a 20 20 20 20  if( y!=r ){.    
3b40: 20 20 20 20 20 20 70 2d 3e 72 4a 44 20 2b 3d 20        p->rJD += 
3b50: 28 72 20 2d 20 79 29 2a 33 30 2e 30 3b 0a 20 20  (r - y)*30.0;.  
3b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
3b70: 6c 73 65 20 69 66 28 20 6e 3d 3d 34 20 26 26 20  lse if( n==4 && 
3b80: 73 74 72 63 6d 70 28 7a 2c 22 79 65 61 72 22 29  strcmp(z,"year")
3b90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
3ba0: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29  omputeYMD_HMS(p)
3bb0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 59 20 2b  ;.        p->Y +
3bc0: 3d 20 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = r;.        p->
3bd0: 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20  validJD = 0;.   
3be0: 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70       computeJD(p
3bf0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3c00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
3c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
3c20: 65 61 72 59 4d 44 5f 48 4d 53 5f 54 5a 28 70 29  earYMD_HMS_TZ(p)
3c30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3c40: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
3c50: 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
3c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3c70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3c80: 20 50 72 6f 63 65 73 73 20 74 69 6d 65 20 66 75   Process time fu
3c90: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
3ca0: 2e 20 20 61 72 67 76 5b 30 5d 20 69 73 20 61 20  .  argv[0] is a 
3cb0: 64 61 74 65 2d 74 69 6d 65 20 73 74 61 6d 70 2e  date-time stamp.
3cc0: 0a 2a 2a 20 61 72 67 76 5b 31 5d 20 61 6e 64 20  .** argv[1] and 
3cd0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6d 6f  following are mo
3ce0: 64 69 66 69 65 72 73 2e 20 20 50 61 72 73 65 20  difiers.  Parse 
3cf0: 74 68 65 6d 20 61 6c 6c 20 61 6e 64 20 77 72 69  them all and wri
3d00: 74 65 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  te.** the result
3d10: 69 6e 67 20 74 69 6d 65 20 69 6e 74 6f 20 74 68  ing time into th
3d20: 65 20 44 61 74 65 54 69 6d 65 20 73 74 72 75 63  e DateTime struc
3d30: 74 75 72 65 20 70 2e 20 20 52 65 74 75 72 6e 20  ture p.  Return 
3d40: 30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  0.** on success 
3d50: 61 6e 64 20 31 20 69 66 20 74 68 65 72 65 20 61  and 1 if there a
3d60: 72 65 20 61 6e 79 20 65 72 72 6f 72 73 2e 0a 2a  re any errors..*
3d70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44  /.static int isD
3d80: 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ate(.  sqlite3_c
3d90: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
3da0: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 0a 20   .  int argc, . 
3db0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3dc0: 2a 61 72 67 76 2c 20 0a 20 20 44 61 74 65 54 69  *argv, .  DateTi
3dd0: 6d 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69  me *p.){.  int i
3de0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
3df0: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  ed char *z;.  if
3e00: 28 20 61 72 67 63 3d 3d 30 20 29 20 72 65 74 75  ( argc==0 ) retu
3e10: 72 6e 20 31 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  rn 1;.  z = sqli
3e20: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
3e30: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 21  rgv[0]);.  if( !
3e40: 7a 20 7c 7c 20 70 61 72 73 65 44 61 74 65 4f 72  z || parseDateOr
3e50: 54 69 6d 65 28 63 6f 6e 74 65 78 74 2c 20 28 63  Time(context, (c
3e60: 68 61 72 2a 29 7a 2c 20 70 29 20 29 7b 0a 20 20  har*)z, p) ){.  
3e70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
3e80: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
3e90: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
3ea0: 20 28 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   (z = sqlite3_va
3eb0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
3ec0: 29 29 3d 3d 30 20 7c 7c 20 70 61 72 73 65 4d 6f  ))==0 || parseMo
3ed0: 64 69 66 69 65 72 28 28 63 68 61 72 2a 29 7a 2c  difier((char*)z,
3ee0: 20 70 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   p) ){.      ret
3ef0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3f00: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3f10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
3f20: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6d  wing routines im
3f30: 70 6c 65 6d 65 6e 74 20 74 68 65 20 76 61 72 69  plement the vari
3f40: 6f 75 73 20 64 61 74 65 20 61 6e 64 20 74 69 6d  ous date and tim
3f50: 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 6f  e functions.** o
3f60: 66 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 0a 2f 2a  f SQLite..*/../*
3f70: 0a 2a 2a 20 20 20 20 6a 75 6c 69 61 6e 64 61 79  .**    julianday
3f80: 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f  ( TIMESTRING, MO
3f90: 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a  D, MOD, ...).**.
3fa0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6a 75  ** Return the ju
3fb0: 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 20  lian day number 
3fc0: 6f 66 20 74 68 65 20 64 61 74 65 20 73 70 65 63  of the date spec
3fd0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72 67  ified in the arg
3fe0: 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  uments.*/.static
3ff0: 20 76 6f 69 64 20 6a 75 6c 69 61 6e 64 61 79 46   void juliandayF
4000: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
4010: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
4020: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
4030: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4040: 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d  rgv.){.  DateTim
4050: 65 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61 74  e x;.  if( isDat
4060: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c  e(context, argc,
4070: 20 61 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b   argv, &x)==0 ){
4080: 0a 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 26  .    computeJD(&
4090: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
40a0: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
40b0: 6e 74 65 78 74 2c 20 78 2e 72 4a 44 29 3b 0a 20  ntext, x.rJD);. 
40c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64   }.}../*.**    d
40d0: 61 74 65 74 69 6d 65 28 20 54 49 4d 45 53 54 52  atetime( TIMESTR
40e0: 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e  ING, MOD, MOD, .
40f0: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ..).**.** Return
4100: 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d   YYYY-MM-DD HH:M
4110: 4d 3a 53 53 0a 2a 2f 0a 73 74 61 74 69 63 20 76  M:SS.*/.static v
4120: 6f 69 64 20 64 61 74 65 74 69 6d 65 46 75 6e 63  oid datetimeFunc
4130: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
4140: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
4150: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
4160: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
4170: 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78  .){.  DateTime x
4180: 3b 0a 20 20 69 66 28 20 69 73 44 61 74 65 28 63  ;.  if( isDate(c
4190: 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72  ontext, argc, ar
41a0: 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20  gv, &x)==0 ){.  
41b0: 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
41c0: 3b 0a 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44  ;.    computeYMD
41d0: 5f 48 4d 53 28 26 78 29 3b 0a 20 20 20 20 73 71  _HMS(&x);.    sq
41e0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
41f0: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
4200: 66 2c 20 22 25 30 34 64 2d 25 30 32 64 2d 25 30  f, "%04d-%02d-%0
4210: 32 64 20 25 30 32 64 3a 25 30 32 64 3a 25 30 32  2d %02d:%02d:%02
4220: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
4230: 20 20 20 20 20 20 20 20 20 78 2e 59 2c 20 78 2e           x.Y, x.
4240: 4d 2c 20 78 2e 44 2c 20 78 2e 68 2c 20 78 2e 6d  M, x.D, x.h, x.m
4250: 2c 20 28 69 6e 74 29 28 78 2e 73 29 29 3b 0a 20  , (int)(x.s));. 
4260: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4270: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
4280: 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
4290: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
42a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 74 69 6d  .}../*.**    tim
42b0: 65 28 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d  e( TIMESTRING, M
42c0: 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a  OD, MOD, ...).**
42d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 48 48 3a 4d 4d  .** Return HH:MM
42e0: 3a 53 53 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  :SS.*/.static vo
42f0: 69 64 20 74 69 6d 65 46 75 6e 63 28 0a 20 20 73  id timeFunc(.  s
4300: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4310: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
4320: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
4330: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
4340: 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20 69   DateTime x;.  i
4350: 66 28 20 69 73 44 61 74 65 28 63 6f 6e 74 65 78  f( isDate(contex
4360: 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 26  t, argc, argv, &
4370: 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  x)==0 ){.    cha
4380: 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 20  r zBuf[100];.   
4390: 20 63 6f 6d 70 75 74 65 48 4d 53 28 26 78 29 3b   computeHMS(&x);
43a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
43b0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
43c0: 66 29 2c 20 7a 42 75 66 2c 20 22 25 30 32 64 3a  f), zBuf, "%02d:
43d0: 25 30 32 64 3a 25 30 32 64 22 2c 20 78 2e 68 2c  %02d:%02d", x.h,
43e0: 20 78 2e 6d 2c 20 28 69 6e 74 29 78 2e 73 29 3b   x.m, (int)x.s);
43f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
4400: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
4410: 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49  , zBuf, -1, SQLI
4420: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
4430: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 64   }.}../*.**    d
4440: 61 74 65 28 20 54 49 4d 45 53 54 52 49 4e 47 2c  ate( TIMESTRING,
4450: 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a   MOD, MOD, ...).
4460: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 59 59 59  **.** Return YYY
4470: 59 2d 4d 4d 2d 44 44 0a 2a 2f 0a 73 74 61 74 69  Y-MM-DD.*/.stati
4480: 63 20 76 6f 69 64 20 64 61 74 65 46 75 6e 63 28  c void dateFunc(
4490: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
44a0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
44b0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
44c0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
44d0: 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b  ){.  DateTime x;
44e0: 0a 20 20 69 66 28 20 69 73 44 61 74 65 28 63 6f  .  if( isDate(co
44f0: 6e 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67  ntext, argc, arg
4500: 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20  v, &x)==0 ){.   
4510: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
4520: 0a 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44 28  .    computeYMD(
4530: 26 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  &x);.    sqlite3
4540: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
4550: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
4560: 30 34 64 2d 25 30 32 64 2d 25 30 32 64 22 2c 20  04d-%02d-%02d", 
4570: 78 2e 59 2c 20 78 2e 4d 2c 20 78 2e 44 29 3b 0a  x.Y, x.M, x.D);.
4580: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4590: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
45a0: 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54   zBuf, -1, SQLIT
45b0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
45c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 74  }.}../*.**    st
45d0: 72 66 74 69 6d 65 28 20 46 4f 52 4d 41 54 2c 20  rftime( FORMAT, 
45e0: 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d 4f 44 2c  TIMESTRING, MOD,
45f0: 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a   MOD, ...).**.**
4600: 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
4610: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 46 4f   described by FO
4620: 52 4d 41 54 2e 20 20 43 6f 6e 76 65 72 73 69 6f  RMAT.  Conversio
4630: 6e 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ns as follows:.*
4640: 2a 0a 2a 2a 20 20 20 25 64 20 20 64 61 79 20 6f  *.**   %d  day o
4650: 66 20 6d 6f 6e 74 68 0a 2a 2a 20 20 20 25 66 20  f month.**   %f 
4660: 20 2a 2a 20 66 72 61 63 74 69 6f 6e 61 6c 20 73   ** fractional s
4670: 65 63 6f 6e 64 73 20 20 53 53 2e 53 53 53 0a 2a  econds  SS.SSS.*
4680: 2a 20 20 20 25 48 20 20 68 6f 75 72 20 30 30 2d  *   %H  hour 00-
4690: 32 34 0a 2a 2a 20 20 20 25 6a 20 20 64 61 79 20  24.**   %j  day 
46a0: 6f 66 20 79 65 61 72 20 30 30 30 2d 33 36 36 0a  of year 000-366.
46b0: 2a 2a 20 20 20 25 4a 20 20 2a 2a 20 4a 75 6c 69  **   %J  ** Juli
46c0: 61 6e 20 64 61 79 20 6e 75 6d 62 65 72 0a 2a 2a  an day number.**
46d0: 20 20 20 25 6d 20 20 6d 6f 6e 74 68 20 30 31 2d     %m  month 01-
46e0: 31 32 0a 2a 2a 20 20 20 25 4d 20 20 6d 69 6e 75  12.**   %M  minu
46f0: 74 65 20 30 30 2d 35 39 0a 2a 2a 20 20 20 25 73  te 00-59.**   %s
4700: 20 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20    seconds since 
4710: 31 39 37 30 2d 30 31 2d 30 31 0a 2a 2a 20 20 20  1970-01-01.**   
4720: 25 53 20 20 73 65 63 6f 6e 64 73 20 30 30 2d 35  %S  seconds 00-5
4730: 39 0a 2a 2a 20 20 20 25 77 20 20 64 61 79 20 6f  9.**   %w  day o
4740: 66 20 77 65 65 6b 20 30 2d 36 20 20 73 75 6e 64  f week 0-6  sund
4750: 61 79 3d 3d 30 0a 2a 2a 20 20 20 25 57 20 20 77  ay==0.**   %W  w
4760: 65 65 6b 20 6f 66 20 79 65 61 72 20 30 30 2d 35  eek of year 00-5
4770: 33 0a 2a 2a 20 20 20 25 59 20 20 79 65 61 72 20  3.**   %Y  year 
4780: 30 30 30 30 2d 39 39 39 39 0a 2a 2a 20 20 20 25  0000-9999.**   %
4790: 25 20 20 25 0a 2a 2f 0a 73 74 61 74 69 63 20 76  %  %.*/.static v
47a0: 6f 69 64 20 73 74 72 66 74 69 6d 65 46 75 6e 63  oid strftimeFunc
47b0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
47c0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
47d0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
47e0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
47f0: 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78  .){.  DateTime x
4800: 3b 0a 20 20 75 36 34 20 6e 3b 0a 20 20 69 6e 74  ;.  u64 n;.  int
4810: 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a   i, j;.  char *z
4820: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4830: 7a 46 6d 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  zFmt = (const ch
4840: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
4850: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
4860: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
4870: 5d 3b 0a 20 20 69 66 28 20 7a 46 6d 74 3d 3d 30  ];.  if( zFmt==0
4880: 20 7c 7c 20 69 73 44 61 74 65 28 63 6f 6e 74 65   || isDate(conte
4890: 78 74 2c 20 61 72 67 63 2d 31 2c 20 61 72 67 76  xt, argc-1, argv
48a0: 2b 31 2c 20 26 78 29 20 29 20 72 65 74 75 72 6e  +1, &x) ) return
48b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 31  ;.  for(i=0, n=1
48c0: 3b 20 7a 46 6d 74 5b 69 5d 3b 20 69 2b 2b 2c 20  ; zFmt[i]; i++, 
48d0: 6e 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46  n++){.    if( zF
48e0: 6d 74 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20  mt[i]=='%' ){.  
48f0: 20 20 20 20 73 77 69 74 63 68 28 20 7a 46 6d 74      switch( zFmt
4900: 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  [i+1] ){.       
4910: 20 63 61 73 65 20 27 64 27 3a 0a 20 20 20 20 20   case 'd':.     
4920: 20 20 20 63 61 73 65 20 27 48 27 3a 0a 20 20 20     case 'H':.   
4930: 20 20 20 20 20 63 61 73 65 20 27 6d 27 3a 0a 20       case 'm':. 
4940: 20 20 20 20 20 20 20 63 61 73 65 20 27 4d 27 3a         case 'M':
4950: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 53  .        case 'S
4960: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
4970: 27 57 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e  'W':.          n
4980: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ++;.          /*
4990: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
49a0: 20 20 20 20 20 20 63 61 73 65 20 27 77 27 3a 0a        case 'w':.
49b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 25 27          case '%'
49c0: 3a 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  :.          brea
49d0: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
49e0: 27 66 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e  'f':.          n
49f0: 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 20   += 8;.         
4a00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4a10: 63 61 73 65 20 27 6a 27 3a 0a 20 20 20 20 20 20  case 'j':.      
4a20: 20 20 20 20 6e 20 2b 3d 20 33 3b 0a 20 20 20 20      n += 3;.    
4a30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4a40: 20 20 20 20 20 63 61 73 65 20 27 59 27 3a 0a 20       case 'Y':. 
4a50: 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 38 3b           n += 8;
4a60: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4a70: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
4a80: 73 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  s':.        case
4a90: 20 27 4a 27 3a 0a 20 20 20 20 20 20 20 20 20 20   'J':.          
4aa0: 6e 20 2b 3d 20 35 30 3b 0a 20 20 20 20 20 20 20  n += 50;.       
4ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4ac0: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
4ad0: 20 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a       return;  /*
4ae0: 20 45 52 52 4f 52 2e 20 20 72 65 74 75 72 6e 20   ERROR.  return 
4af0: 61 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  a NULL */.      
4b00: 7d 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  }.      i++;.   
4b10: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 73   }.  }.  if( n<s
4b20: 69 7a 65 6f 66 28 7a 42 75 66 29 20 29 7b 0a 20  izeof(zBuf) ){. 
4b30: 20 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 7d     z = zBuf;.  }
4b40: 65 6c 73 65 20 69 66 28 20 6e 3e 53 51 4c 49 54  else if( n>SQLIT
4b50: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 7b 0a  E_MAX_LENGTH ){.
4b60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4b70: 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69 67 28  lt_error_toobig(
4b80: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 65  context);.    re
4b90: 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  turn;.  }else{. 
4ba0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
4bb0: 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20  alloc( n );.    
4bc0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
4bd0: 6e 3b 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65  n;.  }.  compute
4be0: 4a 44 28 26 78 29 3b 0a 20 20 63 6f 6d 70 75 74  JD(&x);.  comput
4bf0: 65 59 4d 44 5f 48 4d 53 28 26 78 29 3b 0a 20 20  eYMD_HMS(&x);.  
4c00: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 46 6d 74 5b  for(i=j=0; zFmt[
4c10: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
4c20: 28 20 7a 46 6d 74 5b 69 5d 21 3d 27 25 27 20 29  ( zFmt[i]!='%' )
4c30: 7b 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d  {.      z[j++] =
4c40: 20 7a 46 6d 74 5b 69 5d 3b 0a 20 20 20 20 7d 65   zFmt[i];.    }e
4c50: 6c 73 65 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  lse{.      i++;.
4c60: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 7a 46        switch( zF
4c70: 6d 74 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  mt[i] ){.       
4c80: 20 63 61 73 65 20 27 64 27 3a 20 20 73 71 6c 69   case 'd':  sqli
4c90: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
4ca0: 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 44  &z[j],"%02d",x.D
4cb0: 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a  ); j+=2; break;.
4cc0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 66 27          case 'f'
4cd0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  : {.          do
4ce0: 75 62 6c 65 20 73 20 3d 20 78 2e 73 3b 0a 20 20  uble s = x.s;.  
4cf0: 20 20 20 20 20 20 20 20 69 66 28 20 73 3e 35 39          if( s>59
4d00: 2e 39 39 39 20 29 20 73 20 3d 20 35 39 2e 39 39  .999 ) s = 59.99
4d10: 39 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  9;.          sql
4d20: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 37 2c  ite3_snprintf(7,
4d30: 20 26 7a 5b 6a 5d 2c 22 25 30 36 2e 33 66 22 2c   &z[j],"%06.3f",
4d40: 20 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   s);.          j
4d50: 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 5b 6a 5d   += strlen(&z[j]
4d60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
4d70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4d80: 20 20 20 20 20 20 63 61 73 65 20 27 48 27 3a 20        case 'H': 
4d90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4da0: 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64  f(3, &z[j],"%02d
4db0: 22 2c 78 2e 68 29 3b 20 6a 2b 3d 32 3b 20 62 72  ",x.h); j+=2; br
4dc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
4dd0: 65 20 27 57 27 3a 20 2f 2a 20 46 61 6c 6c 20 74  e 'W': /* Fall t
4de0: 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hru */.        c
4df0: 61 73 65 20 27 6a 27 3a 20 7b 0a 20 20 20 20 20  ase 'j': {.     
4e00: 20 20 20 20 20 69 6e 74 20 6e 44 61 79 3b 20 20       int nDay;  
4e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4e20: 6d 62 65 72 20 6f 66 20 64 61 79 73 20 73 69 6e  mber of days sin
4e30: 63 65 20 31 73 74 20 64 61 79 20 6f 66 20 79 65  ce 1st day of ye
4e40: 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ar */.          
4e50: 44 61 74 65 54 69 6d 65 20 79 20 3d 20 78 3b 0a  DateTime y = x;.
4e60: 20 20 20 20 20 20 20 20 20 20 79 2e 76 61 6c 69            y.vali
4e70: 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dJD = 0;.       
4e80: 20 20 20 79 2e 4d 20 3d 20 31 3b 0a 20 20 20 20     y.M = 1;.    
4e90: 20 20 20 20 20 20 79 2e 44 20 3d 20 31 3b 0a 20        y.D = 1;. 
4ea0: 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65           compute
4eb0: 4a 44 28 26 79 29 3b 0a 20 20 20 20 20 20 20 20  JD(&y);.        
4ec0: 20 20 6e 44 61 79 20 3d 20 78 2e 72 4a 44 20 2d    nDay = x.rJD -
4ed0: 20 79 2e 72 4a 44 20 2b 20 30 2e 35 3b 0a 20 20   y.rJD + 0.5;.  
4ee0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 6d 74          if( zFmt
4ef0: 5b 69 5d 3d 3d 27 57 27 20 29 7b 0a 20 20 20 20  [i]=='W' ){.    
4f00: 20 20 20 20 20 20 20 20 69 6e 74 20 77 64 3b 20          int wd; 
4f10: 20 20 2f 2a 20 30 3d 4d 6f 6e 64 61 79 2c 20 31    /* 0=Monday, 1
4f20: 3d 54 75 65 73 64 61 79 2c 20 2e 2e 2e 20 36 3d  =Tuesday, ... 6=
4f30: 53 75 6e 64 61 79 20 2a 2f 0a 20 20 20 20 20 20  Sunday */.      
4f40: 20 20 20 20 20 20 77 64 20 3d 20 28 28 69 6e 74        wd = ((int
4f50: 29 28 78 2e 72 4a 44 2b 30 2e 35 29 29 20 25 20  )(x.rJD+0.5)) % 
4f60: 37 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  7;.            s
4f70: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4f80: 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c  3, &z[j],"%02d",
4f90: 28 6e 44 61 79 2b 37 2d 77 64 29 2f 37 29 3b 0a  (nDay+7-wd)/7);.
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d              j +=
4fb0: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   2;.          }e
4fc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
4fd0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4fe0: 66 28 34 2c 20 26 7a 5b 6a 5d 2c 22 25 30 33 64  f(4, &z[j],"%03d
4ff0: 22 2c 6e 44 61 79 2b 31 29 3b 0a 20 20 20 20 20  ",nDay+1);.     
5000: 20 20 20 20 20 20 20 6a 20 2b 3d 20 33 3b 0a 20         j += 3;. 
5010: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5020: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5030: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5040: 73 65 20 27 4a 27 3a 20 7b 0a 20 20 20 20 20 20  se 'J': {.      
5050: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5060: 69 6e 74 66 28 32 30 2c 20 26 7a 5b 6a 5d 2c 22  intf(20, &z[j],"
5070: 25 2e 31 36 67 22 2c 78 2e 72 4a 44 29 3b 0a 20  %.16g",x.rJD);. 
5080: 20 20 20 20 20 20 20 20 20 6a 2b 3d 73 74 72 6c           j+=strl
5090: 65 6e 28 26 7a 5b 6a 5d 29 3b 0a 20 20 20 20 20  en(&z[j]);.     
50a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
50b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
50c0: 73 65 20 27 6d 27 3a 20 20 73 71 6c 69 74 65 33  se 'm':  sqlite3
50d0: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 26 7a 5b  _snprintf(3, &z[
50e0: 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 4d 29 3b 20  j],"%02d",x.M); 
50f0: 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20  j+=2; break;.   
5100: 20 20 20 20 20 63 61 73 65 20 27 4d 27 3a 20 20       case 'M':  
5110: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
5120: 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22  (3, &z[j],"%02d"
5130: 2c 78 2e 6d 29 3b 20 6a 2b 3d 32 3b 20 62 72 65  ,x.m); j+=2; bre
5140: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
5150: 20 27 73 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   's': {.        
5160: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
5170: 74 66 28 33 30 2c 26 7a 5b 6a 5d 2c 22 25 64 22  tf(30,&z[j],"%d"
5180: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
51a0: 74 29 28 28 78 2e 72 4a 44 2d 32 34 34 30 35 38  t)((x.rJD-244058
51b0: 37 2e 35 29 2a 38 36 34 30 30 2e 30 20 2b 20 30  7.5)*86400.0 + 0
51c0: 2e 35 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  .5));.          
51d0: 6a 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 5b 6a  j += strlen(&z[j
51e0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ]);.          br
51f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5200: 20 20 20 20 20 20 20 63 61 73 65 20 27 53 27 3a         case 'S':
5210: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
5220: 74 66 28 33 2c 26 7a 5b 6a 5d 2c 22 25 30 32 64  tf(3,&z[j],"%02d
5230: 22 2c 28 69 6e 74 29 78 2e 73 29 3b 20 6a 2b 3d  ",(int)x.s); j+=
5240: 32 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  2; break;.      
5250: 20 20 63 61 73 65 20 27 77 27 3a 20 20 7a 5b 6a    case 'w':  z[j
5260: 2b 2b 5d 20 3d 20 28 28 28 69 6e 74 29 28 78 2e  ++] = (((int)(x.
5270: 72 4a 44 2b 31 2e 35 29 29 20 25 20 37 29 20 2b  rJD+1.5)) % 7) +
5280: 20 27 30 27 3b 20 62 72 65 61 6b 3b 0a 20 20 20   '0'; break;.   
5290: 20 20 20 20 20 63 61 73 65 20 27 59 27 3a 20 20       case 'Y':  
52a0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
52b0: 28 35 2c 26 7a 5b 6a 5d 2c 22 25 30 34 64 22 2c  (5,&z[j],"%04d",
52c0: 78 2e 59 29 3b 20 6a 2b 3d 73 74 72 6c 65 6e 28  x.Y); j+=strlen(
52d0: 26 7a 5b 6a 5d 29 3b 62 72 65 61 6b 3b 0a 20 20  &z[j]);break;.  
52e0: 20 20 20 20 20 20 63 61 73 65 20 27 25 27 3a 20        case '%': 
52f0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 25 27 3b 20 62   z[j++] = '%'; b
5300: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5310: 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d    }.  }.  z[j] =
5320: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
5330: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
5340: 74 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  t, z, -1, SQLITE
5350: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
5360: 66 28 20 7a 21 3d 7a 42 75 66 20 29 7b 0a 20 20  f( z!=zBuf ){.  
5370: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
5380: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5390: 63 75 72 72 65 6e 74 5f 74 69 6d 65 28 29 0a 2a  current_time().*
53a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
53b0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
53c0: 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 69 6d  ame value as tim
53d0: 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74 61  e('now')..*/.sta
53e0: 74 69 63 20 76 6f 69 64 20 63 74 69 6d 65 46 75  tic void ctimeFu
53f0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
5400: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
5410: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
5420: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
5430: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gv.){.  sqlite3_
5440: 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 73 71  value *pVal = sq
5450: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
5460: 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a  ;.  if( pVal ){.
5470: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
5480: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
5490: 20 22 6e 6f 77 22 2c 20 53 51 4c 49 54 45 5f 55   "now", SQLITE_U
54a0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
54b0: 49 43 29 3b 0a 20 20 20 20 74 69 6d 65 46 75 6e  IC);.    timeFun
54c0: 63 28 63 6f 6e 74 65 78 74 2c 20 31 2c 20 26 70  c(context, 1, &p
54d0: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
54e0: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
54f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63  ;.  }.}../*.** c
5500: 75 72 72 65 6e 74 5f 64 61 74 65 28 29 0a 2a 2a  urrent_date().**
5510: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5520: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61  n returns the sa
5530: 6d 65 20 76 61 6c 75 65 20 61 73 20 64 61 74 65  me value as date
5540: 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73 74 61 74  ('now')..*/.stat
5550: 69 63 20 76 6f 69 64 20 63 64 61 74 65 46 75 6e  ic void cdateFun
5560: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5570: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
5580: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
5590: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
55a0: 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  v.){.  sqlite3_v
55b0: 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 73 71 6c  alue *pVal = sql
55c0: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
55d0: 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20  .  if( pVal ){. 
55e0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
55f0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
5600: 22 6e 6f 77 22 2c 20 53 51 4c 49 54 45 5f 55 54  "now", SQLITE_UT
5610: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
5620: 43 29 3b 0a 20 20 20 20 64 61 74 65 46 75 6e 63  C);.    dateFunc
5630: 28 63 6f 6e 74 65 78 74 2c 20 31 2c 20 26 70 56  (context, 1, &pV
5640: 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
5650: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
5660: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75  .  }.}../*.** cu
5670: 72 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70 28  rrent_timestamp(
5680: 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ).**.** This fun
5690: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
56a0: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
56b0: 64 61 74 65 74 69 6d 65 28 27 6e 6f 77 27 29 2e  datetime('now').
56c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
56d0: 63 74 69 6d 65 73 74 61 6d 70 46 75 6e 63 28 0a  ctimestampFunc(.
56e0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
56f0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
5700: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
5710: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
5720: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  {.  sqlite3_valu
5730: 65 20 2a 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  e *pVal = sqlite
5740: 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
5750: 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20  if( pVal ){.    
5760: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
5770: 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 6e 6f  tr(pVal, -1, "no
5780: 77 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  w", SQLITE_UTF8,
5790: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
57a0: 0a 20 20 20 20 64 61 74 65 74 69 6d 65 46 75 6e  .    datetimeFun
57b0: 63 28 63 6f 6e 74 65 78 74 2c 20 31 2c 20 26 70  c(context, 1, &p
57c0: 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
57d0: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
57e0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
57f0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
5800: 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f  E_OMIT_DATETIME_
5810: 46 55 4e 43 53 29 20 2a 2f 0a 0a 23 69 66 64 65  FUNCS) */..#ifde
5820: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41  f SQLITE_OMIT_DA
5830: 54 45 54 49 4d 45 5f 46 55 4e 43 53 0a 2f 2a 0a  TETIME_FUNCS./*.
5840: 2a 2a 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  ** If the librar
5850: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  y is compiled to
5860: 20 6f 6d 69 74 20 74 68 65 20 66 75 6c 6c 2d 73   omit the full-s
5870: 63 61 6c 65 20 64 61 74 65 20 61 6e 64 20 74 69  cale date and ti
5880: 6d 65 0a 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 28  me.** handling (
5890: 74 6f 20 67 65 74 20 61 20 73 6d 61 6c 6c 65 72  to get a smaller
58a0: 20 62 69 6e 61 72 79 29 2c 20 74 68 65 20 66 6f   binary), the fo
58b0: 6c 6c 6f 77 69 6e 67 20 6d 69 6e 69 6d 61 6c 20  llowing minimal 
58c0: 76 65 72 73 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  version.** of th
58d0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 63 75 72 72  e functions curr
58e0: 65 6e 74 5f 74 69 6d 65 28 29 2c 20 63 75 72 72  ent_time(), curr
58f0: 65 6e 74 5f 64 61 74 65 28 29 20 61 6e 64 20 63  ent_date() and c
5900: 75 72 72 65 6e 74 5f 74 69 6d 65 73 74 61 6d 70  urrent_timestamp
5910: 28 29 0a 2a 2a 20 61 72 65 20 69 6e 63 6c 75 64  ().** are includ
5920: 65 64 20 69 6e 73 74 65 61 64 2e 20 54 68 69 73  ed instead. This
5930: 20 69 73 20 74 6f 20 73 75 70 70 6f 72 74 20 63   is to support c
5940: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
5950: 6e 73 20 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75  ns that.** inclu
5960: 64 65 20 22 44 45 46 41 55 4c 54 20 43 55 52 52  de "DEFAULT CURR
5970: 45 4e 54 5f 54 49 4d 45 22 20 65 74 63 2e 0a 2a  ENT_TIME" etc..*
5980: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5990: 6f 6e 20 75 73 65 73 20 74 68 65 20 43 2d 6c 69  on uses the C-li
59a0: 62 72 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 20  brary functions 
59b0: 74 69 6d 65 28 29 2c 20 67 6d 74 69 6d 65 28 29  time(), gmtime()
59c0: 0a 2a 2a 20 61 6e 64 20 73 74 72 66 74 69 6d 65  .** and strftime
59d0: 28 29 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 73  (). The format s
59e0: 74 72 69 6e 67 20 74 6f 20 70 61 73 73 20 74 6f  tring to pass to
59f0: 20 73 74 72 66 74 69 6d 65 28 29 20 69 73 20 73   strftime() is s
5a00: 75 70 70 6c 69 65 64 0a 2a 2a 20 61 73 20 74 68  upplied.** as th
5a10: 65 20 75 73 65 72 2d 64 61 74 61 20 66 6f 72 20  e user-data for 
5a20: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  the function..*/
5a30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 75 72  .static void cur
5a40: 72 65 6e 74 54 69 6d 65 46 75 6e 63 28 0a 20 20  rentTimeFunc(.  
5a50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5a60: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
5a70: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
5a80: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
5a90: 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 63 68    time_t t;.  ch
5aa0: 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 28 63  ar *zFormat = (c
5ab0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  har *)sqlite3_us
5ac0: 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
5ad0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30  ;.  char zBuf[20
5ae0: 5d 3b 0a 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a  ];..  time(&t);.
5af0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
5b00: 53 54 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72  ST.  {.    exter
5b10: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  n int sqlite3_cu
5b20: 72 72 65 6e 74 5f 74 69 6d 65 3b 20 20 2f 2a 20  rrent_time;  /* 
5b30: 53 65 65 20 6f 73 5f 58 58 58 2e 63 20 2a 2f 0a  See os_XXX.c */.
5b40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
5b50: 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
5b60: 20 20 20 20 20 20 74 20 3d 20 73 71 6c 69 74 65        t = sqlite
5b70: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a  3_current_time;.
5b80: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
5b90: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 4d  ..#ifdef HAVE_GM
5ba0: 54 49 4d 45 5f 52 0a 20 20 7b 0a 20 20 20 20 73  TIME_R.  {.    s
5bb0: 74 72 75 63 74 20 74 6d 20 73 4e 6f 77 3b 0a 20  truct tm sNow;. 
5bc0: 20 20 20 67 6d 74 69 6d 65 5f 72 28 26 74 2c 20     gmtime_r(&t, 
5bd0: 26 73 4e 6f 77 29 3b 0a 20 20 20 20 73 74 72 66  &sNow);.    strf
5be0: 74 69 6d 65 28 7a 42 75 66 2c 20 32 30 2c 20 7a  time(zBuf, 20, z
5bf0: 46 6f 72 6d 61 74 2c 20 26 73 4e 6f 77 29 3b 0a  Format, &sNow);.
5c00: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
5c10: 20 20 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d    struct tm *pTm
5c20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
5c30: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
5c40: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
5c50: 4c 49 54 45 5f 4d 55 54 45 58 5f 47 4c 4f 42 41  LITE_MUTEX_GLOBA
5c60: 4c 29 29 3b 0a 20 20 20 20 70 54 6d 20 3d 20 67  L));.    pTm = g
5c70: 6d 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 73  mtime(&t);.    s
5c80: 74 72 66 74 69 6d 65 28 7a 42 75 66 2c 20 32 30  trftime(zBuf, 20
5c90: 2c 20 7a 46 6f 72 6d 61 74 2c 20 70 54 6d 29 3b  , zFormat, pTm);
5ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
5cb0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
5cc0: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
5cd0: 49 54 45 5f 4d 55 54 45 58 5f 47 4c 4f 42 41 4c  ITE_MUTEX_GLOBAL
5ce0: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
5cf0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5d00: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a  _text(context, z
5d10: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
5d20: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65  TRANSIENT);.}.#e
5d30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
5d40: 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74   function regist
5d50: 65 72 65 64 20 61 6c 6c 20 6f 66 20 74 68 65 20  ered all of the 
5d60: 61 62 6f 76 65 20 43 20 66 75 6e 63 74 69 6f 6e  above C function
5d70: 73 20 61 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63  s as SQL.** func
5d80: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 73 68 6f  tions.  This sho
5d90: 75 6c 64 20 62 65 20 74 68 65 20 6f 6e 6c 79 20  uld be the only 
5da0: 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 69 73 20  routine in this 
5db0: 66 69 6c 65 20 77 69 74 68 0a 2a 2a 20 65 78 74  file with.** ext
5dc0: 65 72 6e 61 6c 20 6c 69 6e 6b 61 67 65 2e 0a 2a  ernal linkage..*
5dd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
5de0: 67 69 73 74 65 72 44 61 74 65 54 69 6d 65 46 75  gisterDateTimeFu
5df0: 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65 33 20  nctions(sqlite3 
5e00: 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  *db){.#ifndef SQ
5e10: 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49  LITE_OMIT_DATETI
5e20: 4d 45 5f 46 55 4e 43 53 0a 20 20 73 74 61 74 69  ME_FUNCS.  stati
5e30: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
5e40: 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
5e50: 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41 72 67  e;.     int nArg
5e60: 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 46  ;.     void (*xF
5e70: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
5e80: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
5e90: 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 7d 20  3_value**);.  } 
5ea0: 61 46 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20  aFuncs[] = {.   
5eb0: 20 7b 20 22 6a 75 6c 69 61 6e 64 61 79 22 2c 20   { "julianday", 
5ec0: 2d 31 2c 20 6a 75 6c 69 61 6e 64 61 79 46 75 6e  -1, juliandayFun
5ed0: 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 61  c   },.    { "da
5ee0: 74 65 22 2c 20 20 20 20 20 20 2d 31 2c 20 64 61  te",      -1, da
5ef0: 74 65 46 75 6e 63 20 20 20 20 20 20 20 20 7d 2c  teFunc        },
5f00: 0a 20 20 20 20 7b 20 22 74 69 6d 65 22 2c 20 20  .    { "time",  
5f10: 20 20 20 20 2d 31 2c 20 74 69 6d 65 46 75 6e 63      -1, timeFunc
5f20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
5f30: 20 22 64 61 74 65 74 69 6d 65 22 2c 20 20 2d 31   "datetime",  -1
5f40: 2c 20 64 61 74 65 74 69 6d 65 46 75 6e 63 20 20  , datetimeFunc  
5f50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 72 66    },.    { "strf
5f60: 74 69 6d 65 22 2c 20 20 2d 31 2c 20 73 74 72 66  time",  -1, strf
5f70: 74 69 6d 65 46 75 6e 63 20 20 20 20 7d 2c 0a 20  timeFunc    },. 
5f80: 20 20 20 7b 20 22 63 75 72 72 65 6e 74 5f 74 69     { "current_ti
5f90: 6d 65 22 2c 20 20 20 20 20 20 20 30 2c 20 63 74  me",       0, ct
5fa0: 69 6d 65 46 75 6e 63 20 20 20 20 20 20 7d 2c 0a  imeFunc      },.
5fb0: 20 20 20 20 7b 20 22 63 75 72 72 65 6e 74 5f 74      { "current_t
5fc0: 69 6d 65 73 74 61 6d 70 22 2c 20 20 30 2c 20 63  imestamp",  0, c
5fd0: 74 69 6d 65 73 74 61 6d 70 46 75 6e 63 20 7d 2c  timestampFunc },
5fe0: 0a 20 20 20 20 7b 20 22 63 75 72 72 65 6e 74 5f  .    { "current_
5ff0: 64 61 74 65 22 2c 20 20 20 20 20 20 20 30 2c 20  date",       0, 
6000: 63 64 61 74 65 46 75 6e 63 20 20 20 20 20 20 7d  cdateFunc      }
6010: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
6020: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
6030: 7a 65 6f 66 28 61 46 75 6e 63 73 29 2f 73 69 7a  zeof(aFuncs)/siz
6040: 65 6f 66 28 61 46 75 6e 63 73 5b 30 5d 29 3b 20  eof(aFuncs[0]); 
6050: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
6060: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
6070: 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d 65 2c  aFuncs[i].zName,
6080: 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 41 72 67 2c   aFuncs[i].nArg,
6090: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
60a0: 55 54 46 38 2c 20 28 76 6f 69 64 20 2a 29 28 64  UTF8, (void *)(d
60b0: 62 2d 3e 70 56 66 73 29 2c 20 61 46 75 6e 63 73  b->pVfs), aFuncs
60c0: 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c 20 30 29  [i].xFunc, 0, 0)
60d0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 74  ;.  }.#else.  st
60e0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
60f0: 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
6100: 4e 61 6d 65 3b 0a 20 20 20 20 20 63 68 61 72 20  Name;.     char 
6110: 2a 7a 46 6f 72 6d 61 74 3b 0a 20 20 7d 20 61 46  *zFormat;.  } aF
6120: 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  uncs[] = {.    {
6130: 20 22 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c   "current_time",
6140: 20 22 25 48 3a 25 4d 3a 25 53 22 20 7d 2c 0a 20   "%H:%M:%S" },. 
6150: 20 20 20 7b 20 22 63 75 72 72 65 6e 74 5f 64 61     { "current_da
6160: 74 65 22 2c 20 22 25 59 2d 25 6d 2d 25 64 22 20  te", "%Y-%m-%d" 
6170: 7d 2c 0a 20 20 20 20 7b 20 22 63 75 72 72 65 6e  },.    { "curren
6180: 74 5f 74 69 6d 65 73 74 61 6d 70 22 2c 20 22 25  t_timestamp", "%
6190: 59 2d 25 6d 2d 25 64 20 25 48 3a 25 4d 3a 25 53  Y-%m-%d %H:%M:%S
61a0: 22 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  " }.  };.  int i
61b0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
61c0: 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 29 2f 73  sizeof(aFuncs)/s
61d0: 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b 30 5d 29  izeof(aFuncs[0])
61e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
61f0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
6200: 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61 6d  , aFuncs[i].zNam
6210: 65 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  e, 0, SQLITE_UTF
6220: 38 2c 20 0a 20 20 20 20 20 20 20 20 61 46 75 6e  8, .        aFun
6230: 63 73 5b 69 5d 2e 7a 46 6f 72 6d 61 74 2c 20 63  cs[i].zFormat, c
6240: 75 72 72 65 6e 74 54 69 6d 65 46 75 6e 63 2c 20  urrentTimeFunc, 
6250: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
6260: 66 0a 7d 0a                                      f.}.