sources/tester/dbhelp.c (283 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "dbhelp.h"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunknown-warning-option"
#pragma clang diagnostic ignored "-Wbitwise-op-parentheses"
#pragma clang diagnostic ignored "-Wshift-op-parentheses"
#pragma clang diagnostic ignored "-Wlogical-not-parentheses"
#pragma clang diagnostic ignored "-Wlogical-op-parentheses"
#pragma clang diagnostic ignored "-Wliteral-conversion"
#pragma clang diagnostic ignored "-Wunused-but-set-variable"
extern CQL_WARN_UNUSED cql_code dbhelp_source(sqlite3 *_Nonnull _db_, sqlite3_stmt *_Nullable *_Nonnull _result_stmt);
//
// This file is auto-generated by dbhelp.sql, it is checked in just
// in case CQL is broken by a change. The Last Known Good Verifier
// can be used to verify the tests pass again, or report failures
// while things are still otherwise broken. Rebuild with 'regen.sh'
//
// Generated from dbhelp.sql:40
/*
CREATE PROC dbhelp_setup ()
BEGIN
CREATE TABLE test_output(
line INTEGER NOT NULL,
data TEXT NOT NULL
);
CREATE INDEX __idx__test_lines ON test_output (line);
CREATE TABLE source_input(
line INTEGER NOT NULL,
data TEXT NOT NULL
);
CREATE INDEX __idx__source_lines ON source_input (line);
END;
*/
#define _PROC_ "dbhelp_setup"
CQL_WARN_UNUSED cql_code dbhelp_setup(sqlite3 *_Nonnull _db_) {
cql_code _rc_ = SQLITE_OK;
_rc_ = cql_exec(_db_,
"CREATE TABLE test_output( "
"line INTEGER NOT NULL, "
"data TEXT NOT NULL "
")");
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = cql_exec(_db_,
"CREATE INDEX __idx__test_lines ON test_output (line)");
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = cql_exec(_db_,
"CREATE TABLE source_input( "
"line INTEGER NOT NULL, "
"data TEXT NOT NULL "
")");
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = cql_exec(_db_,
"CREATE INDEX __idx__source_lines ON source_input (line)");
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = SQLITE_OK;
cql_cleanup:
return _rc_;
}
#undef _PROC_
// Generated from dbhelp.sql:50
/*
CREATE PROC dbhelp_prev_line (line_ INTEGER NOT NULL, OUT prev INTEGER NOT NULL)
BEGIN
BEGIN TRY
SET prev := ( SELECT ifnull(max(line), -1)
FROM test_output
WHERE line < line_ );
END TRY;
BEGIN CATCH
SET prev := 0;
END CATCH;
END;
*/
#define _PROC_ "dbhelp_prev_line"
CQL_WARN_UNUSED cql_code dbhelp_prev_line(sqlite3 *_Nonnull _db_, cql_int32 line_, cql_int32 *_Nonnull prev) {
cql_contract_argument_notnull((void *)prev, 2);
cql_code _rc_ = SQLITE_OK;
sqlite3_stmt *_temp_stmt = NULL;
*prev = 0; // set out arg to non-garbage
// try
{
_rc_ = cql_prepare(_db_, &_temp_stmt,
"SELECT ifnull(max(line), -1) "
"FROM test_output "
"WHERE line < ?");
cql_multibind(&_rc_, _db_, &_temp_stmt, 1,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, line_);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto catch_start_1; }
_rc_ = sqlite3_step(_temp_stmt);
if (_rc_ != SQLITE_ROW) { cql_error_trace(); goto catch_start_1; }
*prev = sqlite3_column_int(_temp_stmt, 0);
cql_finalize_stmt(&_temp_stmt);
goto catch_end_1;
}
catch_start_1: {
*prev = 0;
}
catch_end_1:;
_rc_ = SQLITE_OK;
cql_finalize_stmt(&_temp_stmt);
return _rc_;
}
#undef _PROC_
// Generated from dbhelp.sql:56
/*
CREATE PROC dbhelp_add (line INTEGER NOT NULL, data TEXT NOT NULL)
BEGIN
INSERT INTO test_output(line, data) VALUES(line, data);
END;
*/
#define _PROC_ "dbhelp_add"
CQL_WARN_UNUSED cql_code dbhelp_add(sqlite3 *_Nonnull _db_, cql_int32 line, cql_string_ref _Nonnull data) {
cql_contract_argument_notnull((void *)data, 2);
cql_code _rc_ = SQLITE_OK;
sqlite3_stmt *_temp_stmt = NULL;
_rc_ = cql_prepare(_db_, &_temp_stmt,
"INSERT INTO test_output(line, data) VALUES(?, ?)");
cql_multibind(&_rc_, _db_, &_temp_stmt, 2,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, line,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, data);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = sqlite3_step(_temp_stmt);
if (_rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
cql_finalize_stmt(&_temp_stmt);
_rc_ = SQLITE_OK;
cql_cleanup:
cql_finalize_stmt(&_temp_stmt);
return _rc_;
}
#undef _PROC_
// Generated from dbhelp.sql:61
/*
CREATE PROC dbhelp_add_source (line INTEGER NOT NULL, data TEXT NOT NULL)
BEGIN
INSERT INTO source_input(line, data) VALUES(line, data);
END;
*/
#define _PROC_ "dbhelp_add_source"
CQL_WARN_UNUSED cql_code dbhelp_add_source(sqlite3 *_Nonnull _db_, cql_int32 line, cql_string_ref _Nonnull data) {
cql_contract_argument_notnull((void *)data, 2);
cql_code _rc_ = SQLITE_OK;
sqlite3_stmt *_temp_stmt = NULL;
_rc_ = cql_prepare(_db_, &_temp_stmt,
"INSERT INTO source_input(line, data) VALUES(?, ?)");
cql_multibind(&_rc_, _db_, &_temp_stmt, 2,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, line,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, data);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = sqlite3_step(_temp_stmt);
if (_rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
cql_finalize_stmt(&_temp_stmt);
_rc_ = SQLITE_OK;
cql_cleanup:
cql_finalize_stmt(&_temp_stmt);
return _rc_;
}
#undef _PROC_
// Generated from dbhelp.sql:70
/*
CREATE PROC dbhelp_dump_line (line_ INTEGER NOT NULL)
BEGIN
DECLARE C CURSOR FOR SELECT *
FROM test_output
WHERE line = line_;
LOOP FETCH C
BEGIN
CALL printf('%s', C.data);
END;
END;
*/
#define _PROC_ "dbhelp_dump_line"
typedef struct dbhelp_dump_line_C_row {
cql_bool _has_row_;
cql_uint16 _refs_count_;
cql_uint16 _refs_offset_;
cql_int32 line;
cql_string_ref _Nonnull data;
} dbhelp_dump_line_C_row;
#define dbhelp_dump_line_C_refs_offset cql_offsetof(dbhelp_dump_line_C_row, data) // count = 1
CQL_WARN_UNUSED cql_code dbhelp_dump_line(sqlite3 *_Nonnull _db_, cql_int32 line_) {
cql_code _rc_ = SQLITE_OK;
sqlite3_stmt *C_stmt = NULL;
dbhelp_dump_line_C_row C = { ._refs_count_ = 1, ._refs_offset_ = dbhelp_dump_line_C_refs_offset };
_rc_ = cql_prepare(_db_, &C_stmt,
"SELECT line, data "
"FROM test_output "
"WHERE line = ?");
cql_multibind(&_rc_, _db_, &C_stmt, 1,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, line_);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
for (;;) {
_rc_ = sqlite3_step(C_stmt);
C._has_row_ = _rc_ == SQLITE_ROW;
cql_multifetch(_rc_, C_stmt, 2,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &C.line,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &C.data);
if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
if (!C._has_row_) break;
cql_alloc_cstr(_cstr_1, C.data);
printf("%s", _cstr_1);
cql_free_cstr(_cstr_1, C.data);
}
_rc_ = SQLITE_OK;
cql_cleanup:
cql_finalize_stmt(&C_stmt);
cql_teardown_row(C);
return _rc_;
}
#undef _PROC_
// Generated from dbhelp.sql:78
/*
CREATE PROC dbhelp_find (line_ INTEGER NOT NULL, pattern TEXT NOT NULL, OUT search_line INTEGER NOT NULL, OUT found INTEGER NOT NULL)
BEGIN
SET search_line := ( SELECT line
FROM test_output
WHERE line >= line_
LIMIT 1 );
SET found := ( SELECT count(*)
FROM test_output
WHERE line = search_line AND data LIKE pattern );
END;
*/
#define _PROC_ "dbhelp_find"
CQL_WARN_UNUSED cql_code dbhelp_find(sqlite3 *_Nonnull _db_, cql_int32 line_, cql_string_ref _Nonnull pattern, cql_int32 *_Nonnull search_line, cql_int32 *_Nonnull found) {
cql_contract_argument_notnull((void *)pattern, 2);
cql_contract_argument_notnull((void *)search_line, 3);
cql_contract_argument_notnull((void *)found, 4);
cql_code _rc_ = SQLITE_OK;
sqlite3_stmt *_temp_stmt = NULL;
*search_line = 0; // set out arg to non-garbage
*found = 0; // set out arg to non-garbage
_rc_ = cql_prepare(_db_, &_temp_stmt,
"SELECT line "
"FROM test_output "
"WHERE line >= ? "
"LIMIT 1");
cql_multibind(&_rc_, _db_, &_temp_stmt, 1,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, line_);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = sqlite3_step(_temp_stmt);
if (_rc_ != SQLITE_ROW) { cql_error_trace(); goto cql_cleanup; }
*search_line = sqlite3_column_int(_temp_stmt, 0);
cql_finalize_stmt(&_temp_stmt);
_rc_ = cql_prepare(_db_, &_temp_stmt,
"SELECT count(*) "
"FROM test_output "
"WHERE line = ? AND data LIKE ?");
cql_multibind(&_rc_, _db_, &_temp_stmt, 2,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, *search_line,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, pattern);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = sqlite3_step(_temp_stmt);
if (_rc_ != SQLITE_ROW) { cql_error_trace(); goto cql_cleanup; }
*found = sqlite3_column_int(_temp_stmt, 0);
cql_finalize_stmt(&_temp_stmt);
_rc_ = SQLITE_OK;
cql_cleanup:
cql_finalize_stmt(&_temp_stmt);
return _rc_;
}
#undef _PROC_
// Generated from dbhelp.sql:87
/*
CREATE PROC dbhelp_dump_source (line1 INTEGER NOT NULL, line2 INTEGER NOT NULL)
BEGIN
DECLARE C CURSOR FOR SELECT *
FROM source_input
WHERE line > line1 AND line <= line2;
LOOP FETCH C
BEGIN
CALL printf('%s', C.data);
END;
END;
*/
#define _PROC_ "dbhelp_dump_source"
typedef struct dbhelp_dump_source_C_row {
cql_bool _has_row_;
cql_uint16 _refs_count_;
cql_uint16 _refs_offset_;
cql_int32 line;
cql_string_ref _Nonnull data;
} dbhelp_dump_source_C_row;
#define dbhelp_dump_source_C_refs_offset cql_offsetof(dbhelp_dump_source_C_row, data) // count = 1
CQL_WARN_UNUSED cql_code dbhelp_dump_source(sqlite3 *_Nonnull _db_, cql_int32 line1, cql_int32 line2) {
cql_code _rc_ = SQLITE_OK;
sqlite3_stmt *C_stmt = NULL;
dbhelp_dump_source_C_row C = { ._refs_count_ = 1, ._refs_offset_ = dbhelp_dump_source_C_refs_offset };
_rc_ = cql_prepare(_db_, &C_stmt,
"SELECT line, data "
"FROM source_input "
"WHERE line > ? AND line <= ?");
cql_multibind(&_rc_, _db_, &C_stmt, 2,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, line1,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, line2);
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
for (;;) {
_rc_ = sqlite3_step(C_stmt);
C._has_row_ = _rc_ == SQLITE_ROW;
cql_multifetch(_rc_, C_stmt, 2,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_INT32, &C.line,
CQL_DATA_TYPE_NOT_NULL | CQL_DATA_TYPE_STRING, &C.data);
if (_rc_ != SQLITE_ROW && _rc_ != SQLITE_DONE) { cql_error_trace(); goto cql_cleanup; }
if (!C._has_row_) break;
cql_alloc_cstr(_cstr_2, C.data);
printf("%s", _cstr_2);
cql_free_cstr(_cstr_2, C.data);
}
_rc_ = SQLITE_OK;
cql_cleanup:
cql_finalize_stmt(&C_stmt);
cql_teardown_row(C);
return _rc_;
}
#undef _PROC_
// Generated from dbhelp.sql:92
/*
CREATE PROC dbhelp_source ()
BEGIN
SELECT *
FROM source_input;
END;
*/
#define _PROC_ "dbhelp_source"
static int32_t dbhelp_source_perf_index;
cql_string_proc_name(dbhelp_source_stored_procedure_name, "dbhelp_source");
typedef struct dbhelp_source_row {
cql_int32 line;
cql_string_ref _Nonnull data;
} dbhelp_source_row;
cql_int32 dbhelp_source_get_line(dbhelp_source_result_set_ref _Nonnull result_set, cql_int32 row) {
dbhelp_source_row *data = (dbhelp_source_row *)cql_result_set_get_data((cql_result_set_ref)result_set);
return data[row].line;
}
cql_string_ref _Nonnull dbhelp_source_get_data(dbhelp_source_result_set_ref _Nonnull result_set, cql_int32 row) {
dbhelp_source_row *data = (dbhelp_source_row *)cql_result_set_get_data((cql_result_set_ref)result_set);
return data[row].data;
}
uint8_t dbhelp_source_data_types[dbhelp_source_data_types_count] = {
CQL_DATA_TYPE_INT32 | CQL_DATA_TYPE_NOT_NULL, // line
CQL_DATA_TYPE_STRING | CQL_DATA_TYPE_NOT_NULL, // data
};
#define dbhelp_source_refs_offset cql_offsetof(dbhelp_source_row, data) // count = 1
static cql_uint16 dbhelp_source_col_offsets[] = { 2,
cql_offsetof(dbhelp_source_row, line),
cql_offsetof(dbhelp_source_row, data)
};
cql_int32 dbhelp_source_result_count(dbhelp_source_result_set_ref _Nonnull result_set) {
return cql_result_set_get_count((cql_result_set_ref)result_set);
}
CQL_WARN_UNUSED cql_code dbhelp_source_fetch_results(sqlite3 *_Nonnull _db_, dbhelp_source_result_set_ref _Nullable *_Nonnull result_set) {
sqlite3_stmt *stmt = NULL;
cql_profile_start(CRC_dbhelp_source, &dbhelp_source_perf_index);
cql_code rc = dbhelp_source(_db_, &stmt);
cql_fetch_info info = {
.rc = rc,
.db = _db_,
.stmt = stmt,
.data_types = dbhelp_source_data_types,
.col_offsets = dbhelp_source_col_offsets,
.refs_count = 1,
.refs_offset = dbhelp_source_refs_offset,
.encode_context_index = -1,
.rowsize = sizeof(dbhelp_source_row),
.crc = CRC_dbhelp_source,
.perf_index = &dbhelp_source_perf_index,
};
return cql_fetch_all_results(&info, (cql_result_set_ref *)result_set);
}
CQL_WARN_UNUSED cql_code dbhelp_source(sqlite3 *_Nonnull _db_, sqlite3_stmt *_Nullable *_Nonnull _result_stmt) {
cql_code _rc_ = SQLITE_OK;
*_result_stmt = NULL;
_rc_ = cql_prepare(_db_, _result_stmt,
"SELECT line, data "
"FROM source_input");
if (_rc_ != SQLITE_OK) { cql_error_trace(); goto cql_cleanup; }
_rc_ = SQLITE_OK;
cql_cleanup:
if (_rc_ == SQLITE_OK && !*_result_stmt) _rc_ = cql_no_rows_stmt(_db_, _result_stmt);
return _rc_;
}
#undef _PROC_
#pragma clang diagnostic pop