in sources/linetester/linetest.c [381:509]
CQL_WARN_UNUSED cql_code compare_lines(sqlite3 *_Nonnull _db_, cql_int32 *_Nonnull procs, cql_int32 *_Nonnull compares, cql_int32 *_Nonnull errors) {
cql_contract_argument_notnull((void *)procs, 1);
cql_contract_argument_notnull((void *)compares, 2);
cql_contract_argument_notnull((void *)errors, 3);
cql_code _rc_ = SQLITE_OK;
sqlite3_stmt *p_stmt = NULL;
compare_lines_p_row p = { ._refs_count_ = 1, ._refs_offset_ = compare_lines_p_refs_offset };
sqlite3_stmt *actual_stmt = NULL;
compare_lines_actual_row actual = { ._refs_count_ = 3, ._refs_offset_ = compare_lines_actual_refs_offset };
sqlite3_stmt *expected_stmt = NULL;
compare_lines_expected_row expected = { ._refs_count_ = 3, ._refs_offset_ = compare_lines_expected_refs_offset };
*procs = 0; // set out arg to non-garbage
*compares = 0; // set out arg to non-garbage
*errors = 0; // set out arg to non-garbage
_rc_ = cql_prepare(_db_, &p_stmt,
"SELECT procname "
"FROM procs");
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
for (;;) {
_rc_ = sqlite3_step(p_stmt);
p._has_row_ = _rc_ == SQLITE_ROW;
cql_multifetch(_rc_, p_stmt, 1,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &p.procname);
if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
if (!p._has_row_) break;
*procs = (*procs) + 1;
cql_finalize_stmt(&actual_stmt);
_rc_ = cql_prepare(_db_, &actual_stmt,
"SELECT source, procname, line, data, physical_line "
"FROM linedata "
"WHERE source = 'act' AND procname = ?");
cql_multibind(&_rc_, _db_, &actual_stmt, 1,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, p.procname);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
cql_finalize_stmt(&expected_stmt);
_rc_ = cql_prepare(_db_, &expected_stmt,
"SELECT source, procname, line, data, physical_line "
"FROM linedata "
"WHERE source = 'exp' AND procname = ?");
cql_multibind(&_rc_, _db_, &expected_stmt, 1,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, p.procname);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = sqlite3_step(actual_stmt);
actual._has_row_ = _rc_ == SQLITE_ROW;
cql_multifetch(_rc_, actual_stmt, 5,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.source,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.procname,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &actual.line,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.data,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &actual.physical_line);
if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
_rc_ = sqlite3_step(expected_stmt);
expected._has_row_ = _rc_ == SQLITE_ROW;
cql_multifetch(_rc_, expected_stmt, 5,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.source,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.procname,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &expected.line,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.data,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &expected.physical_line);
if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
for (;;) {
if (!(actual._has_row_ && expected._has_row_)) break;
*compares = (*compares) + 1;
if (actual.line != expected.line || cql_string_compare(actual.data, expected.data) != 0) {
_rc_ = dump(_db_, p.procname);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
printf("\nFirst difference:\n");
cql_alloc_cstr(_cstr_6, expected.data);
printf("expected: %5d %s\n", expected.line, _cstr_6);
cql_free_cstr(_cstr_6, expected.data);
cql_alloc_cstr(_cstr_7, actual.data);
printf(" actual: %5d %s\n", actual.line, _cstr_7);
cql_free_cstr(_cstr_7, actual.data);
printf("\nDifferences at:\n line %d in expected\n line %d in actual", expected.physical_line, actual.physical_line);
printf("\n");
*errors = (*errors) + 1;
break;
}
_rc_ = sqlite3_step(actual_stmt);
actual._has_row_ = _rc_ == SQLITE_ROW;
cql_multifetch(_rc_, actual_stmt, 5,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.source,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.procname,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &actual.line,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &actual.data,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &actual.physical_line);
if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
_rc_ = sqlite3_step(expected_stmt);
expected._has_row_ = _rc_ == SQLITE_ROW;
cql_multifetch(_rc_, expected_stmt, 5,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.source,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.procname,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &expected.line,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &expected.data,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &expected.physical_line);
if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
}
if (actual._has_row_ != expected._has_row_) {
if (! actual._has_row_) {
_rc_ = dump(_db_, p.procname);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
printf("\nRan out of lines in actual:\n");
printf("\nDifferences at:\n line %d in expected\n", expected.physical_line);
printf("\n");
*errors = (*errors) + 1;
}
if (! expected._has_row_) {
_rc_ = dump(_db_, p.procname);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
printf("\nRan out of lines in expected:\n");
printf("\nDifferences at:\n line %d in actual\n", actual.physical_line);
printf("\n");
*errors = (*errors) + 1;
}
}
}
_rc_ = SQLITE_OK;
cql_cleanup:
cql_finalize_stmt(&p_stmt);
cql_teardown_row(p);
cql_finalize_stmt(&actual_stmt);
cql_teardown_row(actual);
cql_finalize_stmt(&expected_stmt);
cql_teardown_row(expected);
return _rc_;
}