Skip to content

Commit 61e555a

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

File tree

3 files changed

+58
-76
lines changed

3 files changed

+58
-76
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/dsql/StmtNodes.cpp

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ BlockNode* BlockNode::pass2(thread_db* tdbb, CompilerScratch* csb)
521521
const StmtNode* BlockNode::execute(thread_db* tdbb, Request* request, ExeState* exeState) const
522522
{
523523
jrd_tra* transaction = request->req_transaction;
524-
SavNumber savNumber;
524+
SavNumber savNumber = 0;
525525

526526
switch (request->req_operation)
527527
{
@@ -2473,9 +2473,9 @@ void EraseNode::pass1Erase(thread_db* tdbb, CompilerScratch* csb, EraseNode* nod
24732473
// To support nested views, loop until we hit a table or a view with user-defined triggers
24742474
// (which means no update).
24752475

2476-
jrd_rel* parent = NULL;
2477-
jrd_rel* view = NULL;
2478-
StreamType parentStream;
2476+
jrd_rel* parent = nullptr;
2477+
jrd_rel* view = nullptr;
2478+
StreamType parentStream = 0;
24792479

24802480
for (;;)
24812481
{
@@ -5067,8 +5067,6 @@ void ExecBlockNode::genBlr(DsqlCompilerScratch* dsqlScratch)
50675067
// Sub routine doesn't need ports and should generate BLR as declared in its metadata.
50685068
const bool subRoutine = dsqlScratch->flags & DsqlCompilerScratch::FLAG_SUB_ROUTINE;
50695069

5070-
unsigned returnsPos;
5071-
50725070
if (!subRoutine)
50735071
{
50745072
// Now do the input parameters.
@@ -5080,8 +5078,6 @@ void ExecBlockNode::genBlr(DsqlCompilerScratch* dsqlScratch)
50805078
dsql_var::TYPE_INPUT, 0, (USHORT) (2 * i), i);
50815079
}
50825080

5083-
returnsPos = dsqlScratch->variables.getCount();
5084-
50855081
// Now do the output parameters.
50865082
for (FB_SIZE_T i = 0; i < returns.getCount(); ++i)
50875083
{
@@ -5130,7 +5126,6 @@ void ExecBlockNode::genBlr(DsqlCompilerScratch* dsqlScratch)
51305126
if (subRoutine)
51315127
{
51325128
dsqlScratch->genParameters(parameters, returns);
5133-
returnsPos = dsqlScratch->variables.getCount() - dsqlScratch->outputVariables.getCount();
51345129
}
51355130

51365131
if (parameters.hasData())
@@ -5145,6 +5140,8 @@ void ExecBlockNode::genBlr(DsqlCompilerScratch* dsqlScratch)
51455140
{
51465141
// This validation is needed only for subroutines. Standard EXECUTE BLOCK moves input
51475142
// parameters to variables and are then validated.
5143+
// Number of input parameters to validate (total variables minus output variables)
5144+
const unsigned returnsPos = dsqlScratch->variables.getCount() - dsqlScratch->outputVariables.getCount();
51485145

51495146
for (unsigned i = 0; i < returnsPos; ++i)
51505147
{
@@ -7992,9 +7989,9 @@ void ModifyNode::pass1Modify(thread_db* tdbb, CompilerScratch* csb, ModifyNode*
79927989
if (node->subMod)
79937990
return;
79947991

7995-
jrd_rel* parent = NULL;
7996-
jrd_rel* view = NULL;
7997-
StreamType parentStream, parentNewStream;
7992+
jrd_rel* parent = nullptr;
7993+
jrd_rel* view = nullptr;
7994+
StreamType parentStream = 0, parentNewStream = 0;
79987995

79997996
// To support nested views, loop until we hit a table or a view with user-defined triggers
80007997
// (which means no update).
@@ -9042,9 +9039,9 @@ bool StoreNode::pass1Store(thread_db* tdbb, CompilerScratch* csb, StoreNode* nod
90429039
return false;
90439040
}
90449041

9045-
jrd_rel* parent = NULL;
9046-
jrd_rel* view = NULL;
9047-
StreamType parentStream;
9042+
jrd_rel* parent = nullptr;
9043+
jrd_rel* view = nullptr;
9044+
StreamType parentStream = 0;
90489045

90499046
// To support nested views, loop until we hit a table or a view with user-defined triggers
90509047
// (which means no update).
@@ -12195,7 +12192,7 @@ static void validateExpressions(thread_db* tdbb, const Array<ValidateInfo>& vali
1219512192
if (!i->boolean->execute(tdbb, request) && !(request->req_flags & req_null))
1219612193
{
1219712194
// Validation error -- report result
12198-
const char* value;
12195+
const char* value = nullptr;
1219912196
VaryStr<TEMP_STR_LENGTH> temp;
1220012197

1220112198
const dsc* desc = EVL_expr(tdbb, request, i->value);
@@ -12207,6 +12204,7 @@ static void validateExpressions(thread_db* tdbb, const Array<ValidateInfo>& vali
1220712204
else if (!length)
1220812205
value = "";
1220912206
else
12207+
fb_assert(value);
1221012208
const_cast<char*>(value)[length] = 0; // safe cast - data is actually on the stack
1221112209

1221212210
string name;

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)