Skip to content

Commit 08812a0

Browse files
TreeHunter9Artyom Ivanov
andauthored
fix(cast-format): Throw exception for non-existing date (#8469)
- Also add a small unit test to verify exception throwing for non-existent date Co-authored-by: Artyom Ivanov <[email protected]>
1 parent 3751122 commit 08812a0

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

src/common/CvtFormat.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1610,7 +1610,7 @@ namespace
16101610
}
16111611
}
16121612

1613-
void validateTimeStamp(const ISC_TIMESTAMP timestamp, const EXPECT_DATETIME expectedType, const dsc* desc,
1613+
void validateTimeStamp(const ISC_TIMESTAMP timestamp, const tm& times, const EXPECT_DATETIME expectedType, const dsc* desc,
16141614
Callbacks* cb)
16151615
{
16161616
if (!NoThrowTimeStamp::isValidTimeStamp(timestamp))
@@ -1633,6 +1633,21 @@ namespace
16331633
break;
16341634
}
16351635
}
1636+
1637+
if (expectedType != expect_sql_time && expectedType != expect_sql_time_tz)
1638+
{
1639+
tm times2;
1640+
memset(&times2, 0, sizeof(decltype(times2)));
1641+
1642+
NoThrowTimeStamp::decode_date(timestamp.timestamp_date, &times2);
1643+
1644+
if (times.tm_year != times2.tm_year
1645+
|| times.tm_mon != times2.tm_mon
1646+
|| times.tm_mday != times2.tm_mday)
1647+
{
1648+
CVT_conversion_error(desc, cb->err);
1649+
}
1650+
}
16361651
}
16371652

16381653
ISC_TIMESTAMP_TZ constructTimeStampTz(const StringToDateTimeData& cvtData, Callbacks* cb)
@@ -1709,8 +1724,8 @@ ISC_TIMESTAMP_TZ CVT_format_string_to_datetime(const dsc* desc, const Firebird::
17091724
processStringToDateTimeTokens(tokens, stringUpper, cvtData, cb);
17101725

17111726
ISC_TIMESTAMP_TZ timestampTZ = constructTimeStampTz(cvtData, cb);
1727+
validateTimeStamp(timestampTZ.utc_timestamp, cvtData.times, expectedType, desc, cb);
17121728
timeStampToUtc(timestampTZ, cb->getSessionTimeZone(), expectedType, cb);
1713-
validateTimeStamp(timestampTZ.utc_timestamp, expectedType, desc, cb);
17141729

17151730
return timestampTZ;
17161731
}

src/common/tests/CvtTest.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -632,6 +632,8 @@ BOOST_AUTO_TEST_CASE(CVTStringToFormatDateTime_EXCEPTION_CHECK)
632632
testExceptionCvtStringToFormatDateTime("30", "TZM", cb);
633633

634634
testExceptionCvtStringToFormatDateTime("12 12", "HH24 HH24", cb);
635+
636+
testExceptionCvtStringToFormatDateTime("2025-02-30", "YYYY-MM-DD", cb);
635637
}
636638

637639
BOOST_AUTO_TEST_SUITE_END() // FunctionalTest

0 commit comments

Comments
 (0)