Index: third_party/sqlite/src/src/date.c |
diff --git a/third_party/sqlite/src/src/date.c b/third_party/sqlite/src/src/date.c |
index 11b04ea004b611457422108af8d83360be9d80ae..3d7604ab45380a6ca1282464cd338b3e301f7000 100644 |
--- a/third_party/sqlite/src/src/date.c |
+++ b/third_party/sqlite/src/src/date.c |
@@ -16,7 +16,7 @@ |
** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. |
** All other code has file scope. |
** |
-** SQLite processes all times and dates as Julian Day numbers. The |
+** SQLite processes all times and dates as julian day numbers. The |
** dates and times are stored as the number of days since noon |
** in Greenwich on November 24, 4714 B.C. according to the Gregorian |
** calendar system. |
@@ -31,7 +31,7 @@ |
** |
** The Gregorian calendar system is used for all dates and times, |
** even those that predate the Gregorian calendar. Historians usually |
-** use the Julian calendar for dates prior to 1582-10-15 and for some |
+** use the julian calendar for dates prior to 1582-10-15 and for some |
** dates afterwards, depending on locale. Beware of this difference. |
** |
** The conversion algorithms are implemented based on descriptions |
@@ -65,6 +65,7 @@ struct DateTime { |
char validHMS; /* True (1) if h,m,s are valid */ |
char validJD; /* True (1) if iJD is valid */ |
char validTZ; /* True (1) if tz is valid */ |
+ char tzSet; /* Timezone was set explicitly */ |
}; |
@@ -158,6 +159,7 @@ static int parseTimezone(const char *zDate, DateTime *p){ |
p->tz = sgn*(nMn + nHr*60); |
zulu_time: |
while( sqlite3Isspace(*zDate) ){ zDate++; } |
+ p->tzSet = 1; |
return *zDate!=0; |
} |
@@ -304,7 +306,7 @@ static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ |
} |
/* |
-** Attempt to parse the given string into a Julian Day Number. Return |
+** Attempt to parse the given string into a julian day number. Return |
** the number of errors. |
** |
** The following are acceptable forms for the input string: |
@@ -355,7 +357,7 @@ static void computeYMD(DateTime *p){ |
A = Z + 1 + A - (A/4); |
B = A + 1524; |
C = (int)((B - 122.1)/365.25); |
- D = (36525*C)/100; |
+ D = (36525*(C&32767))/100; |
E = (int)((B-D)/30.6001); |
X1 = (int)(30.6001*E); |
p->D = B - D - X1; |
@@ -412,8 +414,9 @@ static void clearYMD_HMS_TZ(DateTime *p){ |
** already, check for an MSVC build environment that provides |
** localtime_s(). |
*/ |
-#if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) && \ |
- defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE) |
+#if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S \ |
+ && defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE) |
+#undef HAVE_LOCALTIME_S |
#define HAVE_LOCALTIME_S 1 |
#endif |
@@ -433,8 +436,7 @@ static void clearYMD_HMS_TZ(DateTime *p){ |
*/ |
static int osLocaltime(time_t *t, struct tm *pTm){ |
int rc; |
-#if (!defined(HAVE_LOCALTIME_R) || !HAVE_LOCALTIME_R) \ |
- && (!defined(HAVE_LOCALTIME_S) || !HAVE_LOCALTIME_S) |
+#if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S |
struct tm *pX; |
#if SQLITE_THREADSAFE>0 |
sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); |
@@ -451,7 +453,7 @@ static int osLocaltime(time_t *t, struct tm *pTm){ |
#ifndef SQLITE_OMIT_BUILTIN_TEST |
if( sqlite3GlobalConfig.bLocaltimeFault ) return 1; |
#endif |
-#if defined(HAVE_LOCALTIME_R) && HAVE_LOCALTIME_R |
+#if HAVE_LOCALTIME_R |
rc = localtime_r(t, pTm)==0; |
#else |
rc = localtime_s(pTm, t); |
@@ -590,13 +592,18 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ |
} |
#ifndef SQLITE_OMIT_LOCALTIME |
else if( strcmp(z, "utc")==0 ){ |
- sqlite3_int64 c1; |
- computeJD(p); |
- c1 = localtimeOffset(p, pCtx, &rc); |
- if( rc==SQLITE_OK ){ |
- p->iJD -= c1; |
- clearYMD_HMS_TZ(p); |
- p->iJD += c1 - localtimeOffset(p, pCtx, &rc); |
+ if( p->tzSet==0 ){ |
+ sqlite3_int64 c1; |
+ computeJD(p); |
+ c1 = localtimeOffset(p, pCtx, &rc); |
+ if( rc==SQLITE_OK ){ |
+ p->iJD -= c1; |
+ clearYMD_HMS_TZ(p); |
+ p->iJD += c1 - localtimeOffset(p, pCtx, &rc); |
+ } |
+ p->tzSet = 1; |
+ }else{ |
+ rc = SQLITE_OK; |
} |
} |
#endif |
@@ -875,7 +882,7 @@ static void dateFunc( |
** %f ** fractional seconds SS.SSS |
** %H hour 00-24 |
** %j day of year 000-366 |
-** %J ** Julian day number |
+** %J ** julian day number |
** %m month 01-12 |
** %M minute 00-59 |
** %s seconds since 1970-01-01 |
@@ -895,8 +902,10 @@ static void strftimeFunc( |
size_t i,j; |
char *z; |
sqlite3 *db; |
- const char *zFmt = (const char*)sqlite3_value_text(argv[0]); |
+ const char *zFmt; |
char zBuf[100]; |
+ if( argc==0 ) return; |
+ zFmt = (const char*)sqlite3_value_text(argv[0]); |
if( zFmt==0 || isDate(context, argc-1, argv+1, &x) ) return; |
db = sqlite3_context_db_handle(context); |
for(i=0, n=1; zFmt[i]; i++, n++){ |
@@ -1090,7 +1099,7 @@ static void currentTimeFunc( |
iT = sqlite3StmtCurrentTime(context); |
if( iT<=0 ) return; |
t = iT/1000 - 10000*(sqlite3_int64)21086676; |
-#ifdef HAVE_GMTIME_R |
+#if HAVE_GMTIME_R |
pTm = gmtime_r(&t, &sNow); |
#else |
sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); |
@@ -1113,14 +1122,14 @@ static void currentTimeFunc( |
void sqlite3RegisterDateTimeFunctions(void){ |
static SQLITE_WSD FuncDef aDateTimeFuncs[] = { |
#ifndef SQLITE_OMIT_DATETIME_FUNCS |
- FUNCTION(julianday, -1, 0, 0, juliandayFunc ), |
- FUNCTION(date, -1, 0, 0, dateFunc ), |
- FUNCTION(time, -1, 0, 0, timeFunc ), |
- FUNCTION(datetime, -1, 0, 0, datetimeFunc ), |
- FUNCTION(strftime, -1, 0, 0, strftimeFunc ), |
- FUNCTION(current_time, 0, 0, 0, ctimeFunc ), |
- FUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc), |
- FUNCTION(current_date, 0, 0, 0, cdateFunc ), |
+ DFUNCTION(julianday, -1, 0, 0, juliandayFunc ), |
+ DFUNCTION(date, -1, 0, 0, dateFunc ), |
+ DFUNCTION(time, -1, 0, 0, timeFunc ), |
+ DFUNCTION(datetime, -1, 0, 0, datetimeFunc ), |
+ DFUNCTION(strftime, -1, 0, 0, strftimeFunc ), |
+ DFUNCTION(current_time, 0, 0, 0, ctimeFunc ), |
+ DFUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc), |
+ DFUNCTION(current_date, 0, 0, 0, cdateFunc ), |
#else |
STR_FUNCTION(current_time, 0, "%H:%M:%S", 0, currentTimeFunc), |
STR_FUNCTION(current_date, 0, "%Y-%m-%d", 0, currentTimeFunc), |