mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-05 15:55:57 +03:00
Add support for the 'txn' argument to date/time functions that works like
'now' but keeps the same time for the entire transaction. FossilOrigin-Name: 5e4f45af96247e29910403a63ac148cb313b005f9c014b37a9a49d98f5fef9a6
This commit is contained in:
23
manifest
23
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\sa\stest\sscript\sproblem\scausing\s"make\stest"\sto\sfail\sfor\snon-RBU\sbuilds.
|
C Add\ssupport\sfor\sthe\s'txn'\sargument\sto\sdate/time\sfunctions\sthat\sworks\slike\n'now'\sbut\skeeps\sthe\ssame\stime\sfor\sthe\sentire\stransaction.
|
||||||
D 2023-02-07T18:41:23.632
|
D 2023-02-07T21:55:14.119
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@@ -567,7 +567,7 @@ F src/build.c c55ab6d1b089ceef57160e840f05f692955ac90944c3d04fcf01d97fd7bfd08d
|
|||||||
F src/callback.c 4cd7225b26a97f7de5fee5ae10464bed5a78f2adefe19534cc2095b3a8ca484a
|
F src/callback.c 4cd7225b26a97f7de5fee5ae10464bed5a78f2adefe19534cc2095b3a8ca484a
|
||||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||||
F src/ctime.c 20507cc0b0a6c19cd882fcd0eaeda32ae6a4229fb4b024cfdf3183043d9b703d
|
F src/ctime.c 20507cc0b0a6c19cd882fcd0eaeda32ae6a4229fb4b024cfdf3183043d9b703d
|
||||||
F src/date.c 94ce83b4cd848a387680a5f920c9018c16655db778c4d36525af0a0f34679ac5
|
F src/date.c ff2d10db98269759315c2048d3cc16cc135f7b39f394fa7442e37f9f9161892f
|
||||||
F src/dbpage.c d47549716549311f79dc39fe5c8fb19390a6eb2c960f8e37c89a9c4de0c1052e
|
F src/dbpage.c d47549716549311f79dc39fe5c8fb19390a6eb2c960f8e37c89a9c4de0c1052e
|
||||||
F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef
|
F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef
|
||||||
F src/delete.c 86573edae75e3d3e9a8b590d87db8e47222103029df4f3e11fa56044459b514e
|
F src/delete.c 86573edae75e3d3e9a8b590d87db8e47222103029df4f3e11fa56044459b514e
|
||||||
@@ -626,7 +626,7 @@ F src/shell.c.in 250817509dbf12e258e334fdcd87901e35a6b63dc285885fec5f577ebb67b49
|
|||||||
F src/sqlite.h.in e26116b4dba94903c78db0f3281493435cf70ee049e2e8270b1013fad740fdb1
|
F src/sqlite.h.in e26116b4dba94903c78db0f3281493435cf70ee049e2e8270b1013fad740fdb1
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4
|
F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4
|
||||||
F src/sqliteInt.h 43eeee1ea80543a0e40444bf53643ca259a2b1158ccfe859a6a6435b7358ecdd
|
F src/sqliteInt.h 459e7dc3936c3f3321d588f9e74c1298526c29dced7e3b9c0b63de5a5e5ecdcc
|
||||||
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
|
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
|
||||||
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
|
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
|
||||||
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
||||||
@@ -694,8 +694,8 @@ F src/vacuum.c 84ce7f01f8a7a08748e107a441db83bcec13970190ddcb0c9ff522adbc1c23fd
|
|||||||
F src/vdbe.c 47d3b78e75e239e1909933f0d77612b4111ebe760f01fdd0085e4e30b59b4cc6
|
F src/vdbe.c 47d3b78e75e239e1909933f0d77612b4111ebe760f01fdd0085e4e30b59b4cc6
|
||||||
F src/vdbe.h 73b904a6b3bb27f308c6cc287a5751ebc7f1f89456be0ed068a12b92844c6e8c
|
F src/vdbe.h 73b904a6b3bb27f308c6cc287a5751ebc7f1f89456be0ed068a12b92844c6e8c
|
||||||
F src/vdbeInt.h a4147a4ddf613cb1bcb555ace9e9e74a9c099d65facd88155f191b1fb4d74cfb
|
F src/vdbeInt.h a4147a4ddf613cb1bcb555ace9e9e74a9c099d65facd88155f191b1fb4d74cfb
|
||||||
F src/vdbeapi.c 40c47b1528d308a322203de21d2e0d711753257ed9771771b6129214b1d65932
|
F src/vdbeapi.c 0760fbeea76491a4c5b79ff0ec212915e7fe27c60ba319ef232ec25403ef4493
|
||||||
F src/vdbeaux.c 3f9e3b6585e7434aa11300169dd66ddf0fc963a0c6f7940bdc058335dadeb353
|
F src/vdbeaux.c 9f2a2ec80ff90266ab603065c32dd3c8b0a53023ab7210a03fccf324ad6ddbce
|
||||||
F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd
|
F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd
|
||||||
F src/vdbemem.c 87d3811aabb68eb9210c14c9a8b5e8ec3acb7ba787beb80a4323af54fb6013f7
|
F src/vdbemem.c 87d3811aabb68eb9210c14c9a8b5e8ec3acb7ba787beb80a4323af54fb6013f7
|
||||||
F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35
|
F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35
|
||||||
@@ -2045,8 +2045,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P a95dbfae6133cc7aac950c3e7ba55a29d80b1625c39479a7d1d10b0868ee2be4
|
P 2abc3f9de0d2b66342598ab9015e62568ed20c7da4744a0f0a76b1db72c7e941
|
||||||
R eadbc6d63430234ac2cb17610c353b99
|
R c0a88244db992b40f65ce347d314e978
|
||||||
U dan
|
T *branch * txn-date
|
||||||
Z b7b3585268bb0984169cdf414e4a24fd
|
T *sym-txn-date *
|
||||||
|
T -sym-trunk *
|
||||||
|
U drh
|
||||||
|
Z 947981482da05fefcea564acb307123a
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@@ -1 +1 @@
|
|||||||
2abc3f9de0d2b66342598ab9015e62568ed20c7da4744a0f0a76b1db72c7e941
|
5e4f45af96247e29910403a63ac148cb313b005f9c014b37a9a49d98f5fef9a6
|
29
src/date.c
29
src/date.c
@@ -331,11 +331,13 @@ static int parseYyyyMmDd(const char *zDate, DateTime *p){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Set the time to the current time reported by the VFS.
|
** Set the time to the current time reported for the prepared statement
|
||||||
|
** that is currently executing. The same time is reported for all
|
||||||
|
** invocations of this routine from within the same call to sqlite3_step().
|
||||||
**
|
**
|
||||||
** Return the number of errors.
|
** Return the number of errors.
|
||||||
*/
|
*/
|
||||||
static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
|
static int setCurrentStmtTime(sqlite3_context *context, DateTime *p){
|
||||||
p->iJD = sqlite3StmtCurrentTime(context);
|
p->iJD = sqlite3StmtCurrentTime(context);
|
||||||
if( p->iJD>0 ){
|
if( p->iJD>0 ){
|
||||||
p->validJD = 1;
|
p->validJD = 1;
|
||||||
@@ -345,6 +347,23 @@ static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Set the time to the current time reported for the current transaction.
|
||||||
|
** The same time is set for all calls to this routine within the same
|
||||||
|
** transaction.
|
||||||
|
**
|
||||||
|
** Return the number of errors.
|
||||||
|
*/
|
||||||
|
static int setCurrentTxnTime(sqlite3_context *context, DateTime *p){
|
||||||
|
p->iJD = sqlite3TxnCurrentTime(context);
|
||||||
|
if( p->iJD>0 ){
|
||||||
|
p->validJD = 1;
|
||||||
|
return 0;
|
||||||
|
}else{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Input "r" is a numeric quantity which might be a julian day number,
|
** Input "r" is a numeric quantity which might be a julian day number,
|
||||||
** or the number of seconds since 1970. If the value if r is within
|
** or the number of seconds since 1970. If the value if r is within
|
||||||
@@ -387,7 +406,9 @@ static int parseDateOrTime(
|
|||||||
}else if( parseHhMmSs(zDate, p)==0 ){
|
}else if( parseHhMmSs(zDate, p)==0 ){
|
||||||
return 0;
|
return 0;
|
||||||
}else if( sqlite3StrICmp(zDate,"now")==0 && sqlite3NotPureFunc(context) ){
|
}else if( sqlite3StrICmp(zDate,"now")==0 && sqlite3NotPureFunc(context) ){
|
||||||
return setDateTimeToCurrent(context, p);
|
return setCurrentStmtTime(context, p);
|
||||||
|
}else if( sqlite3StrICmp(zDate,"txn")==0 && sqlite3NotPureFunc(context) ){
|
||||||
|
return setCurrentTxnTime(context, p);
|
||||||
}else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8)>0 ){
|
}else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8)>0 ){
|
||||||
setRawDateNumber(p, r);
|
setRawDateNumber(p, r);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -946,7 +967,7 @@ static int isDate(
|
|||||||
memset(p, 0, sizeof(*p));
|
memset(p, 0, sizeof(*p));
|
||||||
if( argc==0 ){
|
if( argc==0 ){
|
||||||
if( !sqlite3NotPureFunc(context) ) return 1;
|
if( !sqlite3NotPureFunc(context) ) return 1;
|
||||||
return setDateTimeToCurrent(context, p);
|
return setCurrentStmtTime(context, p);
|
||||||
}
|
}
|
||||||
if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
|
if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT
|
||||||
|| eType==SQLITE_INTEGER ){
|
|| eType==SQLITE_INTEGER ){
|
||||||
|
@@ -1621,6 +1621,7 @@ struct sqlite3 {
|
|||||||
u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */
|
u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */
|
||||||
u8 eOpenState; /* Current condition of the connection */
|
u8 eOpenState; /* Current condition of the connection */
|
||||||
int nextPagesize; /* Pagesize after VACUUM if >0 */
|
int nextPagesize; /* Pagesize after VACUUM if >0 */
|
||||||
|
i64 txnTime; /* Timestamp for current transaction */
|
||||||
i64 nChange; /* Value returned by sqlite3_changes() */
|
i64 nChange; /* Value returned by sqlite3_changes() */
|
||||||
i64 nTotalChange; /* Value returned by sqlite3_total_changes() */
|
i64 nTotalChange; /* Value returned by sqlite3_total_changes() */
|
||||||
int aLimit[SQLITE_N_LIMIT]; /* Limits */
|
int aLimit[SQLITE_N_LIMIT]; /* Limits */
|
||||||
@@ -5341,6 +5342,7 @@ FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
|
|||||||
void sqlite3VtabUsesAllSchemas(sqlite3_index_info*);
|
void sqlite3VtabUsesAllSchemas(sqlite3_index_info*);
|
||||||
#endif
|
#endif
|
||||||
sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
|
sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
|
||||||
|
sqlite3_int64 sqlite3TxnCurrentTime(sqlite3_context*);
|
||||||
int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
|
int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
|
||||||
int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
|
int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
|
||||||
void sqlite3ParseObjectInit(Parse*,sqlite3*);
|
void sqlite3ParseObjectInit(Parse*,sqlite3*);
|
||||||
|
@@ -987,6 +987,29 @@ sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){
|
|||||||
return *piTime;
|
return *piTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Return the current time for a transaction. If the current time
|
||||||
|
** is requested more than once within the same transaction
|
||||||
|
** the same time is returned for each invocation regardless
|
||||||
|
** of the amount of time that elapses between invocations. In other words,
|
||||||
|
** the time returned is always the time of the first call.
|
||||||
|
*/
|
||||||
|
sqlite3_int64 sqlite3TxnCurrentTime(sqlite3_context *p){
|
||||||
|
int rc;
|
||||||
|
#ifndef SQLITE_ENABLE_STAT4
|
||||||
|
sqlite3_int64 *piTime = &p->pVdbe->db->txnTime;
|
||||||
|
assert( p->pVdbe!=0 );
|
||||||
|
#else
|
||||||
|
sqlite3_int64 iTime = 0;
|
||||||
|
sqlite3_int64 *piTime = p->pVdbe!=0 ? &p->pVdbe->db->txnTime : &iTime;
|
||||||
|
#endif
|
||||||
|
if( *piTime==0 ){
|
||||||
|
rc = sqlite3OsCurrentTimeInt64(p->pOut->db->pVfs, piTime);
|
||||||
|
if( rc ) *piTime = 0;
|
||||||
|
}
|
||||||
|
return *piTime;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Create a new aggregate context for p and return a pointer to
|
** Create a new aggregate context for p and return a pointer to
|
||||||
** its pMem->z element.
|
** its pMem->z element.
|
||||||
|
@@ -3394,6 +3394,7 @@ int sqlite3VdbeHalt(Vdbe *p){
|
|||||||
*/
|
*/
|
||||||
if( db->autoCommit ){
|
if( db->autoCommit ){
|
||||||
sqlite3ConnectionUnlocked(db);
|
sqlite3ConnectionUnlocked(db);
|
||||||
|
db->txnTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert( db->nVdbeActive>0 || db->autoCommit==0 || db->nStatement==0 );
|
assert( db->nVdbeActive>0 || db->autoCommit==0 || db->nStatement==0 );
|
||||||
|
Reference in New Issue
Block a user