1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00

Fixes to the handling of time 24:00:00.

[forum:/info/2026-10-15T10:26:06Z|Forum post 2026-10-15T10:26:06Z]

FossilOrigin-Name: 69071e25cad52b7fe15749f5fb969e847f9cd65e66341e8d1d4e5f5282283cd4
This commit is contained in:
drh
2026-10-15 13:19:18 +00:00
parent 23500fbf19
commit 1bf6883244
4 changed files with 47 additions and 27 deletions

View File

@@ -1,5 +1,5 @@
C Ensure\sthe\sinternal\sDBFLAG_SchemaKnownOk\sflag\sis\salways\scleared\safter\sa\sdatabase\sschema\sis\sreset.\sReport\s[bugs:/info/2026-10-14T01:25:35Z\s|\s2026-10-14T01:25:35Z].
D 2026-10-14T13:39:28.937
C Fixes\sto\sthe\shandling\sof\stime\s24:00:00.\n[forum:/info/2026-10-15T10:26:06Z|Forum\spost\s2026-10-15T10:26:06Z]
D 2026-10-15T13:19:18.320
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -749,7 +749,7 @@ F src/build.c 1406d252bc5b2c3f2150edd4426e5981eabf1000944be8db8d470b96eb64ee07
F src/callback.c 3605bbf02bd7ed46c79cd48346db4a32fc51d67624400539c0532f4eead804ad
F src/carray.c 22879bbd9e14fc4868f223b0d49bcdbbda4616c89f1519ec6a5e64b98a4137b1
F src/complete.c f68f545b9c6c19e2e848672dc0e4da230072fedc335d8980b55242cc4cfa60da
F src/date.c 080641f59097d14fc7341f8bc0458d273b3a62d8381916db8ccbc89c2aae07b3
F src/date.c 7719f64947e718a38897af459259eeac1aeda7daf7b87860c4d37fc687101004
F src/dbpage.c ec8590c5e7a564cef28ca3c6156521316a4d26cb572a34841b0bcb26b67b3f97
F src/dbstat.c 34d4e825fbf763640ce3dbc56910ab080495ef4a6efb48b2b1852a43d43763fc
F src/delete.c 59eeca3fb88c29329afc41bb803ee568b120d9dd7470b5f38ab55cc38390b451
@@ -1105,7 +1105,7 @@ F test/ctime.test 340f362f41f92972bbd71f44e10569a5cc694062b692231bd08aa6fe6c1c47
F test/cursorhint.test d8b93ac48dfdb2cf4284142710d63e860b6497afff2e9c525daf752a229e5b97
F test/cursorhint2.test a10f29c0c52d4d73c19cf639f3c33cccbf5024bcf950fa48f2a8cdc14628b985
F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8
F test/date.test d345d7905b6a212ced06efd6c236da0745f0f488e8d46df83940956b573adbc0
F test/date.test e71d1c3640a6d1a59a8ea94b52dbe934ecaaeecd9e9db73ee1d10d27a5a6aece
F test/date2.test 7e12ec14aaf4d5e6294b4ba140445b0eca06ea50062a9c3a69c4ee13d0b6f8b1
F test/date3.test a1b77abf05c6772fe5ca2337cac1398892f2a41e62bce7e6be0f4a08a0e64ae5
F test/date4.test b5ad22baf7394e008ac59383840159daedd45be31dcf74a3b2450ec0e28955ce
@@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
P fc7b959f45a55d95c9cb37692e82b811e3ef286a6d826895dfee9a1f2abfdcc8
R 3e0f9f85495f0b0cb6ba9c6c348ac543
U dan
Z 6a44fc1abd844289e15d27bf9a9407c2
P e6b9a40732900d0b7f83ec262ddc81bb47d4230de55d6db319689906e2bb3716
R b8a73cb130d23c225b60c490bb456e7a
U drh
Z 2989edde742f2e190039e362d9cc3229
# Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
e6b9a40732900d0b7f83ec262ddc81bb47d4230de55d6db319689906e2bb3716
69071e25cad52b7fe15749f5fb969e847f9cd65e66341e8d1d4e5f5282283cd4

View File

@@ -302,6 +302,21 @@ static void computeJD(DateTime *p){
}
}
/*
** Return the number of dates in a specific month.
*/
static int daysOfMonth(int Y, int M){
if( (1<<M) & 0x15aa ){
return 31;
}else if( M!=2 ){
return 30;
}else if( Y%4==0 && (Y%100!=0 || Y%400==0) ){
return 29;
}else{
return 28;
}
}
/*
** Given the YYYY-MM-DD information current in p, determine if there
** is day-of-month overflow and set nFloor to the number of days that
@@ -309,24 +324,12 @@ static void computeJD(DateTime *p){
** date back to the end of the month.
*/
static void computeFloor(DateTime *p){
int mxD; /* Maximum day number for the current month */
assert( p->validYMD || p->isError );
assert( p->D>=0 && p->D<=31 );
assert( p->D>=0 && p->D<=32 );
assert( p->M>=0 && p->M<=12 );
if( p->validHMS && p->h==24 ){
p->h = 0;
p->D++;
}
if( p->D<=28 ){
p->nFloor = 0;
}else if( (1<<p->M) & 0x15aa ){
p->nFloor = 0;
}else if( p->M!=2 ){
p->nFloor = (p->D==31);
}else if( p->Y%4!=0 || (p->Y%100==0 && p->Y%400!=0) ){
p->nFloor = p->D - 28;
}else{
p->nFloor = p->D - 29;
}
mxD = daysOfMonth(p->Y, p->M);
p->nFloor = p->D>mxD ? p->D - mxD : 0;
}
/*
@@ -356,7 +359,19 @@ static int parseYyyyMmDd(const char *zDate, DateTime *p){
zDate += 10;
while( sqlite3Isspace(*zDate) || 'T'==*(u8*)zDate ){ zDate++; }
if( parseHhMmSs(zDate, p)==0 ){
/* We got the time */
if( p->h==24 ){
int mxD = daysOfMonth(Y,M);
p->h = 0;
D++;
if( D>mxD ){
D -= mxD;
M++;
if( M>12 ){
M = 1;
Y++;
}
}
}
}else if( *zDate==0 ){
p->validHMS = 0;
}else{

View File

@@ -760,6 +760,11 @@ datetest 23.13 {strftime('%d/%w/%U/%W','2000-01-01 24:00:00')} {02/0/01/00}
datetest 23.14 {datetime('24:01')} {NULL}
datetest 23.15 {datetime('24:00:01')} {NULL}
datetest 23.16 {datetime('24:00:00.001')} {NULL}
datetest 23.17 {datetime('2024-01-31 24:00:00')} {2024-02-01 00:00:00}
datetest 23.18 {datetime('2024-02-28 24:00:00')} {2024-02-29 00:00:00}
datetest 23.19 {datetime('2024-02-29 24:00:00')} {2024-03-01 00:00:00}
datetest 23.20 {datetime('2025-02-28 24:00:00')} {2025-03-01 00:00:00}
datetest 23.21 {datetime('2024-04-30 24:00:00')} {2024-05-01 00:00:00}
datetest 23.22 {datetime('2024-12-31 24:00:00')} {2025-01-01 00:00:00}
finish_test