Skip to content

Commit 8cea0c0

Browse files
committed
Port logic improvements: date calculation, DSQL validation, and sort merge logic
1 parent 6ab0c22 commit 8cea0c0

File tree

2 files changed

+44
-60
lines changed

2 files changed

+44
-60
lines changed

src/common/classes/NoThrowTimeStamp.cpp

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const ISC_TIME NoThrowTimeStamp::POW_10_TABLE[] =
5252
NoThrowTimeStamp NoThrowTimeStamp::getCurrentTimeStamp(const char** error) noexcept
5353
{
5454
if (error)
55-
*error = NULL;
55+
*error = nullptr;
5656
NoThrowTimeStamp result;
5757

5858
// NS: We round generated timestamps to whole millisecond.
@@ -341,51 +341,36 @@ int NoThrowTimeStamp::convertGregorianDateToWeekDate(const struct tm& times) noe
341341
{
342342
// Algorithm for Converting Gregorian Dates to ISO 8601 Week Date by Rick McCarty, 1999
343343
// http://personal.ecu.edu/mccartyr/ISOwdALG.txt
344-
345344
const int y = times.tm_year + 1900;
346-
const int dayOfYearNumber = times.tm_yday + 1;
345+
const int dayOfYear = times.tm_yday + 1;
347346

348347
// Find the jan1Weekday for y (Monday=1, Sunday=7)
349-
const int yy = (y - 1) % 100;
350-
const int c = (y - 1) - yy;
351-
const int g = yy + yy / 4;
348+
const int y_1 = y - 1;
349+
const int yy = y_1 % 100;
350+
const int c = y_1 - yy;
351+
const int g = yy + (yy / 4);
352352
const int jan1Weekday = 1 + (((((c / 100) % 4) * 5) + g) % 7);
353353

354-
// Find the weekday for y m d
355-
const int h = dayOfYearNumber + (jan1Weekday - 1);
356-
const int weekday = 1 + ((h - 1) % 7);
354+
const int weekday = 1 + ((dayOfYear + jan1Weekday - 2) % 7);
357355

358356
// Find if y m d falls in yearNumber y-1, weekNumber 52 or 53
359-
int yearNumber, weekNumber;
360-
361-
if ((dayOfYearNumber <= (8 - jan1Weekday)) && (jan1Weekday > 4))
357+
if ((dayOfYear <= (8 - jan1Weekday)) & (jan1Weekday > 4))
362358
{
363-
yearNumber = y - 1;
364-
weekNumber = ((jan1Weekday == 5) || ((jan1Weekday == 6) &&
365-
isLeapYear(yearNumber))) ? 53 : 52;
359+
const int prevYearLeap = (!(y_1 % 4) && ((y_1 % 100) || !(y_1 % 400)));
360+
const int is53 = (jan1Weekday == 5) | ((jan1Weekday == 6) & prevYearLeap);
361+
return 52 + is53;
366362
}
367-
else
368-
{
369-
yearNumber = y;
370363

371-
// Find if y m d falls in yearNumber y+1, weekNumber 1
372-
const int i = isLeapYear(y) ? 366 : 365;
373-
374-
if ((i - dayOfYearNumber) < (4 - weekday))
375-
{
376-
yearNumber = y + 1;
377-
weekNumber = 1;
378-
}
364+
// Find if y m d falls in yearNumber y+1, weekNumber 1
365+
const int daysInYear = 365 + (!(y % 4) && ((y % 100) || !(y % 400)));
366+
if ((daysInYear - dayOfYear) < (4 - weekday))
367+
{
368+
return 1;
379369
}
380370

381371
// Find if y m d falls in yearNumber y, weekNumber 1 through 53
382-
if (yearNumber == y)
383-
{
384-
const int j = dayOfYearNumber + (7 - weekday) + (jan1Weekday - 1);
385-
weekNumber = j / 7;
386-
if (jan1Weekday > 4)
387-
weekNumber--;
388-
}
372+
const int j = dayOfYear + (7 - weekday) + (jan1Weekday - 1);
373+
const int weekNumber = (j / 7) - (jan1Weekday > 4); // Subtract 1 if jan1Weekday > 4
389374

390375
return weekNumber;
391376
}

src/jrd/sort.cpp

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,6 @@ void Sort::sort(thread_db* tdbb)
417417
**************************************/
418418
run_control* run;
419419
merge_control* merge;
420-
merge_control* merge_pool;
421420

422421
try
423422
{
@@ -488,15 +487,8 @@ void Sort::sort(thread_db* tdbb)
488487
{
489488
fb_assert(!m_merge_pool); // shouldn't have a pool
490489
m_merge_pool = FB_NEW_POOL(m_owner->getPool()) merge_control[count - 1];
491-
merge_pool = m_merge_pool;
490+
merge_control* merge_pool = m_merge_pool;
492491
memset(merge_pool, 0, (count - 1) * sizeof(merge_control));
493-
}
494-
else
495-
{
496-
// Merge of 1 or 0 runs doesn't make sense
497-
fb_assert(false); // We really shouldn't get here
498-
merge = (merge_control*) *streams; // But if we do...
499-
}
500492

501493
// Each pass through the vector builds a level of the merge tree
502494
// by condensing two runs into one.
@@ -528,16 +520,23 @@ void Sort::sort(thread_db* tdbb)
528520
(*m1)->rmh_parent = merge;
529521
merge->mrg_stream_b = *m1++;
530522

531-
merge->mrg_record_a = NULL;
532-
merge->mrg_record_b = NULL;
523+
merge->mrg_record_a = nullptr;
524+
merge->mrg_record_b = nullptr;
533525

534526
*m2++ = (run_merge_hdr*) merge;
535527
count -= 2;
536528
}
537529

538530
if (count)
539-
*m2++ = *m1++;
540-
count = m2 - streams;
531+
*m2++ = *m1++;
532+
count = m2 - streams;
533+
}
534+
}
535+
else
536+
{
537+
// Merge of 1 or 0 runs doesn't make sense
538+
fb_assert(false); // We really shouldn't get here
539+
merge = (merge_control*) *streams; // But if we do...
541540
}
542541

543542
streams.reset();
@@ -1272,7 +1271,7 @@ sort_record* Sort::getMerge(merge_control* merge)
12721271
}
12731272
else if ( (record = merge->mrg_record_a) )
12741273
{
1275-
merge->mrg_record_a = NULL;
1274+
merge->mrg_record_a = nullptr;
12761275
merge = merge->mrg_header.rmh_parent;
12771276
}
12781277
else
@@ -1287,7 +1286,7 @@ sort_record* Sort::getMerge(merge_control* merge)
12871286
if (!merge->mrg_record_a)
12881287
{
12891288
record = merge->mrg_record_b;
1290-
merge->mrg_record_b = NULL;
1289+
merge->mrg_record_b = nullptr;
12911290
merge = merge->mrg_header.rmh_parent;
12921291
continue;
12931292
}
@@ -1311,7 +1310,7 @@ sort_record* Sort::getMerge(merge_control* merge)
13111310
(const UCHAR*) merge->mrg_record_b,
13121311
m_dup_callback_arg))
13131312
{
1314-
merge->mrg_record_a = NULL;
1313+
merge->mrg_record_a = nullptr;
13151314
diddleKey((UCHAR*) merge->mrg_record_b, true, true);
13161315
continue;
13171316
}
@@ -1330,12 +1329,12 @@ sort_record* Sort::getMerge(merge_control* merge)
13301329
if (p[-1] < q[-1])
13311330
{
13321331
record = merge->mrg_record_a;
1333-
merge->mrg_record_a = NULL;
1332+
merge->mrg_record_a = nullptr;
13341333
}
13351334
else
13361335
{
13371336
record = merge->mrg_record_b;
1338-
merge->mrg_record_b = NULL;
1337+
merge->mrg_record_b = nullptr;
13391338
}
13401339

13411340
merge = merge->mrg_header.rmh_parent;
@@ -1619,8 +1618,8 @@ void Sort::mergeRuns(USHORT n)
16191618
(*m1)->rmh_parent = merge;
16201619
merge->mrg_stream_b = *m1++;
16211620

1622-
merge->mrg_record_a = NULL;
1623-
merge->mrg_record_b = NULL;
1621+
merge->mrg_record_a = nullptr;
1622+
merge->mrg_record_b = nullptr;
16241623
*m2++ = (run_merge_hdr*) merge;
16251624
merge++;
16261625
count -= 2;
@@ -2267,8 +2266,8 @@ void PartitionedSort::buildMergeTree()
22672266
(*m1)->rmh_parent = m_merge;
22682267
m_merge->mrg_stream_b = *m1++;
22692268

2270-
m_merge->mrg_record_a = NULL;
2271-
m_merge->mrg_record_b = NULL;
2269+
m_merge->mrg_record_a = nullptr;
2270+
m_merge->mrg_record_b = nullptr;
22722271

22732272
*m2++ = (run_merge_hdr*)m_merge;
22742273
count -= 2;
@@ -2366,7 +2365,7 @@ sort_record* PartitionedSort::getMerge()
23662365
}
23672366
else if ((record = merge->mrg_record_a))
23682367
{
2369-
merge->mrg_record_a = NULL;
2368+
merge->mrg_record_a = nullptr;
23702369
merge = merge->mrg_header.rmh_parent;
23712370
}
23722371
else
@@ -2381,7 +2380,7 @@ sort_record* PartitionedSort::getMerge()
23812380
if (!merge->mrg_record_a)
23822381
{
23832382
record = merge->mrg_record_b;
2384-
merge->mrg_record_b = NULL;
2383+
merge->mrg_record_b = nullptr;
23852384
merge = merge->mrg_header.rmh_parent;
23862385
continue;
23872386
}
@@ -2408,7 +2407,7 @@ sort_record* PartitionedSort::getMerge()
24082407
(const UCHAR*)merge->mrg_record_b,
24092408
aSort->m_dup_callback_arg))
24102409
{
2411-
merge->mrg_record_a = NULL;
2410+
merge->mrg_record_a = nullptr;
24122411
aSort->diddleKey(rec_b, true, true);
24132412
continue;
24142413
}
@@ -2426,12 +2425,12 @@ sort_record* PartitionedSort::getMerge()
24262425
if (p[-1] < q[-1])
24272426
{
24282427
record = merge->mrg_record_a;
2429-
merge->mrg_record_a = NULL;
2428+
merge->mrg_record_a = nullptr;
24302429
}
24312430
else
24322431
{
24332432
record = merge->mrg_record_b;
2434-
merge->mrg_record_b = NULL;
2433+
merge->mrg_record_b = nullptr;
24352434
}
24362435

24372436
merge = merge->mrg_header.rmh_parent;

0 commit comments

Comments
 (0)