/ Hex Artifact Content
Login

Artifact 719afa5531c5350f2929d36122a7e0355c0f3d70:


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 39 37 20 32 30 30 38 2f 31 32  c,v 1.97 2008/12
02a0: 2f 31 30 20 32 31 3a 31 39 3a 35 37 20 64 72 68  /10 21:19:57 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 4f 6e 20 72 65 63  CS../*.** On rec
0780: 65 6e 74 20 57 69 6e 64 6f 77 73 20 70 6c 61 74  ent Windows plat
0790: 66 6f 72 6d 73 2c 20 74 68 65 20 6c 6f 63 61 6c  forms, the local
07a0: 74 69 6d 65 5f 73 28 29 20 66 75 6e 63 74 69 6f  time_s() functio
07b0: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a  n is available.*
07c0: 2a 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  * as part of the
07d0: 20 22 53 65 63 75 72 65 20 43 52 54 22 2e 20 49   "Secure CRT". I
07e0: 74 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79  t is essentially
07f0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 0a   equivalent to .
0800: 2a 2a 20 6c 6f 63 61 6c 74 69 6d 65 5f 72 28 29  ** localtime_r()
0810: 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72   available under
0820: 20 6d 6f 73 74 20 50 4f 53 49 58 20 70 6c 61 74   most POSIX plat
0830: 66 6f 72 6d 73 2c 20 65 78 63 65 70 74 20 74 68  forms, except th
0840: 61 74 20 74 68 65 20 0a 2a 2a 20 6f 72 64 65 72  at the .** order
0850: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
0860: 72 73 20 69 73 20 72 65 76 65 72 73 65 64 2e 0a  rs is reversed..
0870: 2a 2a 0a 2a 2a 20 53 65 65 20 68 74 74 70 3a 2f  **.** See http:/
0880: 2f 6d 73 64 6e 2e 6d 69 63 72 6f 73 6f 66 74 2e  /msdn.microsoft.
0890: 63 6f 6d 2f 65 6e 2d 75 73 2f 6c 69 62 72 61 72  com/en-us/librar
08a0: 79 2f 61 34 34 32 78 33 79 65 28 56 53 2e 38 30  y/a442x3ye(VS.80
08b0: 29 2e 61 73 70 78 2e 0a 2a 2a 0a 2a 2a 20 49 66  ).aspx..**.** If
08c0: 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f   the user has no
08d0: 74 20 69 6e 64 69 63 61 74 65 64 20 74 6f 20 75  t indicated to u
08e0: 73 65 20 6c 6f 63 61 6c 74 69 6d 65 5f 72 28 29  se localtime_r()
08f0: 20 6f 72 20 6c 6f 63 61 6c 74 69 6d 65 5f 73 28   or localtime_s(
0900: 29 0a 2a 2a 20 61 6c 72 65 61 64 79 2c 20 63 68  ).** already, ch
0910: 65 63 6b 20 66 6f 72 20 61 6e 20 4d 53 56 43 20  eck for an MSVC 
0920: 62 75 69 6c 64 20 65 6e 76 69 72 6f 6e 6d 65 6e  build environmen
0930: 74 20 74 68 61 74 20 70 72 6f 76 69 64 65 73 20  t that provides 
0940: 0a 2a 2a 20 6c 6f 63 61 6c 74 69 6d 65 5f 73 28  .** localtime_s(
0950: 29 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  )..*/.#if !defin
0960: 65 64 28 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d  ed(HAVE_LOCALTIM
0970: 45 5f 52 29 20 26 26 20 21 64 65 66 69 6e 65 64  E_R) && !defined
0980: 28 48 41 56 45 5f 4c 4f 43 41 4c 54 49 4d 45 5f  (HAVE_LOCALTIME_
0990: 53 29 20 26 26 20 5c 0a 20 20 20 20 20 64 65 66  S) && \.     def
09a0: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26  ined(_MSC_VER) &
09b0: 26 20 64 65 66 69 6e 65 64 28 5f 43 52 54 5f 49  & defined(_CRT_I
09c0: 4e 53 45 43 55 52 45 5f 44 45 50 52 45 43 41 54  NSECURE_DEPRECAT
09d0: 45 29 0a 23 64 65 66 69 6e 65 20 48 41 56 45 5f  E).#define HAVE_
09e0: 4c 4f 43 41 4c 54 49 4d 45 5f 53 20 31 0a 23 65  LOCALTIME_S 1.#e
09f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  ndif../*.** A st
0a00: 72 75 63 74 75 72 65 20 66 6f 72 20 68 6f 6c 64  ructure for hold
0a10: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 64 61 74  ing a single dat
0a20: 65 20 61 6e 64 20 74 69 6d 65 2e 0a 2a 2f 0a 74  e and time..*/.t
0a30: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44 61  ypedef struct Da
0a40: 74 65 54 69 6d 65 20 44 61 74 65 54 69 6d 65 3b  teTime DateTime;
0a50: 0a 73 74 72 75 63 74 20 44 61 74 65 54 69 6d 65  .struct DateTime
0a60: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74   {.  sqlite3_int
0a70: 36 34 20 69 4a 44 3b 20 2f 2a 20 54 68 65 20 6a  64 iJD; /* The j
0a80: 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72  ulian day number
0a90: 20 74 69 6d 65 73 20 38 36 34 30 30 30 30 30 20   times 86400000 
0aa0: 2a 2f 0a 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44  */.  int Y, M, D
0ab0: 3b 20 20 20 20 20 20 20 2f 2a 20 59 65 61 72 2c  ;       /* Year,
0ac0: 20 6d 6f 6e 74 68 2c 20 61 6e 64 20 64 61 79 20   month, and day 
0ad0: 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 6d 3b 20 20  */.  int h, m;  
0ae0: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 75 72 20          /* Hour 
0af0: 61 6e 64 20 6d 69 6e 75 74 65 73 20 2a 2f 0a 20  and minutes */. 
0b00: 20 69 6e 74 20 74 7a 3b 20 20 20 20 20 20 20 20   int tz;        
0b10: 20 20 20 20 2f 2a 20 54 69 6d 65 7a 6f 6e 65 20      /* Timezone 
0b20: 6f 66 66 73 65 74 20 69 6e 20 6d 69 6e 75 74 65  offset in minute
0b30: 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 73 3b  s */.  double s;
0b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
0b50: 6f 6e 64 73 20 2a 2f 0a 20 20 63 68 61 72 20 76  onds */.  char v
0b60: 61 6c 69 64 59 4d 44 3b 20 20 20 20 20 2f 2a 20  alidYMD;     /* 
0b70: 54 72 75 65 20 28 31 29 20 69 66 20 59 2c 4d 2c  True (1) if Y,M,
0b80: 44 20 61 72 65 20 76 61 6c 69 64 20 2a 2f 0a 20  D are valid */. 
0b90: 20 63 68 61 72 20 76 61 6c 69 64 48 4d 53 3b 20   char validHMS; 
0ba0: 20 20 20 20 2f 2a 20 54 72 75 65 20 28 31 29 20      /* True (1) 
0bb0: 69 66 20 68 2c 6d 2c 73 20 61 72 65 20 76 61 6c  if h,m,s are val
0bc0: 69 64 20 2a 2f 0a 20 20 63 68 61 72 20 76 61 6c  id */.  char val
0bd0: 69 64 4a 44 3b 20 20 20 20 20 20 2f 2a 20 54 72  idJD;      /* Tr
0be0: 75 65 20 28 31 29 20 69 66 20 69 4a 44 20 69 73  ue (1) if iJD is
0bf0: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 63 68 61 72   valid */.  char
0c00: 20 76 61 6c 69 64 54 5a 3b 20 20 20 20 20 20 2f   validTZ;      /
0c10: 2a 20 54 72 75 65 20 28 31 29 20 69 66 20 74 7a  * True (1) if tz
0c20: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a   is valid */.};.
0c30: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
0c40: 7a 44 61 74 65 20 69 6e 74 6f 20 6f 6e 65 20 6f  zDate into one o
0c50: 72 20 6d 6f 72 65 20 69 6e 74 65 67 65 72 73 2e  r more integers.
0c60: 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 61 72 67    Additional arg
0c70: 75 6d 65 6e 74 73 0a 2a 2a 20 63 6f 6d 65 20 69  uments.** come i
0c80: 6e 20 67 72 6f 75 70 73 20 6f 66 20 35 20 61 73  n groups of 5 as
0c90: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
0ca0: 20 20 20 20 20 20 4e 20 20 20 20 20 20 20 6e 75        N       nu
0cb0: 6d 62 65 72 20 6f 66 20 64 69 67 69 74 73 20 69  mber of digits i
0cc0: 6e 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  n the integer.**
0cd0: 20 20 20 20 20 20 20 6d 69 6e 20 20 20 20 20 6d         min     m
0ce0: 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 76  inimum allowed v
0cf0: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
0d00: 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 6d 61 78  ger.**       max
0d10: 20 20 20 20 20 6d 61 78 69 6d 75 6d 20 61 6c 6c       maximum all
0d20: 6f 77 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68  owed value of th
0d30: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  e integer.**    
0d40: 20 20 20 6e 65 78 74 43 20 20 20 66 69 72 73 74     nextC   first
0d50: 20 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72   character after
0d60: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
0d70: 20 20 20 20 20 20 70 56 61 6c 20 20 20 20 77 68        pVal    wh
0d80: 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
0d90: 20 69 6e 74 65 67 65 72 73 20 76 61 6c 75 65 2e   integers value.
0da0: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 73 69 6f  .**.** Conversio
0db0: 6e 73 20 63 6f 6e 74 69 6e 75 65 20 75 6e 74 69  ns continue unti
0dc0: 6c 20 6f 6e 65 20 77 69 74 68 20 6e 65 78 74 43  l one with nextC
0dd0: 3d 3d 30 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ==0 is encounter
0de0: 65 64 2e 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74  ed..** The funct
0df0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
0e00: 6e 75 6d 62 65 72 20 6f 66 20 73 75 63 63 65 73  number of succes
0e10: 73 66 75 6c 20 63 6f 6e 76 65 72 73 69 6f 6e 73  sful conversions
0e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0e30: 67 65 74 44 69 67 69 74 73 28 63 6f 6e 73 74 20  getDigits(const 
0e40: 63 68 61 72 20 2a 7a 44 61 74 65 2c 20 2e 2e 2e  char *zDate, ...
0e50: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
0e60: 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 69 6e  .  int val;.  in
0e70: 74 20 4e 3b 0a 20 20 69 6e 74 20 6d 69 6e 3b 0a  t N;.  int min;.
0e80: 20 20 69 6e 74 20 6d 61 78 3b 0a 20 20 69 6e 74    int max;.  int
0e90: 20 6e 65 78 74 43 3b 0a 20 20 69 6e 74 20 2a 70   nextC;.  int *p
0ea0: 56 61 6c 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  Val;.  int cnt =
0eb0: 20 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   0;.  va_start(a
0ec0: 70 2c 20 7a 44 61 74 65 29 3b 0a 20 20 64 6f 7b  p, zDate);.  do{
0ed0: 0a 20 20 20 20 4e 20 3d 20 76 61 5f 61 72 67 28  .    N = va_arg(
0ee0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 6d 69  ap, int);.    mi
0ef0: 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  n = va_arg(ap, i
0f00: 6e 74 29 3b 0a 20 20 20 20 6d 61 78 20 3d 20 76  nt);.    max = v
0f10: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
0f20: 20 20 20 20 6e 65 78 74 43 20 3d 20 76 61 5f 61      nextC = va_a
0f30: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
0f40: 20 70 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61   pVal = va_arg(a
0f50: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 76 61  p, int*);.    va
0f60: 6c 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  l = 0;.    while
0f70: 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 69  ( N-- ){.      i
0f80: 66 28 20 21 69 73 64 69 67 69 74 28 2a 28 75 38  f( !isdigit(*(u8
0f90: 2a 29 7a 44 61 74 65 29 20 29 7b 0a 20 20 20 20  *)zDate) ){.    
0fa0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 67 65 74      goto end_get
0fb0: 44 69 67 69 74 73 3b 0a 20 20 20 20 20 20 7d 0a  Digits;.      }.
0fc0: 20 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c 2a        val = val*
0fd0: 31 30 20 2b 20 2a 7a 44 61 74 65 20 2d 20 27 30  10 + *zDate - '0
0fe0: 27 3b 0a 20 20 20 20 20 20 7a 44 61 74 65 2b 2b  ';.      zDate++
0ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1000: 76 61 6c 3c 6d 69 6e 20 7c 7c 20 76 61 6c 3e 6d  val<min || val>m
1010: 61 78 20 7c 7c 20 28 6e 65 78 74 43 21 3d 30 20  ax || (nextC!=0 
1020: 26 26 20 6e 65 78 74 43 21 3d 2a 7a 44 61 74 65  && nextC!=*zDate
1030: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1040: 65 6e 64 5f 67 65 74 44 69 67 69 74 73 3b 0a 20  end_getDigits;. 
1050: 20 20 20 7d 0a 20 20 20 20 2a 70 56 61 6c 20 3d     }.    *pVal =
1060: 20 76 61 6c 3b 0a 20 20 20 20 7a 44 61 74 65 2b   val;.    zDate+
1070: 2b 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  +;.    cnt++;.  
1080: 7d 77 68 69 6c 65 28 20 6e 65 78 74 43 20 29 3b  }while( nextC );
1090: 0a 65 6e 64 5f 67 65 74 44 69 67 69 74 73 3a 0a  .end_getDigits:.
10a0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
10b0: 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 2f  return cnt;.}../
10c0: 2a 0a 2a 2a 20 52 65 61 64 20 74 65 78 74 20 66  *.** Read text f
10d0: 72 6f 6d 20 7a 5b 5d 20 61 6e 64 20 63 6f 6e 76  rom z[] and conv
10e0: 65 72 74 20 69 6e 74 6f 20 61 20 66 6c 6f 61 74  ert into a float
10f0: 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing point number
1100: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
1110: 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 67 69 74   number of digit
1120: 73 20 63 6f 6e 76 65 72 74 65 64 2e 0a 2a 2f 0a  s converted..*/.
1130: 23 64 65 66 69 6e 65 20 67 65 74 56 61 6c 75 65  #define getValue
1140: 20 73 71 6c 69 74 65 33 41 74 6f 46 0a 0a 2f 2a   sqlite3AtoF../*
1150: 0a 2a 2a 20 50 61 72 73 65 20 61 20 74 69 6d 65  .** Parse a time
1160: 7a 6f 6e 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f  zone extension o
1170: 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 64  n the end of a d
1180: 61 74 65 2d 74 69 6d 65 2e 0a 2a 2a 20 54 68 65  ate-time..** The
1190: 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 6f 66   extension is of
11a0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
11b0: 20 20 20 20 20 20 20 20 28 2b 2f 2d 29 48 48 3a          (+/-)HH:
11c0: 4d 4d 0a 2a 2a 0a 2a 2a 20 4f 72 20 74 68 65 20  MM.**.** Or the 
11d0: 22 7a 75 6c 75 22 20 6e 6f 74 61 74 69 6f 6e 3a  "zulu" notation:
11e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 5a 0a  .**.**        Z.
11f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72  **.** If the par
1200: 73 65 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  se is successful
1210: 2c 20 77 72 69 74 65 20 74 68 65 20 6e 75 6d 62  , write the numb
1220: 65 72 20 6f 66 20 6d 69 6e 75 74 65 73 0a 2a 2a  er of minutes.**
1230: 20 6f 66 20 63 68 61 6e 67 65 20 69 6e 20 70 2d   of change in p-
1240: 3e 74 7a 20 61 6e 64 20 72 65 74 75 72 6e 20 30  >tz and return 0
1250: 2e 20 20 49 66 20 61 20 70 61 72 73 65 72 20 65  .  If a parser e
1260: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
1270: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
1280: 0a 2a 2a 0a 2a 2a 20 41 20 6d 69 73 73 69 6e 67  .**.** A missing
1290: 20 73 70 65 63 69 66 69 65 72 20 69 73 20 6e 6f   specifier is no
12a0: 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20  t considered an 
12b0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
12c0: 20 69 6e 74 20 70 61 72 73 65 54 69 6d 65 7a 6f   int parseTimezo
12d0: 6e 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ne(const char *z
12e0: 44 61 74 65 2c 20 44 61 74 65 54 69 6d 65 20 2a  Date, DateTime *
12f0: 70 29 7b 0a 20 20 69 6e 74 20 73 67 6e 20 3d 20  p){.  int sgn = 
1300: 30 3b 0a 20 20 69 6e 74 20 6e 48 72 2c 20 6e 4d  0;.  int nHr, nM
1310: 6e 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 77 68  n;.  int c;.  wh
1320: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75  ile( isspace(*(u
1330: 38 2a 29 7a 44 61 74 65 29 20 29 7b 20 7a 44 61  8*)zDate) ){ zDa
1340: 74 65 2b 2b 3b 20 7d 0a 20 20 70 2d 3e 74 7a 20  te++; }.  p->tz 
1350: 3d 20 30 3b 0a 20 20 63 20 3d 20 2a 7a 44 61 74  = 0;.  c = *zDat
1360: 65 3b 0a 20 20 69 66 28 20 63 3d 3d 27 2d 27 20  e;.  if( c=='-' 
1370: 29 7b 0a 20 20 20 20 73 67 6e 20 3d 20 2d 31 3b  ){.    sgn = -1;
1380: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
1390: 27 2b 27 20 29 7b 0a 20 20 20 20 73 67 6e 20 3d  '+' ){.    sgn =
13a0: 20 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   +1;.  }else if(
13b0: 20 63 3d 3d 27 5a 27 20 7c 7c 20 63 3d 3d 27 7a   c=='Z' || c=='z
13c0: 27 20 29 7b 0a 20 20 20 20 7a 44 61 74 65 2b 2b  ' ){.    zDate++
13d0: 3b 0a 20 20 20 20 67 6f 74 6f 20 7a 75 6c 75 5f  ;.    goto zulu_
13e0: 74 69 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  time;.  }else{. 
13f0: 20 20 20 72 65 74 75 72 6e 20 63 21 3d 30 3b 0a     return c!=0;.
1400: 20 20 7d 0a 20 20 7a 44 61 74 65 2b 2b 3b 0a 20    }.  zDate++;. 
1410: 20 69 66 28 20 67 65 74 44 69 67 69 74 73 28 7a   if( getDigits(z
1420: 44 61 74 65 2c 20 32 2c 20 30 2c 20 31 34 2c 20  Date, 2, 0, 14, 
1430: 27 3a 27 2c 20 26 6e 48 72 2c 20 32 2c 20 30 2c  ':', &nHr, 2, 0,
1440: 20 35 39 2c 20 30 2c 20 26 6e 4d 6e 29 21 3d 32   59, 0, &nMn)!=2
1450: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1460: 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 65 20 2b 3d  ;.  }.  zDate +=
1470: 20 35 3b 0a 20 20 70 2d 3e 74 7a 20 3d 20 73 67   5;.  p->tz = sg
1480: 6e 2a 28 6e 4d 6e 20 2b 20 6e 48 72 2a 36 30 29  n*(nMn + nHr*60)
1490: 3b 0a 7a 75 6c 75 5f 74 69 6d 65 3a 0a 20 20 77  ;.zulu_time:.  w
14a0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
14b0: 75 38 2a 29 7a 44 61 74 65 29 20 29 7b 20 7a 44  u8*)zDate) ){ zD
14c0: 61 74 65 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72  ate++; }.  retur
14d0: 6e 20 2a 7a 44 61 74 65 21 3d 30 3b 0a 7d 0a 0a  n *zDate!=0;.}..
14e0: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74 69 6d 65  /*.** Parse time
14f0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 48 48  s of the form HH
1500: 3a 4d 4d 20 6f 72 20 48 48 3a 4d 4d 3a 53 53 20  :MM or HH:MM:SS 
1510: 6f 72 20 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 46  or HH:MM:SS.FFFF
1520: 2e 0a 2a 2a 20 54 68 65 20 48 48 2c 20 4d 4d 2c  ..** The HH, MM,
1530: 20 61 6e 64 20 53 53 20 6d 75 73 74 20 65 61 63   and SS must eac
1540: 68 20 62 65 20 65 78 61 63 74 6c 79 20 32 20 64  h be exactly 2 d
1550: 69 67 69 74 73 2e 20 20 54 68 65 0a 2a 2a 20 66  igits.  The.** f
1560: 72 61 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64  ractional second
1570: 73 20 46 46 46 46 20 63 61 6e 20 62 65 20 6f 6e  s FFFF can be on
1580: 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73  e or more digits
1590: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
15a0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 70   if there is a p
15b0: 61 72 73 69 6e 67 20 65 72 72 6f 72 20 61 6e 64  arsing error and
15c0: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a   0 on success..*
15d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72  /.static int par
15e0: 73 65 48 68 4d 6d 53 73 28 63 6f 6e 73 74 20 63  seHhMmSs(const c
15f0: 68 61 72 20 2a 7a 44 61 74 65 2c 20 44 61 74 65  har *zDate, Date
1600: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Time *p){.  int 
1610: 68 2c 20 6d 2c 20 73 3b 0a 20 20 64 6f 75 62 6c  h, m, s;.  doubl
1620: 65 20 6d 73 20 3d 20 30 2e 30 3b 0a 20 20 69 66  e ms = 0.0;.  if
1630: 28 20 67 65 74 44 69 67 69 74 73 28 7a 44 61 74  ( getDigits(zDat
1640: 65 2c 20 32 2c 20 30 2c 20 32 34 2c 20 27 3a 27  e, 2, 0, 24, ':'
1650: 2c 20 26 68 2c 20 32 2c 20 30 2c 20 35 39 2c 20  , &h, 2, 0, 59, 
1660: 30 2c 20 26 6d 29 21 3d 32 20 29 7b 0a 20 20 20  0, &m)!=2 ){.   
1670: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1680: 20 7a 44 61 74 65 20 2b 3d 20 35 3b 0a 20 20 69   zDate += 5;.  i
1690: 66 28 20 2a 7a 44 61 74 65 3d 3d 27 3a 27 20 29  f( *zDate==':' )
16a0: 7b 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20  {.    zDate++;. 
16b0: 20 20 20 69 66 28 20 67 65 74 44 69 67 69 74 73     if( getDigits
16c0: 28 7a 44 61 74 65 2c 20 32 2c 20 30 2c 20 35 39  (zDate, 2, 0, 59
16d0: 2c 20 30 2c 20 26 73 29 21 3d 31 20 29 7b 0a 20  , 0, &s)!=1 ){. 
16e0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
16f0: 20 20 20 7d 0a 20 20 20 20 7a 44 61 74 65 20 2b     }.    zDate +
1700: 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 2a 7a 44  = 2;.    if( *zD
1710: 61 74 65 3d 3d 27 2e 27 20 26 26 20 69 73 64 69  ate=='.' && isdi
1720: 67 69 74 28 28 75 38 29 7a 44 61 74 65 5b 31 5d  git((u8)zDate[1]
1730: 29 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c  ) ){.      doubl
1740: 65 20 72 53 63 61 6c 65 20 3d 20 31 2e 30 3b 0a  e rScale = 1.0;.
1750: 20 20 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20        zDate++;. 
1760: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69       while( isdi
1770: 67 69 74 28 2a 28 75 38 2a 29 7a 44 61 74 65 29  git(*(u8*)zDate)
1780: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 73 20 3d   ){.        ms =
1790: 20 6d 73 2a 31 30 2e 30 20 2b 20 2a 7a 44 61 74   ms*10.0 + *zDat
17a0: 65 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  e - '0';.       
17b0: 20 72 53 63 61 6c 65 20 2a 3d 20 31 30 2e 30 3b   rScale *= 10.0;
17c0: 0a 20 20 20 20 20 20 20 20 7a 44 61 74 65 2b 2b  .        zDate++
17d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17e0: 6d 73 20 2f 3d 20 72 53 63 61 6c 65 3b 0a 20 20  ms /= rScale;.  
17f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1800: 20 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d   s = 0;.  }.  p-
1810: 3e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20  >validJD = 0;.  
1820: 70 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b  p->validHMS = 1;
1830: 0a 20 20 70 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  .  p->h = h;.  p
1840: 2d 3e 6d 20 3d 20 6d 3b 0a 20 20 70 2d 3e 73 20  ->m = m;.  p->s 
1850: 3d 20 73 20 2b 20 6d 73 3b 0a 20 20 69 66 28 20  = s + ms;.  if( 
1860: 70 61 72 73 65 54 69 6d 65 7a 6f 6e 65 28 7a 44  parseTimezone(zD
1870: 61 74 65 2c 20 70 29 20 29 20 72 65 74 75 72 6e  ate, p) ) return
1880: 20 31 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 54 5a   1;.  p->validTZ
1890: 20 3d 20 28 70 2d 3e 74 7a 21 3d 30 29 3f 31 3a   = (p->tz!=0)?1:
18a0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  0;.  return 0;.}
18b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
18c0: 66 72 6f 6d 20 59 59 59 59 2d 4d 4d 2d 44 44 20  from YYYY-MM-DD 
18d0: 48 48 3a 4d 4d 3a 53 53 20 74 6f 20 6a 75 6c 69  HH:MM:SS to juli
18e0: 61 6e 20 64 61 79 2e 20 20 57 65 20 61 6c 77 61  an day.  We alwa
18f0: 79 73 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61  ys assume.** tha
1900: 74 20 74 68 65 20 59 59 59 59 2d 4d 4d 2d 44 44  t the YYYY-MM-DD
1910: 20 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f   is according to
1920: 20 74 68 65 20 47 72 65 67 6f 72 69 61 6e 20 63   the Gregorian c
1930: 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 52  alendar..**.** R
1940: 65 66 65 72 65 6e 63 65 3a 20 20 4d 65 65 75 73  eference:  Meeus
1950: 20 70 61 67 65 20 36 31 0a 2a 2f 0a 73 74 61 74   page 61.*/.stat
1960: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4a  ic void computeJ
1970: 44 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a  D(DateTime *p){.
1980: 20 20 69 6e 74 20 59 2c 20 4d 2c 20 44 2c 20 41    int Y, M, D, A
1990: 2c 20 42 2c 20 58 31 2c 20 58 32 3b 0a 0a 20 20  , B, X1, X2;..  
19a0: 69 66 28 20 70 2d 3e 76 61 6c 69 64 4a 44 20 29  if( p->validJD )
19b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
19c0: 2d 3e 76 61 6c 69 64 59 4d 44 20 29 7b 0a 20 20  ->validYMD ){.  
19d0: 20 20 59 20 3d 20 70 2d 3e 59 3b 0a 20 20 20 20    Y = p->Y;.    
19e0: 4d 20 3d 20 70 2d 3e 4d 3b 0a 20 20 20 20 44 20  M = p->M;.    D 
19f0: 3d 20 70 2d 3e 44 3b 0a 20 20 7d 65 6c 73 65 7b  = p->D;.  }else{
1a00: 0a 20 20 20 20 59 20 3d 20 32 30 30 30 3b 20 20  .    Y = 2000;  
1a10: 2f 2a 20 49 66 20 6e 6f 20 59 4d 44 20 73 70 65  /* If no YMD spe
1a20: 63 69 66 69 65 64 2c 20 61 73 73 75 6d 65 20 32  cified, assume 2
1a30: 30 30 30 2d 4a 61 6e 2d 30 31 20 2a 2f 0a 20 20  000-Jan-01 */.  
1a40: 20 20 4d 20 3d 20 31 3b 0a 20 20 20 20 44 20 3d    M = 1;.    D =
1a50: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 3c   1;.  }.  if( M<
1a60: 3d 32 20 29 7b 0a 20 20 20 20 59 2d 2d 3b 0a 20  =2 ){.    Y--;. 
1a70: 20 20 20 4d 20 2b 3d 20 31 32 3b 0a 20 20 7d 0a     M += 12;.  }.
1a80: 20 20 41 20 3d 20 59 2f 31 30 30 3b 0a 20 20 42    A = Y/100;.  B
1a90: 20 3d 20 32 20 2d 20 41 20 2b 20 28 41 2f 34 29   = 2 - A + (A/4)
1aa0: 3b 0a 20 20 58 31 20 3d 20 33 36 35 32 35 2a 28  ;.  X1 = 36525*(
1ab0: 59 2b 34 37 31 36 29 2f 31 30 30 3b 0a 20 20 58  Y+4716)/100;.  X
1ac0: 32 20 3d 20 33 30 36 30 30 31 2a 28 4d 2b 31 29  2 = 306001*(M+1)
1ad0: 2f 31 30 30 30 30 3b 0a 20 20 70 2d 3e 69 4a 44  /10000;.  p->iJD
1ae0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
1af0: 34 29 28 28 58 31 20 2b 20 58 32 20 2b 20 44 20  4)((X1 + X2 + D 
1b00: 2b 20 42 20 2d 20 31 35 32 34 2e 35 20 29 20 2a  + B - 1524.5 ) *
1b10: 20 38 36 34 30 30 30 30 30 29 3b 0a 20 20 70 2d   86400000);.  p-
1b20: 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 20 20  >validJD = 1;.  
1b30: 69 66 28 20 70 2d 3e 76 61 6c 69 64 48 4d 53 20  if( p->validHMS 
1b40: 29 7b 0a 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d  ){.    p->iJD +=
1b50: 20 70 2d 3e 68 2a 33 36 30 30 30 30 30 20 2b 20   p->h*3600000 + 
1b60: 70 2d 3e 6d 2a 36 30 30 30 30 20 2b 20 28 73 71  p->m*60000 + (sq
1b70: 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 70 2d 3e  lite3_int64)(p->
1b80: 73 2a 31 30 30 30 29 3b 0a 20 20 20 20 69 66 28  s*1000);.    if(
1b90: 20 70 2d 3e 76 61 6c 69 64 54 5a 20 29 7b 0a 20   p->validTZ ){. 
1ba0: 20 20 20 20 20 70 2d 3e 69 4a 44 20 2d 3d 20 70       p->iJD -= p
1bb0: 2d 3e 74 7a 2a 36 30 30 30 30 3b 0a 20 20 20 20  ->tz*60000;.    
1bc0: 20 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 3d 20    p->validYMD = 
1bd0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76 61 6c 69  0;.      p->vali
1be0: 64 48 4d 53 20 3d 20 30 3b 0a 20 20 20 20 20 20  dHMS = 0;.      
1bf0: 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a  p->validTZ = 0;.
1c00: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1c10: 2a 2a 20 50 61 72 73 65 20 64 61 74 65 73 20 6f  ** Parse dates o
1c20: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
1c30: 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20       YYYY-MM-DD 
1c40: 48 48 3a 4d 4d 3a 53 53 2e 46 46 46 0a 2a 2a 20  HH:MM:SS.FFF.** 
1c50: 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48      YYYY-MM-DD H
1c60: 48 3a 4d 4d 3a 53 53 0a 2a 2a 20 20 20 20 20 59  H:MM:SS.**     Y
1c70: 59 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 0a  YYY-MM-DD HH:MM.
1c80: 2a 2a 20 20 20 20 20 59 59 59 59 2d 4d 4d 2d 44  **     YYYY-MM-D
1c90: 44 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  D.**.** Write th
1ca0: 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 74 68  e result into th
1cb0: 65 20 44 61 74 65 54 69 6d 65 20 73 74 72 75 63  e DateTime struc
1cc0: 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ture and return 
1cd0: 30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  0.** on success 
1ce0: 61 6e 64 20 31 20 69 66 20 74 68 65 20 69 6e 70  and 1 if the inp
1cf0: 75 74 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74  ut string is not
1d00: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
1d10: 2a 20 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  * date..*/.stati
1d20: 63 20 69 6e 74 20 70 61 72 73 65 59 79 79 79 4d  c int parseYyyyM
1d30: 6d 44 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mDd(const char *
1d40: 7a 44 61 74 65 2c 20 44 61 74 65 54 69 6d 65 20  zDate, DateTime 
1d50: 2a 70 29 7b 0a 20 20 69 6e 74 20 59 2c 20 4d 2c  *p){.  int Y, M,
1d60: 20 44 2c 20 6e 65 67 3b 0a 0a 20 20 69 66 28 20   D, neg;..  if( 
1d70: 7a 44 61 74 65 5b 30 5d 3d 3d 27 2d 27 20 29 7b  zDate[0]=='-' ){
1d80: 0a 20 20 20 20 7a 44 61 74 65 2b 2b 3b 0a 20 20  .    zDate++;.  
1d90: 20 20 6e 65 67 20 3d 20 31 3b 0a 20 20 7d 65 6c    neg = 1;.  }el
1da0: 73 65 7b 0a 20 20 20 20 6e 65 67 20 3d 20 30 3b  se{.    neg = 0;
1db0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 69  .  }.  if( getDi
1dc0: 67 69 74 73 28 7a 44 61 74 65 2c 34 2c 30 2c 39  gits(zDate,4,0,9
1dd0: 39 39 39 2c 27 2d 27 2c 26 59 2c 32 2c 31 2c 31  999,'-',&Y,2,1,1
1de0: 32 2c 27 2d 27 2c 26 4d 2c 32 2c 31 2c 33 31 2c  2,'-',&M,2,1,31,
1df0: 30 2c 26 44 29 21 3d 33 20 29 7b 0a 20 20 20 20  0,&D)!=3 ){.    
1e00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1e10: 7a 44 61 74 65 20 2b 3d 20 31 30 3b 0a 20 20 77  zDate += 10;.  w
1e20: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
1e30: 75 38 2a 29 7a 44 61 74 65 29 20 7c 7c 20 27 54  u8*)zDate) || 'T
1e40: 27 3d 3d 2a 28 75 38 2a 29 7a 44 61 74 65 20 29  '==*(u8*)zDate )
1e50: 7b 20 7a 44 61 74 65 2b 2b 3b 20 7d 0a 20 20 69  { zDate++; }.  i
1e60: 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73 28 7a  f( parseHhMmSs(z
1e70: 44 61 74 65 2c 20 70 29 3d 3d 30 20 29 7b 0a 20  Date, p)==0 ){. 
1e80: 20 20 20 2f 2a 20 57 65 20 67 6f 74 20 74 68 65     /* We got the
1e90: 20 74 69 6d 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   time */.  }else
1ea0: 20 69 66 28 20 2a 7a 44 61 74 65 3d 3d 30 20 29   if( *zDate==0 )
1eb0: 7b 0a 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d  {.    p->validHM
1ec0: 53 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  S = 0;.  }else{.
1ed0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1ee0: 7d 0a 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d  }.  p->validJD =
1ef0: 20 30 3b 0a 20 20 70 2d 3e 76 61 6c 69 64 59 4d   0;.  p->validYM
1f00: 44 20 3d 20 31 3b 0a 20 20 70 2d 3e 59 20 3d 20  D = 1;.  p->Y = 
1f10: 6e 65 67 20 3f 20 2d 59 20 3a 20 59 3b 0a 20 20  neg ? -Y : Y;.  
1f20: 70 2d 3e 4d 20 3d 20 4d 3b 0a 20 20 70 2d 3e 44  p->M = M;.  p->D
1f30: 20 3d 20 44 3b 0a 20 20 69 66 28 20 70 2d 3e 76   = D;.  if( p->v
1f40: 61 6c 69 64 54 5a 20 29 7b 0a 20 20 20 20 63 6f  alidTZ ){.    co
1f50: 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 7d 0a  mputeJD(p);.  }.
1f60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1f70: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 74 69 6d  *.** Set the tim
1f80: 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  e to the current
1f90: 20 74 69 6d 65 20 72 65 70 6f 72 74 65 64 20 62   time reported b
1fa0: 79 20 74 68 65 20 56 46 53 0a 2a 2f 0a 73 74 61  y the VFS.*/.sta
1fb0: 74 69 63 20 76 6f 69 64 20 73 65 74 44 61 74 65  tic void setDate
1fc0: 54 69 6d 65 54 6f 43 75 72 72 65 6e 74 28 73 71  TimeToCurrent(sq
1fd0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1fe0: 6f 6e 74 65 78 74 2c 20 44 61 74 65 54 69 6d 65  ontext, DateTime
1ff0: 20 2a 70 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72   *p){.  double r
2000: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2010: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
2020: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
2030: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  ext);.  sqlite3O
2040: 73 43 75 72 72 65 6e 74 54 69 6d 65 28 64 62 2d  sCurrentTime(db-
2050: 3e 70 56 66 73 2c 20 26 72 29 3b 0a 20 20 70 2d  >pVfs, &r);.  p-
2060: 3e 69 4a 44 20 3d 20 28 73 71 6c 69 74 65 33 5f  >iJD = (sqlite3_
2070: 69 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30 30  int64)(r*8640000
2080: 30 2e 30 20 2b 20 30 2e 35 29 3b 0a 20 20 70 2d  0.0 + 0.5);.  p-
2090: 3e 76 61 6c 69 64 4a 44 20 3d 20 31 3b 0a 7d 0a  >validJD = 1;.}.
20a0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
20b0: 6f 20 70 61 72 73 65 20 74 68 65 20 67 69 76 65  o parse the give
20c0: 6e 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 61 20  n string into a 
20d0: 4a 75 6c 69 61 6e 20 44 61 79 20 4e 75 6d 62 65  Julian Day Numbe
20e0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  r.  Return.** th
20f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
2100: 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  rs..**.** The fo
2110: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 61 63 63 65  llowing are acce
2120: 70 74 61 62 6c 65 20 66 6f 72 6d 73 20 66 6f 72  ptable forms for
2130: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
2140: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 59  g:.**.**      YY
2150: 59 59 2d 4d 4d 2d 44 44 20 48 48 3a 4d 4d 3a 53  YY-MM-DD HH:MM:S
2160: 53 2e 46 46 46 20 20 2b 2f 2d 48 48 3a 4d 4d 0a  S.FFF  +/-HH:MM.
2170: 2a 2a 20 20 20 20 20 20 44 44 44 44 2e 44 44 20  **      DDDD.DD 
2180: 0a 2a 2a 20 20 20 20 20 20 6e 6f 77 0a 2a 2a 0a  .**      now.**.
2190: 2a 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74 20  ** In the first 
21a0: 66 6f 72 6d 2c 20 74 68 65 20 2b 2f 2d 48 48 3a  form, the +/-HH:
21b0: 4d 4d 20 69 73 20 61 6c 77 61 79 73 20 6f 70 74  MM is always opt
21c0: 69 6f 6e 61 6c 2e 20 20 54 68 65 20 66 72 61 63  ional.  The frac
21d0: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 65 63 6f 6e 64  tional.** second
21e0: 73 20 65 78 74 65 6e 73 69 6f 6e 20 28 74 68 65  s extension (the
21f0: 20 22 2e 46 46 46 22 29 20 69 73 20 6f 70 74 69   ".FFF") is opti
2200: 6f 6e 61 6c 2e 20 20 54 68 65 20 73 65 63 6f 6e  onal.  The secon
2210: 64 73 20 70 6f 72 74 69 6f 6e 0a 2a 2a 20 28 22  ds portion.** ("
2220: 3a 53 53 2e 46 46 46 22 29 20 69 73 20 6f 70 74  :SS.FFF") is opt
2230: 69 6f 6e 2e 20 20 54 68 65 20 79 65 61 72 20 61  ion.  The year a
2240: 6e 64 20 64 61 74 65 20 63 61 6e 20 62 65 20 6f  nd date can be o
2250: 6d 69 74 74 65 64 20 61 73 20 6c 6f 6e 67 0a 2a  mitted as long.*
2260: 2a 20 61 73 20 74 68 65 72 65 20 69 73 20 61 20  * as there is a 
2270: 74 69 6d 65 20 73 74 72 69 6e 67 2e 20 20 54 68  time string.  Th
2280: 65 20 74 69 6d 65 20 73 74 72 69 6e 67 20 63 61  e time string ca
2290: 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 61 73 20  n be omitted as 
22a0: 6c 6f 6e 67 0a 2a 2a 20 61 73 20 74 68 65 72 65  long.** as there
22b0: 20 69 73 20 61 20 79 65 61 72 20 61 6e 64 20 64   is a year and d
22c0: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
22d0: 6e 74 20 70 61 72 73 65 44 61 74 65 4f 72 54 69  nt parseDateOrTi
22e0: 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  me(.  sqlite3_co
22f0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
2300: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2310: 44 61 74 65 2c 20 0a 20 20 44 61 74 65 54 69 6d  Date, .  DateTim
2320: 65 20 2a 70 0a 29 7b 0a 20 20 69 66 28 20 70 61  e *p.){.  if( pa
2330: 72 73 65 59 79 79 79 4d 6d 44 64 28 7a 44 61 74  rseYyyyMmDd(zDat
2340: 65 2c 70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  e,p)==0 ){.    r
2350: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
2360: 20 69 66 28 20 70 61 72 73 65 48 68 4d 6d 53 73   if( parseHhMmSs
2370: 28 7a 44 61 74 65 2c 20 70 29 3d 3d 30 20 29 7b  (zDate, p)==0 ){
2380: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2390: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
23a0: 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 65 2c  e3StrICmp(zDate,
23b0: 22 6e 6f 77 22 29 3d 3d 30 29 7b 0a 20 20 20 20  "now")==0){.    
23c0: 73 65 74 44 61 74 65 54 69 6d 65 54 6f 43 75 72  setDateTimeToCur
23d0: 72 65 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 29  rent(context, p)
23e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
23f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
2400: 74 65 33 49 73 4e 75 6d 62 65 72 28 7a 44 61 74  te3IsNumber(zDat
2410: 65 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  e, 0, SQLITE_UTF
2420: 38 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  8) ){.    double
2430: 20 72 3b 0a 20 20 20 20 67 65 74 56 61 6c 75 65   r;.    getValue
2440: 28 7a 44 61 74 65 2c 20 26 72 29 3b 0a 20 20 20  (zDate, &r);.   
2450: 20 70 2d 3e 69 4a 44 20 3d 20 28 73 71 6c 69 74   p->iJD = (sqlit
2460: 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36 34 30  e3_int64)(r*8640
2470: 30 30 30 30 2e 30 20 2b 20 30 2e 35 29 3b 0a 20  0000.0 + 0.5);. 
2480: 20 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20     p->validJD = 
2490: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
24a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
24b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
24c0: 65 20 74 68 65 20 59 65 61 72 2c 20 4d 6f 6e 74  e the Year, Mont
24d0: 68 2c 20 61 6e 64 20 44 61 79 20 66 72 6f 6d 20  h, and Day from 
24e0: 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e  the julian day n
24f0: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
2500: 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 59 4d 44   void computeYMD
2510: 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20  (DateTime *p){. 
2520: 20 69 6e 74 20 5a 2c 20 41 2c 20 42 2c 20 43 2c   int Z, A, B, C,
2530: 20 44 2c 20 45 2c 20 58 31 3b 0a 20 20 69 66 28   D, E, X1;.  if(
2540: 20 70 2d 3e 76 61 6c 69 64 59 4d 44 20 29 20 72   p->validYMD ) r
2550: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 2d  eturn;.  if( !p-
2560: 3e 76 61 6c 69 64 4a 44 20 29 7b 0a 20 20 20 20  >validJD ){.    
2570: 70 2d 3e 59 20 3d 20 32 30 30 30 3b 0a 20 20 20  p->Y = 2000;.   
2580: 20 70 2d 3e 4d 20 3d 20 31 3b 0a 20 20 20 20 70   p->M = 1;.    p
2590: 2d 3e 44 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ->D = 1;.  }else
25a0: 7b 0a 20 20 20 20 5a 20 3d 20 28 69 6e 74 29 28  {.    Z = (int)(
25b0: 28 70 2d 3e 69 4a 44 20 2b 20 34 33 32 30 30 30  (p->iJD + 432000
25c0: 30 30 29 2f 38 36 34 30 30 30 30 30 29 3b 0a 20  00)/86400000);. 
25d0: 20 20 20 41 20 3d 20 28 69 6e 74 29 28 28 5a 20     A = (int)((Z 
25e0: 2d 20 31 38 36 37 32 31 36 2e 32 35 29 2f 33 36  - 1867216.25)/36
25f0: 35 32 34 2e 32 35 29 3b 0a 20 20 20 20 41 20 3d  524.25);.    A =
2600: 20 5a 20 2b 20 31 20 2b 20 41 20 2d 20 28 41 2f   Z + 1 + A - (A/
2610: 34 29 3b 0a 20 20 20 20 42 20 3d 20 41 20 2b 20  4);.    B = A + 
2620: 31 35 32 34 3b 0a 20 20 20 20 43 20 3d 20 28 69  1524;.    C = (i
2630: 6e 74 29 28 28 42 20 2d 20 31 32 32 2e 31 29 2f  nt)((B - 122.1)/
2640: 33 36 35 2e 32 35 29 3b 0a 20 20 20 20 44 20 3d  365.25);.    D =
2650: 20 28 33 36 35 32 35 2a 43 29 2f 31 30 30 3b 0a   (36525*C)/100;.
2660: 20 20 20 20 45 20 3d 20 28 69 6e 74 29 28 28 42      E = (int)((B
2670: 2d 44 29 2f 33 30 2e 36 30 30 31 29 3b 0a 20 20  -D)/30.6001);.  
2680: 20 20 58 31 20 3d 20 28 69 6e 74 29 28 33 30 2e    X1 = (int)(30.
2690: 36 30 30 31 2a 45 29 3b 0a 20 20 20 20 70 2d 3e  6001*E);.    p->
26a0: 44 20 3d 20 42 20 2d 20 44 20 2d 20 58 31 3b 0a  D = B - D - X1;.
26b0: 20 20 20 20 70 2d 3e 4d 20 3d 20 45 3c 31 34 20      p->M = E<14 
26c0: 3f 20 45 2d 31 20 3a 20 45 2d 31 33 3b 0a 20 20  ? E-1 : E-13;.  
26d0: 20 20 70 2d 3e 59 20 3d 20 70 2d 3e 4d 3e 32 20    p->Y = p->M>2 
26e0: 3f 20 43 20 2d 20 34 37 31 36 20 3a 20 43 20 2d  ? C - 4716 : C -
26f0: 20 34 37 31 35 3b 0a 20 20 7d 0a 20 20 70 2d 3e   4715;.  }.  p->
2700: 76 61 6c 69 64 59 4d 44 20 3d 20 31 3b 0a 7d 0a  validYMD = 1;.}.
2710: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
2720: 68 65 20 48 6f 75 72 2c 20 4d 69 6e 75 74 65 2c  he Hour, Minute,
2730: 20 61 6e 64 20 53 65 63 6f 6e 64 73 20 66 72 6f   and Seconds fro
2740: 6d 20 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79  m the julian day
2750: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
2760: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 48  ic void computeH
2770: 4d 53 28 44 61 74 65 54 69 6d 65 20 2a 70 29 7b  MS(DateTime *p){
2780: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 66 28 20  .  int s;.  if( 
2790: 70 2d 3e 76 61 6c 69 64 48 4d 53 20 29 20 72 65  p->validHMS ) re
27a0: 74 75 72 6e 3b 0a 20 20 63 6f 6d 70 75 74 65 4a  turn;.  computeJ
27b0: 44 28 70 29 3b 0a 20 20 73 20 3d 20 28 69 6e 74  D(p);.  s = (int
27c0: 29 28 28 70 2d 3e 69 4a 44 20 2b 20 34 33 32 30  )((p->iJD + 4320
27d0: 30 30 30 30 29 20 25 20 38 36 34 30 30 30 30 30  0000) % 86400000
27e0: 29 3b 0a 20 20 70 2d 3e 73 20 3d 20 73 2f 31 30  );.  p->s = s/10
27f0: 30 30 2e 30 3b 0a 20 20 73 20 3d 20 28 69 6e 74  00.0;.  s = (int
2800: 29 70 2d 3e 73 3b 0a 20 20 70 2d 3e 73 20 2d 3d  )p->s;.  p->s -=
2810: 20 73 3b 0a 20 20 70 2d 3e 68 20 3d 20 73 2f 33   s;.  p->h = s/3
2820: 36 30 30 3b 0a 20 20 73 20 2d 3d 20 70 2d 3e 68  600;.  s -= p->h
2830: 2a 33 36 30 30 3b 0a 20 20 70 2d 3e 6d 20 3d 20  *3600;.  p->m = 
2840: 73 2f 36 30 3b 0a 20 20 70 2d 3e 73 20 2b 3d 20  s/60;.  p->s += 
2850: 73 20 2d 20 70 2d 3e 6d 2a 36 30 3b 0a 20 20 70  s - p->m*60;.  p
2860: 2d 3e 76 61 6c 69 64 48 4d 53 20 3d 20 31 3b 0a  ->validHMS = 1;.
2870: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
2880: 20 62 6f 74 68 20 59 4d 44 20 61 6e 64 20 48 4d   both YMD and HM
2890: 53 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  S.*/.static void
28a0: 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28   computeYMD_HMS(
28b0: 44 61 74 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20  DateTime *p){.  
28c0: 63 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a 20  computeYMD(p);. 
28d0: 20 63 6f 6d 70 75 74 65 48 4d 53 28 70 29 3b 0a   computeHMS(p);.
28e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
28f0: 68 65 20 59 4d 44 20 61 6e 64 20 48 4d 53 20 61  he YMD and HMS a
2900: 6e 64 20 74 68 65 20 54 5a 0a 2a 2f 0a 73 74 61  nd the TZ.*/.sta
2910: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 59 4d  tic void clearYM
2920: 44 5f 48 4d 53 5f 54 5a 28 44 61 74 65 54 69 6d  D_HMS_TZ(DateTim
2930: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 76 61 6c 69  e *p){.  p->vali
2940: 64 59 4d 44 20 3d 20 30 3b 0a 20 20 70 2d 3e 76  dYMD = 0;.  p->v
2950: 61 6c 69 64 48 4d 53 20 3d 20 30 3b 0a 20 20 70  alidHMS = 0;.  p
2960: 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 7d  ->validTZ = 0;.}
2970: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2980: 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 0a  _OMIT_LOCALTIME.
2990: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
29a0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 28 69 6e  e difference (in
29b0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 0a 2a   milliseconds).*
29c0: 2a 20 62 65 74 77 65 65 6e 20 6c 6f 63 61 6c 74  * between localt
29d0: 69 6d 65 20 61 6e 64 20 55 54 43 20 28 61 2e 6b  ime and UTC (a.k
29e0: 2e 61 2e 20 47 4d 54 29 0a 2a 2a 20 66 6f 72 20  .a. GMT).** for 
29f0: 74 68 65 20 74 69 6d 65 20 76 61 6c 75 65 20 70  the time value p
2a00: 20 77 68 65 72 65 20 70 20 69 73 20 69 6e 20 55   where p is in U
2a10: 54 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  TC..*/.static sq
2a20: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6c 6f 63 61  lite3_int64 loca
2a30: 6c 74 69 6d 65 4f 66 66 73 65 74 28 44 61 74 65  ltimeOffset(Date
2a40: 54 69 6d 65 20 2a 70 29 7b 0a 20 20 44 61 74 65  Time *p){.  Date
2a50: 54 69 6d 65 20 78 2c 20 79 3b 0a 20 20 74 69 6d  Time x, y;.  tim
2a60: 65 5f 74 20 74 3b 0a 20 20 78 20 3d 20 2a 70 3b  e_t t;.  x = *p;
2a70: 0a 20 20 63 6f 6d 70 75 74 65 59 4d 44 5f 48 4d  .  computeYMD_HM
2a80: 53 28 26 78 29 3b 0a 20 20 69 66 28 20 78 2e 59  S(&x);.  if( x.Y
2a90: 3c 31 39 37 31 20 7c 7c 20 78 2e 59 3e 3d 32 30  <1971 || x.Y>=20
2aa0: 33 38 20 29 7b 0a 20 20 20 20 78 2e 59 20 3d 20  38 ){.    x.Y = 
2ab0: 32 30 30 30 3b 0a 20 20 20 20 78 2e 4d 20 3d 20  2000;.    x.M = 
2ac0: 31 3b 0a 20 20 20 20 78 2e 44 20 3d 20 31 3b 0a  1;.    x.D = 1;.
2ad0: 20 20 20 20 78 2e 68 20 3d 20 30 3b 0a 20 20 20      x.h = 0;.   
2ae0: 20 78 2e 6d 20 3d 20 30 3b 0a 20 20 20 20 78 2e   x.m = 0;.    x.
2af0: 73 20 3d 20 30 2e 30 3b 0a 20 20 7d 20 65 6c 73  s = 0.0;.  } els
2b00: 65 20 7b 0a 20 20 20 20 69 6e 74 20 73 20 3d 20  e {.    int s = 
2b10: 28 69 6e 74 29 28 78 2e 73 20 2b 20 30 2e 35 29  (int)(x.s + 0.5)
2b20: 3b 0a 20 20 20 20 78 2e 73 20 3d 20 73 3b 0a 20  ;.    x.s = s;. 
2b30: 20 7d 0a 20 20 78 2e 74 7a 20 3d 20 30 3b 0a 20   }.  x.tz = 0;. 
2b40: 20 78 2e 76 61 6c 69 64 4a 44 20 3d 20 30 3b 0a   x.validJD = 0;.
2b50: 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 78 29 3b    computeJD(&x);
2b60: 0a 20 20 74 20 3d 20 78 2e 69 4a 44 2f 31 30 30  .  t = x.iJD/100
2b70: 30 20 2d 20 32 31 30 38 36 36 37 36 30 30 30 30  0 - 210866760000
2b80: 4c 4c 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  LL;.#ifdef HAVE_
2b90: 4c 4f 43 41 4c 54 49 4d 45 5f 52 0a 20 20 7b 0a  LOCALTIME_R.  {.
2ba0: 20 20 20 20 73 74 72 75 63 74 20 74 6d 20 73 4c      struct tm sL
2bb0: 6f 63 61 6c 3b 0a 20 20 20 20 6c 6f 63 61 6c 74  ocal;.    localt
2bc0: 69 6d 65 5f 72 28 26 74 2c 20 26 73 4c 6f 63 61  ime_r(&t, &sLoca
2bd0: 6c 29 3b 0a 20 20 20 20 79 2e 59 20 3d 20 73 4c  l);.    y.Y = sL
2be0: 6f 63 61 6c 2e 74 6d 5f 79 65 61 72 20 2b 20 31  ocal.tm_year + 1
2bf0: 39 30 30 3b 0a 20 20 20 20 79 2e 4d 20 3d 20 73  900;.    y.M = s
2c00: 4c 6f 63 61 6c 2e 74 6d 5f 6d 6f 6e 20 2b 20 31  Local.tm_mon + 1
2c10: 3b 0a 20 20 20 20 79 2e 44 20 3d 20 73 4c 6f 63  ;.    y.D = sLoc
2c20: 61 6c 2e 74 6d 5f 6d 64 61 79 3b 0a 20 20 20 20  al.tm_mday;.    
2c30: 79 2e 68 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f  y.h = sLocal.tm_
2c40: 68 6f 75 72 3b 0a 20 20 20 20 79 2e 6d 20 3d 20  hour;.    y.m = 
2c50: 73 4c 6f 63 61 6c 2e 74 6d 5f 6d 69 6e 3b 0a 20  sLocal.tm_min;. 
2c60: 20 20 20 79 2e 73 20 3d 20 73 4c 6f 63 61 6c 2e     y.s = sLocal.
2c70: 74 6d 5f 73 65 63 3b 0a 20 20 7d 0a 23 65 6c 69  tm_sec;.  }.#eli
2c80: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c  f defined(HAVE_L
2c90: 4f 43 41 4c 54 49 4d 45 5f 53 29 0a 20 20 7b 0a  OCALTIME_S).  {.
2ca0: 20 20 20 20 73 74 72 75 63 74 20 74 6d 20 73 4c      struct tm sL
2cb0: 6f 63 61 6c 3b 0a 20 20 20 20 6c 6f 63 61 6c 74  ocal;.    localt
2cc0: 69 6d 65 5f 73 28 26 73 4c 6f 63 61 6c 2c 20 26  ime_s(&sLocal, &
2cd0: 74 29 3b 0a 20 20 20 20 79 2e 59 20 3d 20 73 4c  t);.    y.Y = sL
2ce0: 6f 63 61 6c 2e 74 6d 5f 79 65 61 72 20 2b 20 31  ocal.tm_year + 1
2cf0: 39 30 30 3b 0a 20 20 20 20 79 2e 4d 20 3d 20 73  900;.    y.M = s
2d00: 4c 6f 63 61 6c 2e 74 6d 5f 6d 6f 6e 20 2b 20 31  Local.tm_mon + 1
2d10: 3b 0a 20 20 20 20 79 2e 44 20 3d 20 73 4c 6f 63  ;.    y.D = sLoc
2d20: 61 6c 2e 74 6d 5f 6d 64 61 79 3b 0a 20 20 20 20  al.tm_mday;.    
2d30: 79 2e 68 20 3d 20 73 4c 6f 63 61 6c 2e 74 6d 5f  y.h = sLocal.tm_
2d40: 68 6f 75 72 3b 0a 20 20 20 20 79 2e 6d 20 3d 20  hour;.    y.m = 
2d50: 73 4c 6f 63 61 6c 2e 74 6d 5f 6d 69 6e 3b 0a 20  sLocal.tm_min;. 
2d60: 20 20 20 79 2e 73 20 3d 20 73 4c 6f 63 61 6c 2e     y.s = sLocal.
2d70: 74 6d 5f 73 65 63 3b 0a 20 20 7d 0a 23 65 6c 73  tm_sec;.  }.#els
2d80: 65 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  e.  {.    struct
2d90: 20 74 6d 20 2a 70 54 6d 3b 0a 20 20 20 20 73 71   tm *pTm;.    sq
2da0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2db0: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
2dc0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
2dd0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
2de0: 3b 0a 20 20 20 20 70 54 6d 20 3d 20 6c 6f 63 61  ;.    pTm = loca
2df0: 6c 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 79  ltime(&t);.    y
2e00: 2e 59 20 3d 20 70 54 6d 2d 3e 74 6d 5f 79 65 61  .Y = pTm->tm_yea
2e10: 72 20 2b 20 31 39 30 30 3b 0a 20 20 20 20 79 2e  r + 1900;.    y.
2e20: 4d 20 3d 20 70 54 6d 2d 3e 74 6d 5f 6d 6f 6e 20  M = pTm->tm_mon 
2e30: 2b 20 31 3b 0a 20 20 20 20 79 2e 44 20 3d 20 70  + 1;.    y.D = p
2e40: 54 6d 2d 3e 74 6d 5f 6d 64 61 79 3b 0a 20 20 20  Tm->tm_mday;.   
2e50: 20 79 2e 68 20 3d 20 70 54 6d 2d 3e 74 6d 5f 68   y.h = pTm->tm_h
2e60: 6f 75 72 3b 0a 20 20 20 20 79 2e 6d 20 3d 20 70  our;.    y.m = p
2e70: 54 6d 2d 3e 74 6d 5f 6d 69 6e 3b 0a 20 20 20 20  Tm->tm_min;.    
2e80: 79 2e 73 20 3d 20 70 54 6d 2d 3e 74 6d 5f 73 65  y.s = pTm->tm_se
2e90: 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  c;.    sqlite3_m
2ea0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
2eb0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
2ec0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
2ed0: 5f 4d 41 53 54 45 52 29 29 3b 0a 20 20 7d 0a 23  _MASTER));.  }.#
2ee0: 65 6e 64 69 66 0a 20 20 79 2e 76 61 6c 69 64 59  endif.  y.validY
2ef0: 4d 44 20 3d 20 31 3b 0a 20 20 79 2e 76 61 6c 69  MD = 1;.  y.vali
2f00: 64 48 4d 53 20 3d 20 31 3b 0a 20 20 79 2e 76 61  dHMS = 1;.  y.va
2f10: 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 79 2e 76  lidJD = 0;.  y.v
2f20: 61 6c 69 64 54 5a 20 3d 20 30 3b 0a 20 20 63 6f  alidTZ = 0;.  co
2f30: 6d 70 75 74 65 4a 44 28 26 79 29 3b 0a 20 20 72  mputeJD(&y);.  r
2f40: 65 74 75 72 6e 20 79 2e 69 4a 44 20 2d 20 78 2e  eturn y.iJD - x.
2f50: 69 4a 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  iJD;.}.#endif /*
2f60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43   SQLITE_OMIT_LOC
2f70: 41 4c 54 49 4d 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ALTIME */../*.**
2f80: 20 50 72 6f 63 65 73 73 20 61 20 6d 6f 64 69 66   Process a modif
2f90: 69 65 72 20 74 6f 20 61 20 64 61 74 65 2d 74 69  ier to a date-ti
2fa0: 6d 65 20 73 74 61 6d 70 2e 20 20 54 68 65 20 6d  me stamp.  The m
2fb0: 6f 64 69 66 69 65 72 73 20 61 72 65 0a 2a 2a 20  odifiers are.** 
2fc0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2fd0: 2a 20 20 20 20 20 4e 4e 4e 20 64 61 79 73 0a 2a  *     NNN days.*
2fe0: 2a 20 20 20 20 20 4e 4e 4e 20 68 6f 75 72 73 0a  *     NNN hours.
2ff0: 2a 2a 20 20 20 20 20 4e 4e 4e 20 6d 69 6e 75 74  **     NNN minut
3000: 65 73 0a 2a 2a 20 20 20 20 20 4e 4e 4e 2e 4e 4e  es.**     NNN.NN
3010: 4e 4e 20 73 65 63 6f 6e 64 73 0a 2a 2a 20 20 20  NN seconds.**   
3020: 20 20 4e 4e 4e 20 6d 6f 6e 74 68 73 0a 2a 2a 20    NNN months.** 
3030: 20 20 20 20 4e 4e 4e 20 79 65 61 72 73 0a 2a 2a      NNN years.**
3040: 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 6d 6f       start of mo
3050: 6e 74 68 0a 2a 2a 20 20 20 20 20 73 74 61 72 74  nth.**     start
3060: 20 6f 66 20 79 65 61 72 0a 2a 2a 20 20 20 20 20   of year.**     
3070: 73 74 61 72 74 20 6f 66 20 77 65 65 6b 0a 2a 2a  start of week.**
3080: 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 64 61       start of da
3090: 79 0a 2a 2a 20 20 20 20 20 77 65 65 6b 64 61 79  y.**     weekday
30a0: 20 4e 0a 2a 2a 20 20 20 20 20 75 6e 69 78 65 70   N.**     unixep
30b0: 6f 63 68 0a 2a 2a 20 20 20 20 20 6c 6f 63 61 6c  och.**     local
30c0: 74 69 6d 65 0a 2a 2a 20 20 20 20 20 75 74 63 0a  time.**     utc.
30d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f  **.** Return 0 o
30e0: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 31 20  n success and 1 
30f0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
3100: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 2e 0a 2a  kind of error..*
3110: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 72  /.static int par
3120: 73 65 4d 6f 64 69 66 69 65 72 28 63 6f 6e 73 74  seModifier(const
3130: 20 63 68 61 72 20 2a 7a 4d 6f 64 2c 20 44 61 74   char *zMod, Dat
3140: 65 54 69 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  eTime *p){.  int
3150: 20 72 63 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e   rc = 1;.  int n
3160: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20  ;.  double r;.  
3170: 63 68 61 72 20 2a 7a 2c 20 7a 42 75 66 5b 33 30  char *z, zBuf[30
3180: 5d 3b 0a 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20  ];.  z = zBuf;. 
3190: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 41 72 72 61   for(n=0; n<Arra
31a0: 79 53 69 7a 65 28 7a 42 75 66 29 2d 31 20 26 26  ySize(zBuf)-1 &&
31b0: 20 7a 4d 6f 64 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a   zMod[n]; n++){.
31c0: 20 20 20 20 7a 5b 6e 5d 20 3d 20 28 63 68 61 72      z[n] = (char
31d0: 29 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  )sqlite3UpperToL
31e0: 6f 77 65 72 5b 28 75 38 29 7a 4d 6f 64 5b 6e 5d  ower[(u8)zMod[n]
31f0: 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6e 5d 20 3d 20  ];.  }.  z[n] = 
3200: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 7a 5b 30  0;.  switch( z[0
3210: 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ] ){.#ifndef SQL
3220: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49  ITE_OMIT_LOCALTI
3230: 4d 45 0a 20 20 20 20 63 61 73 65 20 27 6c 27 3a  ME.    case 'l':
3240: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 6c   {.      /*    l
3250: 6f 63 61 6c 74 69 6d 65 0a 20 20 20 20 20 20 2a  ocaltime.      *
3260: 2a 0a 20 20 20 20 20 20 2a 2a 20 41 73 73 75 6d  *.      ** Assum
3270: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
3280: 74 69 6d 65 20 76 61 6c 75 65 20 69 73 20 55 54  time value is UT
3290: 43 20 28 61 2e 6b 2e 61 2e 20 47 4d 54 29 2c 20  C (a.k.a. GMT), 
32a0: 73 68 69 66 74 20 69 74 20 74 6f 0a 20 20 20 20  shift it to.    
32b0: 20 20 2a 2a 20 73 68 6f 77 20 6c 6f 63 61 6c 20    ** show local 
32c0: 74 69 6d 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  time..      */. 
32d0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
32e0: 7a 2c 20 22 6c 6f 63 61 6c 74 69 6d 65 22 29 3d  z, "localtime")=
32f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
3300: 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20  mputeJD(p);.    
3310: 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 6c 6f      p->iJD += lo
3320: 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 29  caltimeOffset(p)
3330: 3b 0a 20 20 20 20 20 20 20 20 63 6c 65 61 72 59  ;.        clearY
3340: 4d 44 5f 48 4d 53 5f 54 5a 28 70 29 3b 0a 20 20  MD_HMS_TZ(p);.  
3350: 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
3360: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
3370: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3380: 20 20 20 20 63 61 73 65 20 27 75 27 3a 20 7b 0a      case 'u': {.
3390: 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a        /*.      *
33a0: 2a 20 20 20 20 75 6e 69 78 65 70 6f 63 68 0a 20  *    unixepoch. 
33b0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
33c0: 20 54 72 65 61 74 20 74 68 65 20 63 75 72 72 65   Treat the curre
33d0: 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  nt value of p->i
33e0: 4a 44 20 61 73 20 74 68 65 20 6e 75 6d 62 65 72  JD as the number
33f0: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 73 65 63   of.      ** sec
3400: 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
3410: 20 20 43 6f 6e 76 65 72 74 20 74 6f 20 61 20 72    Convert to a r
3420: 65 61 6c 20 6a 75 6c 69 61 6e 20 64 61 79 20 6e  eal julian day n
3430: 75 6d 62 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  umber..      */.
3440: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
3450: 28 7a 2c 20 22 75 6e 69 78 65 70 6f 63 68 22 29  (z, "unixepoch")
3460: 3d 3d 30 20 26 26 20 70 2d 3e 76 61 6c 69 64 4a  ==0 && p->validJ
3470: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  D ){.        p->
3480: 69 4a 44 20 3d 20 70 2d 3e 69 4a 44 2a 31 30 2f  iJD = p->iJD*10/
3490: 38 36 34 30 30 30 20 2b 20 32 31 30 38 36 36 37  864000 + 2108667
34a0: 36 30 30 30 30 30 30 30 4c 4c 3b 0a 20 20 20 20  60000000LL;.    
34b0: 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53      clearYMD_HMS
34c0: 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20  _TZ(p);.        
34d0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  rc = 0;.      }.
34e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
34f0: 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 0a 20 20  MIT_LOCALTIME.  
3500: 20 20 20 20 65 6c 73 65 20 69 66 28 20 73 74 72      else if( str
3510: 63 6d 70 28 7a 2c 20 22 75 74 63 22 29 3d 3d 30  cmp(z, "utc")==0
3520: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3530: 74 65 33 5f 69 6e 74 36 34 20 63 31 3b 0a 20 20  te3_int64 c1;.  
3540: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28        computeJD(
3550: 70 29 3b 0a 20 20 20 20 20 20 20 20 63 31 20 3d  p);.        c1 =
3560: 20 6c 6f 63 61 6c 74 69 6d 65 4f 66 66 73 65 74   localtimeOffset
3570: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
3580: 69 4a 44 20 2d 3d 20 63 31 3b 0a 20 20 20 20 20  iJD -= c1;.     
3590: 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f     clearYMD_HMS_
35a0: 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  TZ(p);.        p
35b0: 2d 3e 69 4a 44 20 2b 3d 20 63 31 20 2d 20 6c 6f  ->iJD += c1 - lo
35c0: 63 61 6c 74 69 6d 65 4f 66 66 73 65 74 28 70 29  caltimeOffset(p)
35d0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30  ;.        rc = 0
35e0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
35f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3600: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27 77 27    }.    case 'w'
3610: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20 20  : {.      /*.   
3620: 20 20 20 2a 2a 20 20 20 20 77 65 65 6b 64 61 79     **    weekday
3630: 20 4e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   N.      **.    
3640: 20 20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 61    ** Move the da
3650: 74 65 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  te to the same t
3660: 69 6d 65 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  ime on the next 
3670: 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 0a 20 20  occurrence of.  
3680: 20 20 20 20 2a 2a 20 77 65 65 6b 64 61 79 20 4e      ** weekday N
3690: 20 77 68 65 72 65 20 30 3d 3d 53 75 6e 64 61 79   where 0==Sunday
36a0: 2c 20 31 3d 3d 4d 6f 6e 64 61 79 2c 20 61 6e 64  , 1==Monday, and
36b0: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
36c0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 65  he.      ** date
36d0: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74   is already on t
36e0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 77  he appropriate w
36f0: 65 65 6b 64 61 79 2c 20 74 68 69 73 20 69 73 20  eekday, this is 
3700: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a  a no-op..      *
3710: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  /.      if( strn
3720: 63 6d 70 28 7a 2c 20 22 77 65 65 6b 64 61 79 20  cmp(z, "weekday 
3730: 22 2c 20 38 29 3d 3d 30 20 26 26 20 67 65 74 56  ", 8)==0 && getV
3740: 61 6c 75 65 28 26 7a 5b 38 5d 2c 26 72 29 3e 30  alue(&z[8],&r)>0
3750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3760: 20 20 26 26 20 28 6e 3d 28 69 6e 74 29 72 29 3d    && (n=(int)r)=
3770: 3d 72 20 26 26 20 6e 3e 3d 30 20 26 26 20 72 3c  =r && n>=0 && r<
3780: 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  7 ){.        sql
3790: 69 74 65 33 5f 69 6e 74 36 34 20 5a 3b 0a 20 20  ite3_int64 Z;.  
37a0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 59 4d 44        computeYMD
37b0: 5f 48 4d 53 28 70 29 3b 0a 20 20 20 20 20 20 20  _HMS(p);.       
37c0: 20 70 2d 3e 76 61 6c 69 64 54 5a 20 3d 20 30 3b   p->validTZ = 0;
37d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 76 61 6c 69  .        p->vali
37e0: 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dJD = 0;.       
37f0: 20 63 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20   computeJD(p);. 
3800: 20 20 20 20 20 20 20 5a 20 3d 20 28 28 70 2d 3e         Z = ((p->
3810: 69 4a 44 20 2b 20 31 32 39 36 30 30 30 30 30 29  iJD + 129600000)
3820: 2f 38 36 34 30 30 30 30 30 29 20 25 20 37 3b 0a  /86400000) % 7;.
3830: 20 20 20 20 20 20 20 20 69 66 28 20 5a 3e 6e 20          if( Z>n 
3840: 29 20 5a 20 2d 3d 20 37 3b 0a 20 20 20 20 20 20  ) Z -= 7;.      
3850: 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 6e 20 2d    p->iJD += (n -
3860: 20 5a 29 2a 38 36 34 30 30 30 30 30 3b 0a 20 20   Z)*86400000;.  
3870: 20 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48        clearYMD_H
3880: 4d 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20  MS_TZ(p);.      
3890: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
38a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
38b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 27 73     }.    case 's
38c0: 27 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 0a 20 20  ': {.      /*.  
38d0: 20 20 20 20 2a 2a 20 20 20 20 73 74 61 72 74 20      **    start 
38e0: 6f 66 20 54 54 54 54 54 0a 20 20 20 20 20 20 2a  of TTTTT.      *
38f0: 2a 0a 20 20 20 20 20 20 2a 2a 20 4d 6f 76 65 20  *.      ** Move 
3900: 74 68 65 20 64 61 74 65 20 62 61 63 6b 77 61 72  the date backwar
3910: 64 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ds to the beginn
3920: 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65  ing of the curre
3930: 6e 74 20 64 61 79 2c 0a 20 20 20 20 20 20 2a 2a  nt day,.      **
3940: 20 6f 72 20 6d 6f 6e 74 68 20 6f 72 20 79 65 61   or month or yea
3950: 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
3960: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2c    if( strncmp(z,
3970: 20 22 73 74 61 72 74 20 6f 66 20 22 2c 20 39 29   "start of ", 9)
3980: 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=0 ) break;.   
3990: 20 20 20 7a 20 2b 3d 20 39 3b 0a 20 20 20 20 20     z += 9;.     
39a0: 20 63 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a   computeYMD(p);.
39b0: 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 48 4d        p->validHM
39c0: 53 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  S = 1;.      p->
39d0: 68 20 3d 20 70 2d 3e 6d 20 3d 20 30 3b 0a 20 20  h = p->m = 0;.  
39e0: 20 20 20 20 70 2d 3e 73 20 3d 20 30 2e 30 3b 0a      p->s = 0.0;.
39f0: 20 20 20 20 20 20 70 2d 3e 76 61 6c 69 64 54 5a        p->validTZ
3a00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 76   = 0;.      p->v
3a10: 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20  alidJD = 0;.    
3a20: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
3a30: 6d 6f 6e 74 68 22 29 3d 3d 30 20 29 7b 0a 20 20  month")==0 ){.  
3a40: 20 20 20 20 20 20 70 2d 3e 44 20 3d 20 31 3b 0a        p->D = 1;.
3a50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a          rc = 0;.
3a60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3a70: 73 74 72 63 6d 70 28 7a 2c 22 79 65 61 72 22 29  strcmp(z,"year")
3a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
3a90: 6f 6d 70 75 74 65 59 4d 44 28 70 29 3b 0a 20 20  omputeYMD(p);.  
3aa0: 20 20 20 20 20 20 70 2d 3e 4d 20 3d 20 31 3b 0a        p->M = 1;.
3ab0: 20 20 20 20 20 20 20 20 70 2d 3e 44 20 3d 20 31          p->D = 1
3ac0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30  ;.        rc = 0
3ad0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
3ae0: 28 20 73 74 72 63 6d 70 28 7a 2c 22 64 61 79 22  ( strcmp(z,"day"
3af0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3b00: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  rc = 0;.      }.
3b10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b20: 20 7d 0a 20 20 20 20 63 61 73 65 20 27 2b 27 3a   }.    case '+':
3b30: 0a 20 20 20 20 63 61 73 65 20 27 2d 27 3a 0a 20  .    case '-':. 
3b40: 20 20 20 63 61 73 65 20 27 30 27 3a 0a 20 20 20     case '0':.   
3b50: 20 63 61 73 65 20 27 31 27 3a 0a 20 20 20 20 63   case '1':.    c
3b60: 61 73 65 20 27 32 27 3a 0a 20 20 20 20 63 61 73  ase '2':.    cas
3b70: 65 20 27 33 27 3a 0a 20 20 20 20 63 61 73 65 20  e '3':.    case 
3b80: 27 34 27 3a 0a 20 20 20 20 63 61 73 65 20 27 35  '4':.    case '5
3b90: 27 3a 0a 20 20 20 20 63 61 73 65 20 27 36 27 3a  ':.    case '6':
3ba0: 0a 20 20 20 20 63 61 73 65 20 27 37 27 3a 0a 20  .    case '7':. 
3bb0: 20 20 20 63 61 73 65 20 27 38 27 3a 0a 20 20 20     case '8':.   
3bc0: 20 63 61 73 65 20 27 39 27 3a 20 7b 0a 20 20 20   case '9': {.   
3bd0: 20 20 20 6e 20 3d 20 67 65 74 56 61 6c 75 65 28     n = getValue(
3be0: 7a 2c 20 26 72 29 3b 0a 20 20 20 20 20 20 61 73  z, &r);.      as
3bf0: 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
3c00: 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 3a      if( z[n]==':
3c10: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ' ){.        /* 
3c20: 41 20 6d 6f 64 69 66 69 65 72 20 6f 66 20 74 68  A modifier of th
3c30: 65 20 66 6f 72 6d 20 28 2b 7c 2d 29 48 48 3a 4d  e form (+|-)HH:M
3c40: 4d 3a 53 53 2e 46 46 46 20 61 64 64 73 20 28 6f  M:SS.FFF adds (o
3c50: 72 20 73 75 62 74 72 61 63 74 73 29 20 74 68 65  r subtracts) the
3c60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 70 65 63  .        ** spec
3c70: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ified number of 
3c80: 68 6f 75 72 73 2c 20 6d 69 6e 75 74 65 73 2c 20  hours, minutes, 
3c90: 73 65 63 6f 6e 64 73 2c 20 61 6e 64 20 66 72 61  seconds, and fra
3ca0: 63 74 69 6f 6e 61 6c 20 73 65 63 6f 6e 64 73 0a  ctional seconds.
3cb0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68          ** to th
3cc0: 65 20 74 69 6d 65 2e 20 20 54 68 65 20 22 2e 46  e time.  The ".F
3cd0: 46 46 22 20 6d 61 79 20 62 65 20 6f 6d 69 74 74  FF" may be omitt
3ce0: 65 64 2e 20 20 54 68 65 20 22 3a 53 53 2e 46 46  ed.  The ":SS.FF
3cf0: 46 22 20 6d 61 79 20 62 65 0a 20 20 20 20 20 20  F" may be.      
3d00: 20 20 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 20 20    ** omitted..  
3d10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
3d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20   const char *z2 
3d30: 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 44 61 74  = z;.        Dat
3d40: 65 54 69 6d 65 20 74 78 3b 0a 20 20 20 20 20 20  eTime tx;.      
3d50: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
3d60: 64 61 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  day;.        if(
3d70: 20 21 69 73 64 69 67 69 74 28 2a 28 75 38 2a 29   !isdigit(*(u8*)
3d80: 7a 32 29 20 29 20 7a 32 2b 2b 3b 0a 20 20 20 20  z2) ) z2++;.    
3d90: 20 20 20 20 6d 65 6d 73 65 74 28 26 74 78 2c 20      memset(&tx, 
3da0: 30 2c 20 73 69 7a 65 6f 66 28 74 78 29 29 3b 0a  0, sizeof(tx));.
3db0: 20 20 20 20 20 20 20 20 69 66 28 20 70 61 72 73          if( pars
3dc0: 65 48 68 4d 6d 53 73 28 7a 32 2c 20 26 74 78 29  eHhMmSs(z2, &tx)
3dd0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3de0: 20 20 63 6f 6d 70 75 74 65 4a 44 28 26 74 78 29    computeJD(&tx)
3df0: 3b 0a 20 20 20 20 20 20 20 20 74 78 2e 69 4a 44  ;.        tx.iJD
3e00: 20 2d 3d 20 34 33 32 30 30 30 30 30 3b 0a 20 20   -= 43200000;.  
3e10: 20 20 20 20 20 20 64 61 79 20 3d 20 74 78 2e 69        day = tx.i
3e20: 4a 44 2f 38 36 34 30 30 30 30 30 3b 0a 20 20 20  JD/86400000;.   
3e30: 20 20 20 20 20 74 78 2e 69 4a 44 20 2d 3d 20 64       tx.iJD -= d
3e40: 61 79 2a 38 36 34 30 30 30 30 30 3b 0a 20 20 20  ay*86400000;.   
3e50: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
3e60: 2d 27 20 29 20 74 78 2e 69 4a 44 20 3d 20 2d 74  -' ) tx.iJD = -t
3e70: 78 2e 69 4a 44 3b 0a 20 20 20 20 20 20 20 20 63  x.iJD;.        c
3e80: 6f 6d 70 75 74 65 4a 44 28 70 29 3b 0a 20 20 20  omputeJD(p);.   
3e90: 20 20 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d       clearYMD_HM
3ea0: 53 5f 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 20  S_TZ(p);.       
3eb0: 20 70 2d 3e 69 4a 44 20 2b 3d 20 74 78 2e 69 4a   p->iJD += tx.iJ
3ec0: 44 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  D;.        rc = 
3ed0: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
3ee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3ef0: 7a 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 77 68  z += n;.      wh
3f00: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75  ile( isspace(*(u
3f10: 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  8*)z) ) z++;.   
3f20: 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
3f30: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
3f40: 20 69 66 28 20 6e 3e 31 30 20 7c 7c 20 6e 3c 33   if( n>10 || n<3
3f50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3f60: 69 66 28 20 7a 5b 6e 2d 31 5d 3d 3d 27 73 27 20  if( z[n-1]=='s' 
3f70: 29 7b 20 7a 5b 6e 2d 31 5d 20 3d 20 30 3b 20 6e  ){ z[n-1] = 0; n
3f80: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 63 6f 6d 70  --; }.      comp
3f90: 75 74 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20  uteJD(p);.      
3fa0: 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  rc = 0;.      if
3fb0: 28 20 6e 3d 3d 33 20 26 26 20 73 74 72 63 6d 70  ( n==3 && strcmp
3fc0: 28 7a 2c 22 64 61 79 22 29 3d 3d 30 20 29 7b 0a  (z,"day")==0 ){.
3fd0: 20 20 20 20 20 20 20 20 70 2d 3e 69 4a 44 20 2b          p->iJD +
3fe0: 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
3ff0: 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30 20 2b  )(r*86400000.0 +
4000: 20 30 2e 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c   0.5);.      }el
4010: 73 65 20 69 66 28 20 6e 3d 3d 34 20 26 26 20 73  se if( n==4 && s
4020: 74 72 63 6d 70 28 7a 2c 22 68 6f 75 72 22 29 3d  trcmp(z,"hour")=
4030: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
4040: 3e 69 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65 33  >iJD += (sqlite3
4050: 5f 69 6e 74 36 34 29 28 72 2a 28 38 36 34 30 30  _int64)(r*(86400
4060: 30 30 30 2e 30 2f 32 34 2e 30 29 20 2b 20 30 2e  000.0/24.0) + 0.
4070: 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  5);.      }else 
4080: 69 66 28 20 6e 3d 3d 36 20 26 26 20 73 74 72 63  if( n==6 && strc
4090: 6d 70 28 7a 2c 22 6d 69 6e 75 74 65 22 29 3d 3d  mp(z,"minute")==
40a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
40b0: 69 4a 44 20 2b 3d 20 28 73 71 6c 69 74 65 33 5f  iJD += (sqlite3_
40c0: 69 6e 74 36 34 29 28 72 2a 28 38 36 34 30 30 30  int64)(r*(864000
40d0: 30 30 2e 30 2f 28 32 34 2e 30 2a 36 30 2e 30 29  00.0/(24.0*60.0)
40e0: 29 20 2b 20 30 2e 35 29 3b 0a 20 20 20 20 20 20  ) + 0.5);.      
40f0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 36 20 26  }else if( n==6 &
4100: 26 20 73 74 72 63 6d 70 28 7a 2c 22 73 65 63 6f  & strcmp(z,"seco
4110: 6e 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nd")==0 ){.     
4120: 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73 71     p->iJD += (sq
4130: 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 28  lite3_int64)(r*(
4140: 38 36 34 30 30 30 30 30 2e 30 2f 28 32 34 2e 30  86400000.0/(24.0
4150: 2a 36 30 2e 30 2a 36 30 2e 30 29 29 20 2b 20 30  *60.0*60.0)) + 0
4160: 2e 35 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .5);.      }else
4170: 20 69 66 28 20 6e 3d 3d 35 20 26 26 20 73 74 72   if( n==5 && str
4180: 63 6d 70 28 7a 2c 22 6d 6f 6e 74 68 22 29 3d 3d  cmp(z,"month")==
4190: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
41a0: 20 78 2c 20 79 3b 0a 20 20 20 20 20 20 20 20 63   x, y;.        c
41b0: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29  omputeYMD_HMS(p)
41c0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 4d 20 2b  ;.        p->M +
41d0: 3d 20 28 69 6e 74 29 72 3b 0a 20 20 20 20 20 20  = (int)r;.      
41e0: 20 20 78 20 3d 20 70 2d 3e 4d 3e 30 20 3f 20 28    x = p->M>0 ? (
41f0: 70 2d 3e 4d 2d 31 29 2f 31 32 20 3a 20 28 70 2d  p->M-1)/12 : (p-
4200: 3e 4d 2d 31 32 29 2f 31 32 3b 0a 20 20 20 20 20  >M-12)/12;.     
4210: 20 20 20 70 2d 3e 59 20 2b 3d 20 78 3b 0a 20 20     p->Y += x;.  
4220: 20 20 20 20 20 20 70 2d 3e 4d 20 2d 3d 20 78 2a        p->M -= x*
4230: 31 32 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 76  12;.        p->v
4240: 61 6c 69 64 4a 44 20 3d 20 30 3b 0a 20 20 20 20  alidJD = 0;.    
4250: 20 20 20 20 63 6f 6d 70 75 74 65 4a 44 28 70 29      computeJD(p)
4260: 3b 0a 20 20 20 20 20 20 20 20 79 20 3d 20 28 69  ;.        y = (i
4270: 6e 74 29 72 3b 0a 20 20 20 20 20 20 20 20 69 66  nt)r;.        if
4280: 28 20 79 21 3d 72 20 29 7b 0a 20 20 20 20 20 20  ( y!=r ){.      
4290: 20 20 20 20 70 2d 3e 69 4a 44 20 2b 3d 20 28 73      p->iJD += (s
42a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 28 72  qlite3_int64)((r
42b0: 20 2d 20 79 29 2a 33 30 2e 30 2a 38 36 34 30 30   - y)*30.0*86400
42c0: 30 30 30 2e 30 20 2b 20 30 2e 35 29 3b 0a 20 20  000.0 + 0.5);.  
42d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
42e0: 6c 73 65 20 69 66 28 20 6e 3d 3d 34 20 26 26 20  lse if( n==4 && 
42f0: 73 74 72 63 6d 70 28 7a 2c 22 79 65 61 72 22 29  strcmp(z,"year")
4300: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
4310: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 70 29  omputeYMD_HMS(p)
4320: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 59 20 2b  ;.        p->Y +
4330: 3d 20 28 69 6e 74 29 72 3b 0a 20 20 20 20 20 20  = (int)r;.      
4340: 20 20 70 2d 3e 76 61 6c 69 64 4a 44 20 3d 20 30    p->validJD = 0
4350: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
4360: 65 4a 44 28 70 29 3b 0a 20 20 20 20 20 20 7d 65  eJD(p);.      }e
4370: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
4380: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
4390: 20 20 20 63 6c 65 61 72 59 4d 44 5f 48 4d 53 5f     clearYMD_HMS_
43a0: 54 5a 28 70 29 3b 0a 20 20 20 20 20 20 62 72 65  TZ(p);.      bre
43b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
43c0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62  fault: {.      b
43d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
43e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
43f0: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 74 69  /*.** Process ti
4400: 6d 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  me function argu
4410: 6d 65 6e 74 73 2e 20 20 61 72 67 76 5b 30 5d 20  ments.  argv[0] 
4420: 69 73 20 61 20 64 61 74 65 2d 74 69 6d 65 20 73  is a date-time s
4430: 74 61 6d 70 2e 0a 2a 2a 20 61 72 67 76 5b 31 5d  tamp..** argv[1]
4440: 20 61 6e 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   and following a
4450: 72 65 20 6d 6f 64 69 66 69 65 72 73 2e 20 20 50  re modifiers.  P
4460: 61 72 73 65 20 74 68 65 6d 20 61 6c 6c 20 61 6e  arse them all an
4470: 64 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 72  d write.** the r
4480: 65 73 75 6c 74 69 6e 67 20 74 69 6d 65 20 69 6e  esulting time in
4490: 74 6f 20 74 68 65 20 44 61 74 65 54 69 6d 65 20  to the DateTime 
44a0: 73 74 72 75 63 74 75 72 65 20 70 2e 20 20 52 65  structure p.  Re
44b0: 74 75 72 6e 20 30 0a 2a 2a 20 6f 6e 20 73 75 63  turn 0.** on suc
44c0: 63 65 73 73 20 61 6e 64 20 31 20 69 66 20 74 68  cess and 1 if th
44d0: 65 72 65 20 61 72 65 20 61 6e 79 20 65 72 72 6f  ere are any erro
44e0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
44f0: 72 65 20 61 72 65 20 7a 65 72 6f 20 70 61 72 61  re are zero para
4500: 6d 65 74 65 72 73 20 28 69 66 20 65 76 65 6e 20  meters (if even 
4510: 61 72 67 76 5b 30 5d 20 69 73 20 75 6e 64 65 66  argv[0] is undef
4520: 69 6e 65 64 29 0a 2a 2a 20 74 68 65 6e 20 61 73  ined).** then as
4530: 73 75 6d 65 20 61 20 64 65 66 61 75 6c 74 20 76  sume a default v
4540: 61 6c 75 65 20 6f 66 20 22 6e 6f 77 22 20 66 6f  alue of "now" fo
4550: 72 20 61 72 67 76 5b 30 5d 2e 0a 2a 2f 0a 73 74  r argv[0]..*/.st
4560: 61 74 69 63 20 69 6e 74 20 69 73 44 61 74 65 28  atic int isDate(
4570: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
4580: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20  xt *context, .  
4590: 69 6e 74 20 61 72 67 63 2c 20 0a 20 20 73 71 6c  int argc, .  sql
45a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
45b0: 76 2c 20 0a 20 20 44 61 74 65 54 69 6d 65 20 2a  v, .  DateTime *
45c0: 70 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p.){.  int i;.  
45d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
45e0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 65 54  har *z;.  int eT
45f0: 79 70 65 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  ype;.  memset(p,
4600: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
4610: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 30 20 29  .  if( argc==0 )
4620: 7b 0a 20 20 20 20 73 65 74 44 61 74 65 54 69 6d  {.    setDateTim
4630: 65 54 6f 43 75 72 72 65 6e 74 28 63 6f 6e 74 65  eToCurrent(conte
4640: 78 74 2c 20 70 29 3b 0a 20 20 7d 65 6c 73 65 20  xt, p);.  }else 
4650: 69 66 28 20 28 65 54 79 70 65 20 3d 20 73 71 6c  if( (eType = sql
4660: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
4670: 61 72 67 76 5b 30 5d 29 29 3d 3d 53 51 4c 49 54  argv[0]))==SQLIT
4680: 45 5f 46 4c 4f 41 54 0a 20 20 20 20 20 20 20 20  E_FLOAT.        
4690: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 54             || eT
46a0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  ype==SQLITE_INTE
46b0: 47 45 52 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4a  GER ){.    p->iJ
46c0: 44 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  D = (sqlite3_int
46d0: 36 34 29 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  64)(sqlite3_valu
46e0: 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b 30 5d  e_double(argv[0]
46f0: 29 2a 38 36 34 30 30 30 30 30 2e 30 20 2b 20 30  )*86400000.0 + 0
4700: 2e 35 29 3b 0a 20 20 20 20 70 2d 3e 76 61 6c 69  .5);.    p->vali
4710: 64 4a 44 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dJD = 1;.  }else
4720: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
4730: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
4740: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 21  v[0]);.    if( !
4750: 7a 20 7c 7c 20 70 61 72 73 65 44 61 74 65 4f 72  z || parseDateOr
4760: 54 69 6d 65 28 63 6f 6e 74 65 78 74 2c 20 28 63  Time(context, (c
4770: 68 61 72 2a 29 7a 2c 20 70 29 20 29 7b 0a 20 20  har*)z, p) ){.  
4780: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4790: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
47a0: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
47b0: 0a 20 20 20 20 69 66 28 20 28 7a 20 3d 20 73 71  .    if( (z = sq
47c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
47d0: 28 61 72 67 76 5b 69 5d 29 29 3d 3d 30 20 7c 7c  (argv[i]))==0 ||
47e0: 20 70 61 72 73 65 4d 6f 64 69 66 69 65 72 28 28   parseModifier((
47f0: 63 68 61 72 2a 29 7a 2c 20 70 29 20 29 7b 0a 20  char*)z, p) ){. 
4800: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4810: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4820: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  n 0;.}.../*.** T
4830: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
4840: 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
4850: 74 68 65 20 76 61 72 69 6f 75 73 20 64 61 74 65  the various date
4860: 20 61 6e 64 20 74 69 6d 65 20 66 75 6e 63 74 69   and time functi
4870: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
4880: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 6a  ..*/../*.**    j
4890: 75 6c 69 61 6e 64 61 79 28 20 54 49 4d 45 53 54  ulianday( TIMEST
48a0: 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20  RING, MOD, MOD, 
48b0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ...).**.** Retur
48c0: 6e 20 74 68 65 20 6a 75 6c 69 61 6e 20 64 61 79  n the julian day
48d0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 64   number of the d
48e0: 61 74 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  ate specified in
48f0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 0a 2a   the arguments.*
4900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 75  /.static void ju
4910: 6c 69 61 6e 64 61 79 46 75 6e 63 28 0a 20 20 73  liandayFunc(.  s
4920: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
4930: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
4940: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
4950: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
4960: 20 44 61 74 65 54 69 6d 65 20 78 3b 0a 20 20 69   DateTime x;.  i
4970: 66 28 20 69 73 44 61 74 65 28 63 6f 6e 74 65 78  f( isDate(contex
4980: 74 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 26  t, argc, argv, &
4990: 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6d  x)==0 ){.    com
49a0: 70 75 74 65 4a 44 28 26 78 29 3b 0a 20 20 20 20  puteJD(&x);.    
49b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
49c0: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 78  ouble(context, x
49d0: 2e 69 4a 44 2f 38 36 34 30 30 30 30 30 2e 30 29  .iJD/86400000.0)
49e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  ;.  }.}../*.**  
49f0: 20 20 64 61 74 65 74 69 6d 65 28 20 54 49 4d 45    datetime( TIME
4a00: 53 54 52 49 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44  STRING, MOD, MOD
4a10: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74  , ...).**.** Ret
4a20: 75 72 6e 20 59 59 59 59 2d 4d 4d 2d 44 44 20 48  urn YYYY-MM-DD H
4a30: 48 3a 4d 4d 3a 53 53 0a 2a 2f 0a 73 74 61 74 69  H:MM:SS.*/.stati
4a40: 63 20 76 6f 69 64 20 64 61 74 65 74 69 6d 65 46  c void datetimeF
4a50: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
4a60: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
4a70: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
4a80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4a90: 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d  rgv.){.  DateTim
4aa0: 65 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61 74  e x;.  if( isDat
4ab0: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c  e(context, argc,
4ac0: 20 61 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b   argv, &x)==0 ){
4ad0: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31  .    char zBuf[1
4ae0: 30 30 5d 3b 0a 20 20 20 20 63 6f 6d 70 75 74 65  00];.    compute
4af0: 59 4d 44 5f 48 4d 53 28 26 78 29 3b 0a 20 20 20  YMD_HMS(&x);.   
4b00: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4b10: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
4b20: 7a 42 75 66 2c 20 22 25 30 34 64 2d 25 30 32 64  zBuf, "%04d-%02d
4b30: 2d 25 30 32 64 20 25 30 32 64 3a 25 30 32 64 3a  -%02d %02d:%02d:
4b40: 25 30 32 64 22 2c 0a 20 20 20 20 20 20 20 20 20  %02d",.         
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 78 2e 59 2c              x.Y,
4b60: 20 78 2e 4d 2c 20 78 2e 44 2c 20 78 2e 68 2c 20   x.M, x.D, x.h, 
4b70: 78 2e 6d 2c 20 28 69 6e 74 29 28 78 2e 73 29 29  x.m, (int)(x.s))
4b80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
4b90: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
4ba0: 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c  t, zBuf, -1, SQL
4bb0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
4bc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20    }.}../*.**    
4bd0: 74 69 6d 65 28 20 54 49 4d 45 53 54 52 49 4e 47  time( TIMESTRING
4be0: 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29  , MOD, MOD, ...)
4bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 48 48  .**.** Return HH
4c00: 3a 4d 4d 3a 53 53 0a 2a 2f 0a 73 74 61 74 69 63  :MM:SS.*/.static
4c10: 20 76 6f 69 64 20 74 69 6d 65 46 75 6e 63 28 0a   void timeFunc(.
4c20: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
4c30: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
4c40: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
4c50: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
4c60: 7b 0a 20 20 44 61 74 65 54 69 6d 65 20 78 3b 0a  {.  DateTime x;.
4c70: 20 20 69 66 28 20 69 73 44 61 74 65 28 63 6f 6e    if( isDate(con
4c80: 74 65 78 74 2c 20 61 72 67 63 2c 20 61 72 67 76  text, argc, argv
4c90: 2c 20 26 78 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , &x)==0 ){.    
4ca0: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
4cb0: 20 20 20 20 63 6f 6d 70 75 74 65 48 4d 53 28 26      computeHMS(&
4cc0: 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
4cd0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
4ce0: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 30  zBuf), zBuf, "%0
4cf0: 32 64 3a 25 30 32 64 3a 25 30 32 64 22 2c 20 78  2d:%02d:%02d", x
4d00: 2e 68 2c 20 78 2e 6d 2c 20 28 69 6e 74 29 78 2e  .h, x.m, (int)x.
4d10: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
4d20: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
4d30: 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53  ext, zBuf, -1, S
4d40: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
4d50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  ;.  }.}../*.**  
4d60: 20 20 64 61 74 65 28 20 54 49 4d 45 53 54 52 49    date( TIMESTRI
4d70: 4e 47 2c 20 4d 4f 44 2c 20 4d 4f 44 2c 20 2e 2e  NG, MOD, MOD, ..
4d80: 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .).**.** Return 
4d90: 59 59 59 59 2d 4d 4d 2d 44 44 0a 2a 2f 0a 73 74  YYYY-MM-DD.*/.st
4da0: 61 74 69 63 20 76 6f 69 64 20 64 61 74 65 46 75  atic void dateFu
4db0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
4dc0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
4dd0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
4de0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
4df0: 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d 65  gv.){.  DateTime
4e00: 20 78 3b 0a 20 20 69 66 28 20 69 73 44 61 74 65   x;.  if( isDate
4e10: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 63 2c 20  (context, argc, 
4e20: 61 72 67 76 2c 20 26 78 29 3d 3d 30 20 29 7b 0a  argv, &x)==0 ){.
4e30: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30      char zBuf[10
4e40: 30 5d 3b 0a 20 20 20 20 63 6f 6d 70 75 74 65 59  0];.    computeY
4e50: 4d 44 28 26 78 29 3b 0a 20 20 20 20 73 71 6c 69  MD(&x);.    sqli
4e60: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
4e70: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
4e80: 20 22 25 30 34 64 2d 25 30 32 64 2d 25 30 32 64   "%04d-%02d-%02d
4e90: 22 2c 20 78 2e 59 2c 20 78 2e 4d 2c 20 78 2e 44  ", x.Y, x.M, x.D
4ea0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
4eb0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
4ec0: 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20 53 51  xt, zBuf, -1, SQ
4ed0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4ee0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  .  }.}../*.**   
4ef0: 20 73 74 72 66 74 69 6d 65 28 20 46 4f 52 4d 41   strftime( FORMA
4f00: 54 2c 20 54 49 4d 45 53 54 52 49 4e 47 2c 20 4d  T, TIMESTRING, M
4f10: 4f 44 2c 20 4d 4f 44 2c 20 2e 2e 2e 29 0a 2a 2a  OD, MOD, ...).**
4f20: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
4f30: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 62 79  ing described by
4f40: 20 46 4f 52 4d 41 54 2e 20 20 43 6f 6e 76 65 72   FORMAT.  Conver
4f50: 73 69 6f 6e 73 20 61 73 20 66 6f 6c 6c 6f 77 73  sions as follows
4f60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 25 64 20 20 64 61  :.**.**   %d  da
4f70: 79 20 6f 66 20 6d 6f 6e 74 68 0a 2a 2a 20 20 20  y of month.**   
4f80: 25 66 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 61  %f  ** fractiona
4f90: 6c 20 73 65 63 6f 6e 64 73 20 20 53 53 2e 53 53  l seconds  SS.SS
4fa0: 53 0a 2a 2a 20 20 20 25 48 20 20 68 6f 75 72 20  S.**   %H  hour 
4fb0: 30 30 2d 32 34 0a 2a 2a 20 20 20 25 6a 20 20 64  00-24.**   %j  d
4fc0: 61 79 20 6f 66 20 79 65 61 72 20 30 30 30 2d 33  ay of year 000-3
4fd0: 36 36 0a 2a 2a 20 20 20 25 4a 20 20 2a 2a 20 4a  66.**   %J  ** J
4fe0: 75 6c 69 61 6e 20 64 61 79 20 6e 75 6d 62 65 72  ulian day number
4ff0: 0a 2a 2a 20 20 20 25 6d 20 20 6d 6f 6e 74 68 20  .**   %m  month 
5000: 30 31 2d 31 32 0a 2a 2a 20 20 20 25 4d 20 20 6d  01-12.**   %M  m
5010: 69 6e 75 74 65 20 30 30 2d 35 39 0a 2a 2a 20 20  inute 00-59.**  
5020: 20 25 73 20 20 73 65 63 6f 6e 64 73 20 73 69 6e   %s  seconds sin
5030: 63 65 20 31 39 37 30 2d 30 31 2d 30 31 0a 2a 2a  ce 1970-01-01.**
5040: 20 20 20 25 53 20 20 73 65 63 6f 6e 64 73 20 30     %S  seconds 0
5050: 30 2d 35 39 0a 2a 2a 20 20 20 25 77 20 20 64 61  0-59.**   %w  da
5060: 79 20 6f 66 20 77 65 65 6b 20 30 2d 36 20 20 73  y of week 0-6  s
5070: 75 6e 64 61 79 3d 3d 30 0a 2a 2a 20 20 20 25 57  unday==0.**   %W
5080: 20 20 77 65 65 6b 20 6f 66 20 79 65 61 72 20 30    week of year 0
5090: 30 2d 35 33 0a 2a 2a 20 20 20 25 59 20 20 79 65  0-53.**   %Y  ye
50a0: 61 72 20 30 30 30 30 2d 39 39 39 39 0a 2a 2a 20  ar 0000-9999.** 
50b0: 20 20 25 25 20 20 25 0a 2a 2f 0a 73 74 61 74 69    %%  %.*/.stati
50c0: 63 20 76 6f 69 64 20 73 74 72 66 74 69 6d 65 46  c void strftimeF
50d0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
50e0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
50f0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5100: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5110: 72 67 76 0a 29 7b 0a 20 20 44 61 74 65 54 69 6d  rgv.){.  DateTim
5120: 65 20 78 3b 0a 20 20 75 36 34 20 6e 3b 0a 20 20  e x;.  u64 n;.  
5130: 73 69 7a 65 5f 74 20 69 2c 6a 3b 0a 20 20 63 68  size_t i,j;.  ch
5140: 61 72 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33  ar *z;.  sqlite3
5150: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
5160: 61 72 20 2a 7a 46 6d 74 20 3d 20 28 63 6f 6e 73  ar *zFmt = (cons
5170: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
5180: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5190: 30 5d 29 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  0]);.  char zBuf
51a0: 5b 31 30 30 5d 3b 0a 20 20 69 66 28 20 7a 46 6d  [100];.  if( zFm
51b0: 74 3d 3d 30 20 7c 7c 20 69 73 44 61 74 65 28 63  t==0 || isDate(c
51c0: 6f 6e 74 65 78 74 2c 20 61 72 67 63 2d 31 2c 20  ontext, argc-1, 
51d0: 61 72 67 76 2b 31 2c 20 26 78 29 20 29 20 72 65  argv+1, &x) ) re
51e0: 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 73 71 6c  turn;.  db = sql
51f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
5200: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
5210: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 3d 31 3b  .  for(i=0, n=1;
5220: 20 7a 46 6d 74 5b 69 5d 3b 20 69 2b 2b 2c 20 6e   zFmt[i]; i++, n
5230: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 6d  ++){.    if( zFm
5240: 74 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20  t[i]=='%' ){.   
5250: 20 20 20 73 77 69 74 63 68 28 20 7a 46 6d 74 5b     switch( zFmt[
5260: 69 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  i+1] ){.        
5270: 63 61 73 65 20 27 64 27 3a 0a 20 20 20 20 20 20  case 'd':.      
5280: 20 20 63 61 73 65 20 27 48 27 3a 0a 20 20 20 20    case 'H':.    
5290: 20 20 20 20 63 61 73 65 20 27 6d 27 3a 0a 20 20      case 'm':.  
52a0: 20 20 20 20 20 20 63 61 73 65 20 27 4d 27 3a 0a        case 'M':.
52b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 53 27          case 'S'
52c0: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  :.        case '
52d0: 57 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 2b  W':.          n+
52e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +;.          /* 
52f0: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  fall thru */.   
5300: 20 20 20 20 20 63 61 73 65 20 27 77 27 3a 0a 20       case 'w':. 
5310: 20 20 20 20 20 20 20 63 61 73 65 20 27 25 27 3a         case '%':
5320: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5330: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27  ;.        case '
5340: 66 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e 20  f':.          n 
5350: 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20 20 20 20  += 8;.          
5360: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
5370: 61 73 65 20 27 6a 27 3a 0a 20 20 20 20 20 20 20  ase 'j':.       
5380: 20 20 20 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 20     n += 3;.     
5390: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
53a0: 20 20 20 20 63 61 73 65 20 27 59 27 3a 0a 20 20      case 'Y':.  
53b0: 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 38 3b 0a          n += 8;.
53c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
53d0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 73  .        case 's
53e0: 27 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ':.        case 
53f0: 27 4a 27 3a 0a 20 20 20 20 20 20 20 20 20 20 6e  'J':.          n
5400: 20 2b 3d 20 35 30 3b 0a 20 20 20 20 20 20 20 20   += 50;.        
5410: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5420: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
5430: 20 20 20 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20      return;  /* 
5440: 45 52 52 4f 52 2e 20 20 72 65 74 75 72 6e 20 61  ERROR.  return a
5450: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 7d   NULL */.      }
5460: 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
5470: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 73 69  }.  }.  if( n<si
5480: 7a 65 6f 66 28 7a 42 75 66 29 20 29 7b 0a 20 20  zeof(zBuf) ){.  
5490: 20 20 7a 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 65    z = zBuf;.  }e
54a0: 6c 73 65 20 69 66 28 20 6e 3e 28 75 36 34 29 64  lse if( n>(u64)d
54b0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
54c0: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 20 29  _LIMIT_LENGTH] )
54d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
54e0: 73 75 6c 74 5f 65 72 72 6f 72 5f 74 6f 6f 62 69  sult_error_toobi
54f0: 67 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  g(context);.    
5500: 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b  return;.  }else{
5510: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
5520: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20  DbMallocRaw(db, 
5530: 28 69 6e 74 29 6e 29 3b 0a 20 20 20 20 69 66 28  (int)n);.    if(
5540: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   z==0 ){.      s
5550: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5560: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
5570: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
5580: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 6f  ;.    }.  }.  co
5590: 6d 70 75 74 65 4a 44 28 26 78 29 3b 0a 20 20 63  mputeJD(&x);.  c
55a0: 6f 6d 70 75 74 65 59 4d 44 5f 48 4d 53 28 26 78  omputeYMD_HMS(&x
55b0: 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  );.  for(i=j=0; 
55c0: 7a 46 6d 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zFmt[i]; i++){. 
55d0: 20 20 20 69 66 28 20 7a 46 6d 74 5b 69 5d 21 3d     if( zFmt[i]!=
55e0: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 5b 6a  '%' ){.      z[j
55f0: 2b 2b 5d 20 3d 20 7a 46 6d 74 5b 69 5d 3b 0a 20  ++] = zFmt[i];. 
5600: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5610: 69 2b 2b 3b 0a 20 20 20 20 20 20 73 77 69 74 63  i++;.      switc
5620: 68 28 20 7a 46 6d 74 5b 69 5d 20 29 7b 0a 20 20  h( zFmt[i] ){.  
5630: 20 20 20 20 20 20 63 61 73 65 20 27 64 27 3a 20        case 'd': 
5640: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
5650: 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64  f(3, &z[j],"%02d
5660: 22 2c 78 2e 44 29 3b 20 6a 2b 3d 32 3b 20 62 72  ",x.D); j+=2; br
5670: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73  eak;.        cas
5680: 65 20 27 66 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'f': {.       
5690: 20 20 20 64 6f 75 62 6c 65 20 73 20 3d 20 78 2e     double s = x.
56a0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
56b0: 20 73 3e 35 39 2e 39 39 39 20 29 20 73 20 3d 20   s>59.999 ) s = 
56c0: 35 39 2e 39 39 39 3b 0a 20 20 20 20 20 20 20 20  59.999;.        
56d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
56e0: 74 66 28 37 2c 20 26 7a 5b 6a 5d 2c 22 25 30 36  tf(7, &z[j],"%06
56f0: 2e 33 66 22 2c 20 73 29 3b 0a 20 20 20 20 20 20  .3f", s);.      
5700: 20 20 20 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33      j += sqlite3
5710: 53 74 72 6c 65 6e 33 30 28 26 7a 5b 6a 5d 29 3b  Strlen30(&z[j]);
5720: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5730: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5740: 20 20 20 20 63 61 73 65 20 27 48 27 3a 20 20 73      case 'H':  s
5750: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
5760: 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c  3, &z[j],"%02d",
5770: 78 2e 68 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61  x.h); j+=2; brea
5780: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  k;.        case 
5790: 27 57 27 3a 20 2f 2a 20 46 61 6c 6c 20 74 68 72  'W': /* Fall thr
57a0: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73  u */.        cas
57b0: 65 20 27 6a 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'j': {.       
57c0: 20 20 20 69 6e 74 20 6e 44 61 79 3b 20 20 20 20     int nDay;    
57d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
57e0: 65 72 20 6f 66 20 64 61 79 73 20 73 69 6e 63 65  er of days since
57f0: 20 31 73 74 20 64 61 79 20 6f 66 20 79 65 61 72   1st day of year
5800: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44 61   */.          Da
5810: 74 65 54 69 6d 65 20 79 20 3d 20 78 3b 0a 20 20  teTime y = x;.  
5820: 20 20 20 20 20 20 20 20 79 2e 76 61 6c 69 64 4a          y.validJ
5830: 44 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  D = 0;.         
5840: 20 79 2e 4d 20 3d 20 31 3b 0a 20 20 20 20 20 20   y.M = 1;.      
5850: 20 20 20 20 79 2e 44 20 3d 20 31 3b 0a 20 20 20      y.D = 1;.   
5860: 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4a 44         computeJD
5870: 28 26 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (&y);.          
5880: 6e 44 61 79 20 3d 20 28 69 6e 74 29 28 28 78 2e  nDay = (int)((x.
5890: 69 4a 44 2d 79 2e 69 4a 44 2b 34 33 32 30 30 30  iJD-y.iJD+432000
58a0: 30 30 29 2f 38 36 34 30 30 30 30 30 29 3b 0a 20  00)/86400000);. 
58b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 6d           if( zFm
58c0: 74 5b 69 5d 3d 3d 27 57 27 20 29 7b 0a 20 20 20  t[i]=='W' ){.   
58d0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 77 64 3b           int wd;
58e0: 20 20 20 2f 2a 20 30 3d 4d 6f 6e 64 61 79 2c 20     /* 0=Monday, 
58f0: 31 3d 54 75 65 73 64 61 79 2c 20 2e 2e 2e 20 36  1=Tuesday, ... 6
5900: 3d 53 75 6e 64 61 79 20 2a 2f 0a 20 20 20 20 20  =Sunday */.     
5910: 20 20 20 20 20 20 20 77 64 20 3d 20 28 69 6e 74         wd = (int
5920: 29 28 28 28 78 2e 69 4a 44 2b 34 33 32 30 30 30  )(((x.iJD+432000
5930: 30 30 29 2f 38 36 34 30 30 30 30 30 29 25 37 29  00)/86400000)%7)
5940: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
5950: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
5960: 2c 20 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 28  , &z[j],"%02d",(
5970: 6e 44 61 79 2b 37 2d 77 64 29 2f 37 29 3b 0a 20  nDay+7-wd)/7);. 
5980: 20 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20             j += 
5990: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  2;.          }el
59a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
59b0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
59c0: 28 34 2c 20 26 7a 5b 6a 5d 2c 22 25 30 33 64 22  (4, &z[j],"%03d"
59d0: 2c 6e 44 61 79 2b 31 29 3b 0a 20 20 20 20 20 20  ,nDay+1);.      
59e0: 20 20 20 20 20 20 6a 20 2b 3d 20 33 3b 0a 20 20        j += 3;.  
59f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5a00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5a10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
5a20: 65 20 27 4a 27 3a 20 7b 0a 20 20 20 20 20 20 20  e 'J': {.       
5a30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
5a40: 6e 74 66 28 32 30 2c 20 26 7a 5b 6a 5d 2c 22 25  ntf(20, &z[j],"%
5a50: 2e 31 36 67 22 2c 78 2e 69 4a 44 2f 38 36 34 30  .16g",x.iJD/8640
5a60: 30 30 30 30 2e 30 29 3b 0a 20 20 20 20 20 20 20  0000.0);.       
5a70: 20 20 20 6a 2b 3d 73 71 6c 69 74 65 33 53 74 72     j+=sqlite3Str
5a80: 6c 65 6e 33 30 28 26 7a 5b 6a 5d 29 3b 0a 20 20  len30(&z[j]);.  
5a90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5aa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5ab0: 20 63 61 73 65 20 27 6d 27 3a 20 20 73 71 6c 69   case 'm':  sqli
5ac0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
5ad0: 26 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 78 2e 4d  &z[j],"%02d",x.M
5ae0: 29 3b 20 6a 2b 3d 32 3b 20 62 72 65 61 6b 3b 0a  ); j+=2; break;.
5af0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 4d 27          case 'M'
5b00: 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  :  sqlite3_snpri
5b10: 6e 74 66 28 33 2c 20 26 7a 5b 6a 5d 2c 22 25 30  ntf(3, &z[j],"%0
5b20: 32 64 22 2c 78 2e 6d 29 3b 20 6a 2b 3d 32 3b 20  2d",x.m); j+=2; 
5b30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
5b40: 61 73 65 20 27 73 27 3a 20 7b 0a 20 20 20 20 20  ase 's': {.     
5b50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
5b60: 72 69 6e 74 66 28 33 30 2c 26 7a 5b 6a 5d 2c 22  rintf(30,&z[j],"
5b70: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 28 69 6e 74 29 28 78 2e 69 4a 44 2f 31 30 30 30  (int)(x.iJD/1000
5ba0: 2e 30 20 2d 20 32 31 30 38 36 36 37 36 30 30 30  .0 - 21086676000
5bb0: 30 2e 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20  0.0));.         
5bc0: 20 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   j += sqlite3Str
5bd0: 6c 65 6e 33 30 28 26 7a 5b 6a 5d 29 3b 0a 20 20  len30(&z[j]);.  
5be0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5bf0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5c00: 20 63 61 73 65 20 27 53 27 3a 20 20 73 71 6c 69   case 'S':  sqli
5c10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 26  te3_snprintf(3,&
5c20: 7a 5b 6a 5d 2c 22 25 30 32 64 22 2c 28 69 6e 74  z[j],"%02d",(int
5c30: 29 78 2e 73 29 3b 20 6a 2b 3d 32 3b 20 62 72 65  )x.s); j+=2; bre
5c40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65  ak;.        case
5c50: 20 27 77 27 3a 20 7b 0a 20 20 20 20 20 20 20 20   'w': {.        
5c60: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72    z[j++] = (char
5c70: 29 28 28 28 78 2e 69 4a 44 2b 31 32 39 36 30 30  )(((x.iJD+129600
5c80: 30 30 30 29 2f 38 36 34 30 30 30 30 30 29 20 25  000)/86400000) %
5c90: 20 37 29 20 2b 20 27 30 27 3b 0a 20 20 20 20 20   7) + '0';.     
5ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61      }.        ca
5cc0: 73 65 20 27 59 27 3a 20 7b 0a 20 20 20 20 20 20  se 'Y': {.      
5cd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5ce0: 69 6e 74 66 28 35 2c 26 7a 5b 6a 5d 2c 22 25 30  intf(5,&z[j],"%0
5cf0: 34 64 22 2c 78 2e 59 29 3b 20 6a 2b 3d 73 71 6c  4d",x.Y); j+=sql
5d00: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 5b  ite3Strlen30(&z[
5d10: 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  j]);.          b
5d20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5d30: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
5d40: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 25 27 3b     z[j++] = '%';
5d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5d60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 6a 5d      }.  }.  z[j]
5d70: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
5d80: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
5d90: 65 78 74 2c 20 7a 2c 20 2d 31 2c 0a 20 20 20 20  ext, z, -1,.    
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 7a 3d 3d 7a 42 75 66 20 3f 20 53 51 4c 49    z==zBuf ? SQLI
5dc0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 53  TE_TRANSIENT : S
5dd0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
5de0: 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72 72 65 6e 74  }../*.** current
5df0: 5f 74 69 6d 65 28 29 0a 2a 2a 0a 2a 2a 20 54 68  _time().**.** Th
5e00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
5e10: 72 6e 73 20 74 68 65 20 73 61 6d 65 20 76 61 6c  rns the same val
5e20: 75 65 20 61 73 20 74 69 6d 65 28 27 6e 6f 77 27  ue as time('now'
5e30: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
5e40: 64 20 63 74 69 6d 65 46 75 6e 63 28 0a 20 20 73  d ctimeFunc(.  s
5e50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5e60: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e  context,.  int N
5e70: 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65  otUsed,.  sqlite
5e80: 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65  3_value **NotUse
5e90: 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  d2.){.  UNUSED_P
5ea0: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
5eb0: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
5ec0: 74 69 6d 65 46 75 6e 63 28 63 6f 6e 74 65 78 74  timeFunc(context
5ed0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , 0, 0);.}../*.*
5ee0: 2a 20 63 75 72 72 65 6e 74 5f 64 61 74 65 28 29  * current_date()
5ef0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
5f00: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
5f10: 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 64   same value as d
5f20: 61 74 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f 0a 73  ate('now')..*/.s
5f30: 74 61 74 69 63 20 76 6f 69 64 20 63 64 61 74 65  tatic void cdate
5f40: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
5f50: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
5f60: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
5f70: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
5f80: 20 2a 2a 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20   **NotUsed2.){. 
5f90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5fa0: 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
5fb0: 73 65 64 32 29 3b 0a 20 20 64 61 74 65 46 75 6e  sed2);.  dateFun
5fc0: 63 28 63 6f 6e 74 65 78 74 2c 20 30 2c 20 30 29  c(context, 0, 0)
5fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 63 75 72 72 65  ;.}../*.** curre
5fe0: 6e 74 5f 74 69 6d 65 73 74 61 6d 70 28 29 0a 2a  nt_timestamp().*
5ff0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6000: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
6010: 61 6d 65 20 76 61 6c 75 65 20 61 73 20 64 61 74  ame value as dat
6020: 65 74 69 6d 65 28 27 6e 6f 77 27 29 2e 0a 2a 2f  etime('now')..*/
6030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 74 69  .static void cti
6040: 6d 65 73 74 61 6d 70 46 75 6e 63 28 0a 20 20 73  mestampFunc(.  s
6050: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6060: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e  context,.  int N
6070: 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65  otUsed,.  sqlite
6080: 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65  3_value **NotUse
6090: 64 32 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  d2.){.  UNUSED_P
60a0: 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
60b0: 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
60c0: 64 61 74 65 74 69 6d 65 46 75 6e 63 28 63 6f 6e  datetimeFunc(con
60d0: 74 65 78 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 23  text, 0, 0);.}.#
60e0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
60f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41  d(SQLITE_OMIT_DA
6100: 54 45 54 49 4d 45 5f 46 55 4e 43 53 29 20 2a 2f  TETIME_FUNCS) */
6110: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6120: 4f 4d 49 54 5f 44 41 54 45 54 49 4d 45 5f 46 55  OMIT_DATETIME_FU
6130: 4e 43 53 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  NCS./*.** If the
6140: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
6150: 69 6c 65 64 20 74 6f 20 6f 6d 69 74 20 74 68 65  iled to omit the
6160: 20 66 75 6c 6c 2d 73 63 61 6c 65 20 64 61 74 65   full-scale date
6170: 20 61 6e 64 20 74 69 6d 65 0a 2a 2a 20 68 61 6e   and time.** han
6180: 64 6c 69 6e 67 20 28 74 6f 20 67 65 74 20 61 20  dling (to get a 
6190: 73 6d 61 6c 6c 65 72 20 62 69 6e 61 72 79 29 2c  smaller binary),
61a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
61b0: 69 6e 69 6d 61 6c 20 76 65 72 73 69 6f 6e 0a 2a  inimal version.*
61c0: 2a 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  * of the functio
61d0: 6e 73 20 63 75 72 72 65 6e 74 5f 74 69 6d 65 28  ns current_time(
61e0: 29 2c 20 63 75 72 72 65 6e 74 5f 64 61 74 65 28  ), current_date(
61f0: 29 20 61 6e 64 20 63 75 72 72 65 6e 74 5f 74 69  ) and current_ti
6200: 6d 65 73 74 61 6d 70 28 29 0a 2a 2a 20 61 72 65  mestamp().** are
6210: 20 69 6e 63 6c 75 64 65 64 20 69 6e 73 74 65 61   included instea
6220: 64 2e 20 54 68 69 73 20 69 73 20 74 6f 20 73 75  d. This is to su
6230: 70 70 6f 72 74 20 63 6f 6c 75 6d 6e 20 64 65 63  pport column dec
6240: 6c 61 72 61 74 69 6f 6e 73 20 74 68 61 74 0a 2a  larations that.*
6250: 2a 20 69 6e 63 6c 75 64 65 20 22 44 45 46 41 55  * include "DEFAU
6260: 4c 54 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 22  LT CURRENT_TIME"
6270: 20 65 74 63 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   etc..**.** This
6280: 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 74   function uses t
6290: 68 65 20 43 2d 6c 69 62 72 61 72 79 20 66 75 6e  he C-library fun
62a0: 63 74 69 6f 6e 73 20 74 69 6d 65 28 29 2c 20 67  ctions time(), g
62b0: 6d 74 69 6d 65 28 29 0a 2a 2a 20 61 6e 64 20 73  mtime().** and s
62c0: 74 72 66 74 69 6d 65 28 29 2e 20 54 68 65 20 66  trftime(). The f
62d0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 74 6f 20  ormat string to 
62e0: 70 61 73 73 20 74 6f 20 73 74 72 66 74 69 6d 65  pass to strftime
62f0: 28 29 20 69 73 20 73 75 70 70 6c 69 65 64 0a 2a  () is supplied.*
6300: 2a 20 61 73 20 74 68 65 20 75 73 65 72 2d 64 61  * as the user-da
6310: 74 61 20 66 6f 72 20 74 68 65 20 66 75 6e 63 74  ta for the funct
6320: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
6330: 6f 69 64 20 63 75 72 72 65 6e 74 54 69 6d 65 46  oid currentTimeF
6340: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
6350: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6360: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
6370: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6380: 72 67 76 0a 29 7b 0a 20 20 74 69 6d 65 5f 74 20  rgv.){.  time_t 
6390: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d  t;.  char *zForm
63a0: 61 74 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  at = (char *)sql
63b0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
63c0: 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74  ontext);.  sqlit
63d0: 65 33 20 2a 64 62 3b 0a 20 20 64 6f 75 62 6c 65  e3 *db;.  double
63e0: 20 72 54 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rT;.  char zBuf
63f0: 5b 32 30 5d 3b 0a 0a 20 20 64 62 20 3d 20 73 71  [20];..  db = sq
6400: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
6410: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
6420: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 75 72  ;.  sqlite3OsCur
6430: 72 65 6e 74 54 69 6d 65 28 64 62 2d 3e 70 56 66  rentTime(db->pVf
6440: 73 2c 20 26 72 54 29 3b 0a 20 20 74 20 3d 20 38  s, &rT);.  t = 8
6450: 36 34 30 30 2e 30 2a 28 72 54 20 2d 20 32 34 34  6400.0*(rT - 244
6460: 30 35 38 37 2e 35 29 20 2b 20 30 2e 35 3b 0a 23  0587.5) + 0.5;.#
6470: 69 66 64 65 66 20 48 41 56 45 5f 47 4d 54 49 4d  ifdef HAVE_GMTIM
6480: 45 5f 52 0a 20 20 7b 0a 20 20 20 20 73 74 72 75  E_R.  {.    stru
6490: 63 74 20 74 6d 20 73 4e 6f 77 3b 0a 20 20 20 20  ct tm sNow;.    
64a0: 67 6d 74 69 6d 65 5f 72 28 26 74 2c 20 26 73 4e  gmtime_r(&t, &sN
64b0: 6f 77 29 3b 0a 20 20 20 20 73 74 72 66 74 69 6d  ow);.    strftim
64c0: 65 28 7a 42 75 66 2c 20 32 30 2c 20 7a 46 6f 72  e(zBuf, 20, zFor
64d0: 6d 61 74 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 7d  mat, &sNow);.  }
64e0: 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 73  .#else.  {.    s
64f0: 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20  truct tm *pTm;. 
6500: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6510: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
6520: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
6530: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
6540: 54 45 52 29 29 3b 0a 20 20 20 20 70 54 6d 20 3d  TER));.    pTm =
6550: 20 67 6d 74 69 6d 65 28 26 74 29 3b 0a 20 20 20   gmtime(&t);.   
6560: 20 73 74 72 66 74 69 6d 65 28 7a 42 75 66 2c 20   strftime(zBuf, 
6570: 32 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 70 54 6d  20, zFormat, pTm
6580: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
6590: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
65a0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
65b0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
65c0: 5f 4d 41 53 54 45 52 29 29 3b 0a 20 20 7d 0a 23  _MASTER));.  }.#
65d0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
65e0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
65f0: 74 65 78 74 2c 20 7a 42 75 66 2c 20 2d 31 2c 20  text, zBuf, -1, 
6600: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
6610: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
6620: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6630: 20 72 65 67 69 73 74 65 72 65 64 20 61 6c 6c 20   registered all 
6640: 6f 66 20 74 68 65 20 61 62 6f 76 65 20 43 20 66  of the above C f
6650: 75 6e 63 74 69 6f 6e 73 20 61 73 20 53 51 4c 0a  unctions as SQL.
6660: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54  ** functions.  T
6670: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  his should be th
6680: 65 20 6f 6e 6c 79 20 72 6f 75 74 69 6e 65 20 69  e only routine i
6690: 6e 20 74 68 69 73 20 66 69 6c 65 20 77 69 74 68  n this file with
66a0: 0a 2a 2a 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e  .** external lin
66b0: 6b 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  kage..*/.void sq
66c0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 44 61 74  lite3RegisterDat
66d0: 65 54 69 6d 65 46 75 6e 63 74 69 6f 6e 73 28 76  eTimeFunctions(v
66e0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 53  oid){.  static S
66f0: 51 4c 49 54 45 5f 57 53 44 20 46 75 6e 63 44 65  QLITE_WSD FuncDe
6700: 66 20 61 44 61 74 65 54 69 6d 65 46 75 6e 63 73  f aDateTimeFuncs
6710: 5b 5d 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 53  [] = {.#ifndef S
6720: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54  QLITE_OMIT_DATET
6730: 49 4d 45 5f 46 55 4e 43 53 0a 20 20 20 20 46 55  IME_FUNCS.    FU
6740: 4e 43 54 49 4f 4e 28 6a 75 6c 69 61 6e 64 61 79  NCTION(julianday
6750: 2c 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20  ,        -1, 0, 
6760: 30 2c 20 6a 75 6c 69 61 6e 64 61 79 46 75 6e 63  0, juliandayFunc
6770: 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e   ),.    FUNCTION
6780: 28 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  (date,          
6790: 20 20 20 2d 31 2c 20 30 2c 20 30 2c 20 64 61 74     -1, 0, 0, dat
67a0: 65 46 75 6e 63 20 20 20 20 20 20 29 2c 0a 20 20  eFunc      ),.  
67b0: 20 20 46 55 4e 43 54 49 4f 4e 28 74 69 6d 65 2c    FUNCTION(time,
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
67d0: 20 30 2c 20 30 2c 20 74 69 6d 65 46 75 6e 63 20   0, 0, timeFunc 
67e0: 20 20 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43       ),.    FUNC
67f0: 54 49 4f 4e 28 64 61 74 65 74 69 6d 65 2c 20 20  TION(datetime,  
6800: 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 30 2c         -1, 0, 0,
6810: 20 64 61 74 65 74 69 6d 65 46 75 6e 63 20 20 29   datetimeFunc  )
6820: 2c 0a 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 73  ,.    FUNCTION(s
6830: 74 72 66 74 69 6d 65 2c 20 20 20 20 20 20 20 20  trftime,        
6840: 20 2d 31 2c 20 30 2c 20 30 2c 20 73 74 72 66 74   -1, 0, 0, strft
6850: 69 6d 65 46 75 6e 63 20 20 29 2c 0a 20 20 20 20  imeFunc  ),.    
6860: 46 55 4e 43 54 49 4f 4e 28 63 75 72 72 65 6e 74  FUNCTION(current
6870: 5f 74 69 6d 65 2c 20 20 20 20 20 20 30 2c 20 30  _time,      0, 0
6880: 2c 20 30 2c 20 63 74 69 6d 65 46 75 6e 63 20 20  , 0, ctimeFunc  
6890: 20 20 20 29 2c 0a 20 20 20 20 46 55 4e 43 54 49     ),.    FUNCTI
68a0: 4f 4e 28 63 75 72 72 65 6e 74 5f 74 69 6d 65 73  ON(current_times
68b0: 74 61 6d 70 2c 20 30 2c 20 30 2c 20 30 2c 20 63  tamp, 0, 0, 0, c
68c0: 74 69 6d 65 73 74 61 6d 70 46 75 6e 63 29 2c 0a  timestampFunc),.
68d0: 20 20 20 20 46 55 4e 43 54 49 4f 4e 28 63 75 72      FUNCTION(cur
68e0: 72 65 6e 74 5f 64 61 74 65 2c 20 20 20 20 20 20  rent_date,      
68f0: 30 2c 20 30 2c 20 30 2c 20 63 64 61 74 65 46 75  0, 0, 0, cdateFu
6900: 6e 63 20 20 20 20 20 29 2c 0a 23 65 6c 73 65 0a  nc     ),.#else.
6910: 20 20 20 20 53 54 52 5f 46 55 4e 43 54 49 4f 4e      STR_FUNCTION
6920: 28 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 20  (current_time,  
6930: 20 20 20 20 30 2c 20 22 25 48 3a 25 4d 3a 25 53      0, "%H:%M:%S
6940: 22 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20 63  ",          0, c
6950: 75 72 72 65 6e 74 54 69 6d 65 46 75 6e 63 29 2c  urrentTimeFunc),
6960: 0a 20 20 20 20 53 54 52 5f 46 55 4e 43 54 49 4f  .    STR_FUNCTIO
6970: 4e 28 63 75 72 72 65 6e 74 5f 74 69 6d 65 73 74  N(current_timest
6980: 61 6d 70 2c 20 30 2c 20 22 25 59 2d 25 6d 2d 25  amp, 0, "%Y-%m-%
6990: 64 22 2c 20 20 20 20 20 20 20 20 20 20 30 2c 20  d",          0, 
69a0: 63 75 72 72 65 6e 74 54 69 6d 65 46 75 6e 63 29  currentTimeFunc)
69b0: 2c 0a 20 20 20 20 53 54 52 5f 46 55 4e 43 54 49  ,.    STR_FUNCTI
69c0: 4f 4e 28 63 75 72 72 65 6e 74 5f 64 61 74 65 2c  ON(current_date,
69d0: 20 20 20 20 20 20 30 2c 20 22 25 59 2d 25 6d 2d        0, "%Y-%m-
69e0: 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20 30 2c  %d %H:%M:%S", 0,
69f0: 20 63 75 72 72 65 6e 74 54 69 6d 65 46 75 6e 63   currentTimeFunc
6a00: 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  ),.#endif.  };. 
6a10: 20 69 6e 74 20 69 3b 0a 20 20 46 75 6e 63 44 65   int i;.  FuncDe
6a20: 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26  fHash *pHash = &
6a30: 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61  GLOBAL(FuncDefHa
6a40: 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  sh, sqlite3Globa
6a50: 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 46  lFunctions);.  F
6a60: 75 6e 63 44 65 66 20 2a 61 46 75 6e 63 20 3d 20  uncDef *aFunc = 
6a70: 28 46 75 6e 63 44 65 66 2a 29 26 47 4c 4f 42 41  (FuncDef*)&GLOBA
6a80: 4c 28 46 75 6e 63 44 65 66 2c 20 61 44 61 74 65  L(FuncDef, aDate
6a90: 54 69 6d 65 46 75 6e 63 73 29 3b 0a 0a 20 20 66  TimeFuncs);..  f
6aa0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
6ab0: 69 7a 65 28 61 44 61 74 65 54 69 6d 65 46 75 6e  ize(aDateTimeFun
6ac0: 63 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  cs); i++){.    s
6ad0: 71 6c 69 74 65 33 46 75 6e 63 44 65 66 49 6e 73  qlite3FuncDefIns
6ae0: 65 72 74 28 70 48 61 73 68 2c 20 26 61 46 75 6e  ert(pHash, &aFun
6af0: 63 5b 69 5d 29 3b 0a 20 20 7d 0a 7d 0a           c[i]);.  }.}.