commit c530fd3f2308a05aedfe23b339d6978559d8bcf6 Author: Michael Paquier Date: Thu Mar 13 22:44:29 2014 +0900 Add regression tests for all functions in info.c The following functions, using hardcoded column names, are checked with this new test: - SQLGetTypeInfo - SQLTables - SQLColumns - SQLSpecialColumns - SQLStatistics - SQLPrimaryKeys - SQLForeignKeys - SQLProcedureColumns - SQLTablePrivileges diff --git a/test/Makefile b/test/Makefile index ba94136..a822bcd 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,7 +1,7 @@ TESTS = connect stmthandles select commands multistmt getresult prepare \ params notice arraybinding insertreturning dataatexecution \ boolsaschar cvtnulldate alter quotes cursors positioned-update \ - catalogfunctions bindcol lfconversion cte + catalogfunctions bindcol lfconversion cte information TESTBINS = $(patsubst %,src/%-test, $(TESTS)) TESTSQLS = $(patsubst %,sql/%.sql, $(TESTS)) diff --git a/test/expected/information.out b/test/expected/information.out new file mode 100644 index 0000000..73d9541 --- /dev/null +++ b/test/expected/information.out @@ -0,0 +1,146 @@ +\! ./src/information-test +connected +Columns obtained for SQLGetTypeInfo: +Column 0: TYPE_NAME +Column 1: DATA_TYPE +Column 2: PRECISION +Column 3: LITERAL_PREFIX +Column 4: LITERAL_SUFFIX +Column 5: CREATE_PARAMS +Column 6: NULLABLE +Column 7: CASE_SENSITIVE +Column 8: SEARCHABLE +Column 9: UNSIGNED_ATTRIBUTE +Column 10: MONEY +Column 11: AUTO_INCREMENT +Column 12: LOCAL_TYPE_NAME +Column 13: MINIMUM_SCALE +Column 14: MAXIMUM_SCALE +Column 15: SQL_DATA_TYPE +Column 16: SQL_DATETIME_SUB +Column 17: NUM_PREC_RADIX +Column 18: INTERVAL_PRECISION +End of column list for SQLGetTypeInfo + +Columns obtained for SQLTables: +Column 0: TABLE_QUALIFIER +Column 1: TABLE_OWNER +Column 2: TABLE_NAME +Column 3: TABLE_TYPE +Column 4: REMARKS +End of column list for SQLTables + +Columns obtained for SQLColumns: +Column 0: TABLE_QUALIFIER +Column 1: TABLE_OWNER +Column 2: TABLE_NAME +Column 3: COLUMN_NAME +Column 4: DATA_TYPE +Column 5: TYPE_NAME +Column 6: PRECISION +Column 7: LENGTH +Column 8: SCALE +Column 9: RADIX +Column 10: NULLABLE +Column 11: REMARKS +Column 12: COLUMN_DEF +Column 13: SQL_DATA_TYPE +Column 14: SQL_DATETIME_SUB +Column 15: CHAR_OCTET_LENGTH +Column 16: ORDINAL_POSITION +Column 17: IS_NULLABLE +Column 18: DISPLAY_SIZE +Column 19: FIELD_TYPE +Column 20: AUTO_INCREMENT +Column 21: PHYSICAL NUMBER +Column 22: TABLE OID +Column 23: BASE TYPEID +Column 24: TYPMOD +End of column list for SQLColumns + +Columns obtained for SQLSpecialColumns: +Column 0: SCOPE +Column 1: COLUMN_NAME +Column 2: DATA_TYPE +Column 3: TYPE_NAME +Column 4: PRECISION +Column 5: LENGTH +Column 6: SCALE +Column 7: PSEUDO_COLUMN +End of column list for SQLSpecialColumns + +Columns obtained for SQLStatistics: +Column 0: TABLE_QUALIFIER +Column 1: TABLE_OWNER +Column 2: TABLE_NAME +Column 3: NON_UNIQUE +Column 4: INDEX_QUALIFIER +Column 5: INDEX_NAME +Column 6: TYPE +Column 7: SEQ_IN_INDEX +Column 8: COLUMN_NAME +Column 9: COLLATION +Column 10: CARDINALITY +Column 11: PAGES +Column 12: FILTER_CONDITION +End of column list for SQLStatistics + +Columns obtained for SQLPrimaryKeys: +Column 0: TABLE_QUALIFIER +Column 1: TABLE_OWNER +Column 2: TABLE_NAME +Column 3: COLUMN_NAME +Column 4: KEY_SEQ +Column 5: PK_NAME +End of column list for SQLPrimaryKeys + +Columns obtained for SQLForeignKeys: +Column 0: pktable_cat +Column 1: pktable_schem +Column 2: pktable_name +Column 3: pkcolumn_name +Column 4: fktable_cat +Column 5: fktable_schem +Column 6: fktable_name +Column 7: fkcolumn_name +Column 8: key_seq +Column 9: update_rule +Column 10: delete_rule +Column 11: fk_name +Column 12: pk_name +Column 13: deferrablity +End of column list for SQLForeignKeys + +Columns obtained for SQLProcedureColumns: +Column 0: PROCEDURE_CAT +Column 1: PROCEDUR_SCHEM +Column 2: PROCEDURE_NAME +Column 3: COLUMN_NAME +Column 4: COLUMN_TYPE +Column 5: DATA_TYPE +Column 6: TYPE_NAME +Column 7: COLUMN_SIZE +Column 8: BUFFER_LENGTH +Column 9: DECIMAL_DIGITS +Column 10: NUM_PREC_RADIX +Column 11: NULLABLE +Column 12: REMARKS +Column 13: COLUMN_DEF +Column 14: SQL_DATA_TYPE +Column 15: SQL_DATETIME_SUB +Column 16: CHAR_OCTET_LENGTH +Column 17: ORDINAL_POSITION +Column 18: IS_NULLABLE +End of column list for SQLProcedureColumns + +Columns obtained for SQLTablePrivileges: +Column 0: TABLE_CAT +Column 1: TABLE_SCHEM +Column 2: TABLE_NAME +Column 3: GRANTOR +Column 4: GRANTEE +Column 5: PRIVILEGE +Column 6: IS_GRANTABLE +End of column list for SQLTablePrivileges + +disconnecting diff --git a/test/src/information-test.c b/test/src/information-test.c new file mode 100644 index 0000000..90e040f --- /dev/null +++ b/test/src/information-test.c @@ -0,0 +1,159 @@ +/* + * Regression test information + * + * Check the following list of functions that use hardcoded column + * names: + * - SQLGetTypeInfo + * - SQLTables + * - SQLColumns + * - SQLSpecialColumns + * - SQLStatistics + * - SQLPrimaryKeys + * - SQLForeignKeys + * - SQLProcedureColumns + * - SQLTablePrivileges + * The data that is queried here is not really important... + */ +#include +#include + +#include "common.h" + +/* + * print_columns + * Print a list of column names associated with the given statement. + */ +void +print_columns(HSTMT hstmt, char *test) +{ + SQLSMALLINT num_columns = 0; + SQLPOINTER *labels = NULL; + SQLRETURN rc; + char buf[128]; + int i; + + /* Get number of columns obtained */ + rc = SQLNumResultCols(hstmt, &num_columns); + CHECK_STMT_RESULT(rc, "SQLNumResultCols failed", hstmt); + + /* Print each column */ + printf("Columns obtained for %s:\n", test); + for (i = 0; i < num_columns; i++) + { + rc = SQLColAttribute(hstmt, + (SQLUSMALLINT) i + 1, + SQL_DESC_LABEL, + buf, + 128, + NULL, + NULL); + CHECK_STMT_RESULT(rc, "SQLColAttribute failed", hstmt); + printf("Column %d: %s\n", i, (char *) buf); + } + printf("End of column list for %s\n\n", test); + + /* Clean up */ + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); +} + +int +main(int argc, char **argv) +{ + SQLRETURN rc; + HSTMT hstmt = SQL_NULL_HSTMT; + char buf[128]; + int buffer_size = 1024; + SQLSMALLINT num_columns = 0; + int i; + SQLPOINTER *labels = NULL; + test_connect(); + + rc = SQLAllocStmt(conn, &hstmt); + if (!SQL_SUCCEEDED(rc)) + { + print_diag("failed to allocate stmt handle", SQL_HANDLE_DBC, conn); + exit(1); + } + + /* Check for SQLGetTypeInfo */ + rc = SQLGetTypeInfo(hstmt, SQL_VARCHAR); + CHECK_STMT_RESULT(rc, "SQLGetTypeInfo failed", hstmt); + print_columns(hstmt, "SQLGetTypeInfo"); + + /* Check for SQLTables */ + rc = SQLTables(hstmt, + (SQLCHAR *) SQL_ALL_CATALOGS, SQL_NTS, + NULL, 0, + NULL, 0, + NULL, 0); + CHECK_STMT_RESULT(rc, "SQLTables failed", hstmt); + print_columns(hstmt, "SQLTables"); + + /* Check for SQLColumns */ + rc = SQLColumns(hstmt, + NULL, 0, + (SQLCHAR *) "pg_catalog", SQL_NTS, + (SQLCHAR *) "pg_class", SQL_NTS, + NULL, 0); + CHECK_STMT_RESULT(rc, "SQLColumns failed", hstmt); + print_columns(hstmt, "SQLColumns"); + + /* Check for SQLSpecialColumns */ + rc = SQLSpecialColumns(hstmt, SQL_BEST_ROWID, + NULL, 0, + (SQLCHAR *) "pg_catalog", SQL_NTS, + (SQLCHAR *) "pg_class", SQL_NTS, + SQL_SCOPE_CURROW, + SQL_NULLABLE); + CHECK_STMT_RESULT(rc, "SQLSpecialColumns failed", hstmt); + print_columns(hstmt, "SQLSpecialColumns"); + + /* Check for SQLStatistics */ + rc = SQLStatistics(hstmt, + NULL, 0, + (SQLCHAR *) "pg_catalog", SQL_NTS, + (SQLCHAR *) "pg_class", SQL_NTS, + 0, 0); + CHECK_STMT_RESULT(rc, "SQLStatistics failed", hstmt); + print_columns(hstmt, "SQLStatistics"); + + /* Check for SQLPrimaryKeys */ + rc = SQLPrimaryKeys(hstmt, + NULL, 0, + (SQLCHAR *) "pg_catalog", SQL_NTS, + (SQLCHAR *) "pg_class", SQL_NTS); + CHECK_STMT_RESULT(rc, "SQLPrimaryKeys failed", hstmt); + print_columns(hstmt, "SQLPrimaryKeys"); + + /* Check for SQLForeignKeys */ + rc = SQLForeignKeys(hstmt, + NULL, 0, + (SQLCHAR *) "pg_catalog", SQL_NTS, + (SQLCHAR *) "pg_class", SQL_NTS, + NULL, 0, + NULL, 0, + NULL, 0); + CHECK_STMT_RESULT(rc, "SQLForeignKeys failed", hstmt); + print_columns(hstmt, "SQLForeignKeys"); + + /* Check for SQLProcedureColumns */ + rc = SQLProcedureColumns(hstmt, + NULL, 0, + (SQLCHAR *) "pg_catalog", SQL_NTS, + NULL, 0, + NULL, 0); + CHECK_STMT_RESULT(rc, "SQLProcedureColumns failed", hstmt); + print_columns(hstmt, "SQLProcedureColumns"); + + /* Check for SQLTablePrivileges */ + rc = SQLTablePrivileges(hstmt, + NULL, 0, + (SQLCHAR *) "pg_catalog", 0, + (SQLCHAR *) "pg_class", SQL_NTS); + CHECK_STMT_RESULT(rc, "SQLTablePrivileges failed", hstmt); + print_columns(hstmt, "SQLTablePrivileges"); + + /* Clean up */ + test_disconnect(); +}