| Index: third_party/sqlite/sqlite-src-3100200/src/date.c
|
| diff --git a/third_party/sqlite/sqlite-src-3080704/src/date.c b/third_party/sqlite/sqlite-src-3100200/src/date.c
|
| similarity index 95%
|
| copy from third_party/sqlite/sqlite-src-3080704/src/date.c
|
| copy to third_party/sqlite/sqlite-src-3100200/src/date.c
|
| index 11b04ea004b611457422108af8d83360be9d80ae..3d7604ab45380a6ca1282464cd338b3e301f7000 100644
|
| --- a/third_party/sqlite/sqlite-src-3080704/src/date.c
|
| +++ b/third_party/sqlite/sqlite-src-3100200/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),
|
|
|