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 0429a64144685914f83fca1a75ccdae6d8908afd..b81049aa6531de3158c3f6656024b36011f419c4 100644 |
--- a/third_party/sqlite/src/src/date.c |
+++ b/third_party/sqlite/src/src/date.c |
@@ -16,8 +16,6 @@ |
** sqlite3RegisterDateTimeFunctions() found at the bottom of the file. |
** All other code has file scope. |
** |
-** $Id: date.c,v 1.107 2009/05/03 20:23:53 drh Exp $ |
-** |
** 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 |
@@ -136,12 +134,6 @@ end_getDigits: |
} |
/* |
-** Read text from z[] and convert into a floating point number. Return |
-** the number of digits converted. |
-*/ |
-#define getValue sqlite3AtoF |
- |
-/* |
** Parse a timezone extension on the end of a date-time. |
** The extension is of the form: |
** |
@@ -316,10 +308,8 @@ static int parseYyyyMmDd(const char *zDate, DateTime *p){ |
** Set the time to the current time reported by the VFS |
*/ |
static void setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ |
- double r; |
sqlite3 *db = sqlite3_context_db_handle(context); |
- sqlite3OsCurrentTime(db->pVfs, &r); |
- p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); |
+ sqlite3OsCurrentTimeInt64(db->pVfs, &p->iJD); |
p->validJD = 1; |
} |
@@ -344,7 +334,7 @@ static int parseDateOrTime( |
const char *zDate, |
DateTime *p |
){ |
- int isRealNum; /* Return from sqlite3IsNumber(). Not used */ |
+ double r; |
if( parseYyyyMmDd(zDate,p)==0 ){ |
return 0; |
}else if( parseHhMmSs(zDate, p)==0 ){ |
@@ -352,9 +342,7 @@ static int parseDateOrTime( |
}else if( sqlite3StrICmp(zDate,"now")==0){ |
setDateTimeToCurrent(context, p); |
return 0; |
- }else if( sqlite3IsNumber(zDate, &isRealNum, SQLITE_UTF8) ){ |
- double r; |
- getValue(zDate, &r); |
+ }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){ |
p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); |
p->validJD = 1; |
return 0; |
@@ -460,7 +448,7 @@ static sqlite3_int64 localtimeOffset(DateTime *p){ |
y.m = sLocal.tm_min; |
y.s = sLocal.tm_sec; |
} |
-#elif defined(HAVE_LOCALTIME_S) |
+#elif defined(HAVE_LOCALTIME_S) && HAVE_LOCALTIME_S |
{ |
struct tm sLocal; |
localtime_s(&sLocal, &t); |
@@ -575,8 +563,9 @@ static int parseModifier(const char *zMod, DateTime *p){ |
** weekday N where 0==Sunday, 1==Monday, and so forth. If the |
** date is already on the appropriate weekday, this is a no-op. |
*/ |
- if( strncmp(z, "weekday ", 8)==0 && getValue(&z[8],&r)>0 |
- && (n=(int)r)==r && n>=0 && r<7 ){ |
+ if( strncmp(z, "weekday ", 8)==0 |
+ && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8) |
+ && (n=(int)r)==r && n>=0 && r<7 ){ |
sqlite3_int64 Z; |
computeYMD_HMS(p); |
p->validTZ = 0; |
@@ -631,8 +620,11 @@ static int parseModifier(const char *zMod, DateTime *p){ |
case '8': |
case '9': { |
double rRounder; |
- n = getValue(z, &r); |
- assert( n>=1 ); |
+ for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){} |
+ if( !sqlite3AtoF(z, &r, n, SQLITE_UTF8) ){ |
+ rc = 1; |
+ break; |
+ } |
if( z[n]==':' ){ |
/* A modifier of the form (+|-)HH:MM:SS.FFF adds (or subtracts) the |
** specified number of hours, minutes, seconds, and fractional seconds |
@@ -1040,22 +1032,15 @@ static void currentTimeFunc( |
time_t t; |
char *zFormat = (char *)sqlite3_user_data(context); |
sqlite3 *db; |
- double rT; |
+ sqlite3_int64 iT; |
char zBuf[20]; |
UNUSED_PARAMETER(argc); |
UNUSED_PARAMETER(argv); |
db = sqlite3_context_db_handle(context); |
- sqlite3OsCurrentTime(db->pVfs, &rT); |
-#ifndef SQLITE_OMIT_FLOATING_POINT |
- t = 86400.0*(rT - 2440587.5) + 0.5; |
-#else |
- /* without floating point support, rT will have |
- ** already lost fractional day precision. |
- */ |
- t = 86400 * (rT - 2440587) - 43200; |
-#endif |
+ sqlite3OsCurrentTimeInt64(db->pVfs, &iT); |
+ t = iT/1000 - 10000*(sqlite3_int64)21086676; |
#ifdef HAVE_GMTIME_R |
{ |
struct tm sNow; |
@@ -1094,8 +1079,8 @@ void sqlite3RegisterDateTimeFunctions(void){ |
FUNCTION(current_date, 0, 0, 0, cdateFunc ), |
#else |
STR_FUNCTION(current_time, 0, "%H:%M:%S", 0, currentTimeFunc), |
- STR_FUNCTION(current_timestamp, 0, "%Y-%m-%d", 0, currentTimeFunc), |
- STR_FUNCTION(current_date, 0, "%Y-%m-%d %H:%M:%S", 0, currentTimeFunc), |
+ STR_FUNCTION(current_date, 0, "%Y-%m-%d", 0, currentTimeFunc), |
+ STR_FUNCTION(current_timestamp, 0, "%Y-%m-%d %H:%M:%S", 0, currentTimeFunc), |
#endif |
}; |
int i; |