diff --git a/test/expected/catalogfunctions.out b/test/expected/catalogfunctions.out index 914a8a1..dba7d55 100644 --- a/test/expected/catalogfunctions.out +++ b/test/expected/catalogfunctions.out @@ -1,10 +1,192 @@ \! ./src/catalogfunctions-test connected +Check for SQLTypeInfo +Result set metadata: +TYPE_NAME: VARCHAR(128) digits: 0, nullable +DATA_TYPE: SMALLINT(5) digits: 0, nullable +PRECISION: INTEGER(10) digits: 0, nullable +LITERAL_PREFIX: VARCHAR(128) digits: 0, nullable +LITERAL_SUFFIX: VARCHAR(128) digits: 0, nullable +CREATE_PARAMS: VARCHAR(128) digits: 0, nullable +NULLABLE: SMALLINT(5) digits: 0, nullable +CASE_SENSITIVE: SMALLINT(5) digits: 0, nullable +SEARCHABLE: SMALLINT(5) digits: 0, nullable +UNSIGNED_ATTRIBUTE: SMALLINT(5) digits: 0, nullable +MONEY: SMALLINT(5) digits: 0, nullable +AUTO_INCREMENT: SMALLINT(5) digits: 0, nullable +LOCAL_TYPE_NAME: VARCHAR(128) digits: 0, nullable +MINIMUM_SCALE: SMALLINT(5) digits: 0, nullable +MAXIMUM_SCALE: SMALLINT(5) digits: 0, nullable +SQL_DATA_TYPE: SMALLINT(5) digits: 0, nullable +SQL_DATETIME_SUB: SMALLINT(5) digits: 0, nullable +NUM_PREC_RADIX: INTEGER(10) digits: 0, nullable +INTERVAL_PRECISION: SMALLINT(5) digits: 0, nullable +Result set: +varchar 12 255 ' ' max. length 1 1 3 NULL 0 NULL NULL NULL NULL 12 NULL NULL 0 +Check for SQLTables +Result set metadata: +TABLE_QUALIFIER: VARCHAR(128) digits: 0, nullable +TABLE_OWNER: VARCHAR(128) digits: 0, nullable +TABLE_NAME: VARCHAR(128) digits: 0, nullable +TABLE_TYPE: VARCHAR(128) digits: 0, nullable +REMARKS: VARCHAR(254) digits: 0, nullable Result set: contrib_regression public booltab TABLE contrib_regression public byteatab TABLE contrib_regression public intervaltable TABLE contrib_regression public testtab1 TABLE +contrib_regression public testtab_fk TABLE +Check for SQLColumns +Result set metadata: +TABLE_QUALIFIER: VARCHAR(128) digits: 0, nullable +TABLE_OWNER: VARCHAR(128) digits: 0, nullable +TABLE_NAME: VARCHAR(128) digits: 0, nullable +COLUMN_NAME: VARCHAR(128) digits: 0, nullable +DATA_TYPE: SMALLINT(5) digits: 0, nullable +TYPE_NAME: VARCHAR(128) digits: 0, nullable +PRECISION: INTEGER(10) digits: 0, nullable +LENGTH: INTEGER(10) digits: 0, nullable +SCALE: SMALLINT(5) digits: 0, nullable +RADIX: SMALLINT(5) digits: 0, nullable +NULLABLE: SMALLINT(5) digits: 0, nullable +REMARKS: VARCHAR(254) digits: 0, nullable +COLUMN_DEF: VARCHAR(254) digits: 0, nullable +SQL_DATA_TYPE: SMALLINT(5) digits: 0, nullable +SQL_DATETIME_SUB: SMALLINT(5) digits: 0, nullable +CHAR_OCTET_LENGTH: INTEGER(10) digits: 0, nullable +ORDINAL_POSITION: INTEGER(10) digits: 0, nullable +IS_NULLABLE: VARCHAR(254) digits: 0, nullable +DISPLAY_SIZE: INTEGER(10) digits: 0, nullable +FIELD_TYPE: INTEGER(10) digits: 0, nullable +AUTO_INCREMENT: INTEGER(10) digits: 0, nullable +PHYSICAL NUMBER: SMALLINT(5) digits: 0, nullable +TABLE OID: INTEGER(10) digits: 0, nullable +BASE TYPEID: INTEGER(10) digits: 0, nullable +TYPMOD: INTEGER(10) digits: 0, nullable +Result set: +contrib_regression public booltab id 4 int4 +contrib_regression public booltab t 12 varchar +contrib_regression public booltab b 12 bool +contrib_regression public byteatab id 4 int4 +contrib_regression public byteatab t -3 bytea +contrib_regression public intervaltable id 4 int4 +contrib_regression public intervaltable iv 12 interval +contrib_regression public intervaltable d 12 varchar +contrib_regression public testtab1 id 4 int4 +contrib_regression public testtab1 t 12 varchar +contrib_regression public testtab1_pkey id 4 int4 +contrib_regression public testtab_fk id 4 int4 +contrib_regression public testtab_fk t 12 varchar +Check for SQLSpecialColumns +Result set metadata: +SCOPE: SMALLINT(5) digits: 0, nullable +COLUMN_NAME: VARCHAR(128) digits: 0, nullable +DATA_TYPE: SMALLINT(5) digits: 0, nullable +TYPE_NAME: VARCHAR(128) digits: 0, nullable +PRECISION: INTEGER(10) digits: 0, nullable +LENGTH: INTEGER(10) digits: 0, nullable +SCALE: SMALLINT(5) digits: 0, nullable +PSEUDO_COLUMN: SMALLINT(5) digits: 0, nullable +Result set: +NULL xmin 4 xid 10 4 0 2 +Check for SQLStatistics +Result set metadata: +TABLE_QUALIFIER: VARCHAR(128) digits: 0, nullable +TABLE_OWNER: VARCHAR(128) digits: 0, nullable +TABLE_NAME: VARCHAR(128) digits: 0, nullable +NON_UNIQUE: SMALLINT(5) digits: 0, nullable +INDEX_QUALIFIER: VARCHAR(128) digits: 0, nullable +INDEX_NAME: VARCHAR(128) digits: 0, nullable +TYPE: SMALLINT(5) digits: 0, nullable +SEQ_IN_INDEX: SMALLINT(5) digits: 0, nullable +COLUMN_NAME: VARCHAR(128) digits: 0, nullable +COLLATION: CHAR(1) digits: 0, nullable +CARDINALITY: INTEGER(10) digits: 0, nullable +PAGES: INTEGER(10) digits: 0, nullable +FILTER_CONDITION: VARCHAR(128) digits: 0, nullable +Result set: +contrib_regression public testtab1 0 public testtab1_pkey 3 1 id A NULL NULL NULL +Check for SQLPrimaryKeys +Result set metadata: +TABLE_QUALIFIER: VARCHAR(128) digits: 0, nullable +TABLE_OWNER: VARCHAR(128) digits: 0, nullable +TABLE_NAME: VARCHAR(128) digits: 0, nullable +COLUMN_NAME: VARCHAR(128) digits: 0, nullable +KEY_SEQ: SMALLINT(5) digits: 0, nullable +PK_NAME: VARCHAR(128) digits: 0, nullable +Result set: +contrib_regression public testtab1 id 1 testtab1_pkey +Check for SQLForeignKeys +Result set metadata: +pktable_cat: VARCHAR(64) digits: 0, nullable +pktable_schem: VARCHAR(64) digits: 0, not nullable +pktable_name: VARCHAR(64) digits: 0, not nullable +pkcolumn_name: VARCHAR(64) digits: 0, not nullable +fktable_cat: VARCHAR(64) digits: 0, nullable +fktable_schem: VARCHAR(64) digits: 0, not nullable +fktable_name: VARCHAR(64) digits: 0, not nullable +fkcolumn_name: VARCHAR(64) digits: 0, not nullable +key_seq: SMALLINT(5) digits: 0, nullable +update_rule: SMALLINT(5) digits: 0, nullable +delete_rule: SMALLINT(5) digits: 0, nullable +fk_name: VARCHAR(64) digits: 0, not nullable +pk_name: VARCHAR(64) digits: 0, not nullable +deferrablity: SMALLINT(5) digits: 0, nullable +Result set: +contrib_regression public testtab1 id contrib_regression public testtab_fk id 1 3 3 testtab_fk_id_fkey testtab1_pkey 7 +Check for SQLProcedures +Result set metadata: +procedure_cat: VARCHAR(255) digits: 0, nullable +procedure_schem: VARCHAR(64) digits: 0, not nullable +procedure_name: VARCHAR(64) digits: 0, not nullable +num_input_params: VARCHAR(255) digits: 0, nullable +num_output_params: VARCHAR(255) digits: 0, nullable +num_result_sets: VARCHAR(255) digits: 0, nullable +remarks: VARCHAR(255) digits: 0, nullable +procedure_type: SMALLINT(5) digits: 0, nullable +Result set: + public simple_add 2 +Check for SQLProcedureColumns +Result set metadata: +PROCEDURE_CAT: VARCHAR(128) digits: 0, nullable +PROCEDUR_SCHEM: VARCHAR(128) digits: 0, nullable +PROCEDURE_NAME: VARCHAR(128) digits: 0, nullable +COLUMN_NAME: VARCHAR(128) digits: 0, nullable +COLUMN_TYPE: SMALLINT(5) digits: 0, nullable +DATA_TYPE: SMALLINT(5) digits: 0, nullable +TYPE_NAME: VARCHAR(128) digits: 0, nullable +COLUMN_SIZE: INTEGER(10) digits: 0, nullable +BUFFER_LENGTH: INTEGER(10) digits: 0, nullable +DECIMAL_DIGITS: SMALLINT(5) digits: 0, nullable +NUM_PREC_RADIX: SMALLINT(5) digits: 0, nullable +NULLABLE: SMALLINT(5) digits: 0, nullable +REMARKS: VARCHAR(128) digits: 0, nullable +COLUMN_DEF: VARCHAR(128) digits: 0, nullable +SQL_DATA_TYPE: SMALLINT(5) digits: 0, nullable +SQL_DATETIME_SUB: SMALLINT(5) digits: 0, nullable +CHAR_OCTET_LENGTH: INTEGER(10) digits: 0, nullable +ORDINAL_POSITION: INTEGER(10) digits: 0, nullable +IS_NULLABLE: VARCHAR(128) digits: 0, nullable +Result set: +contrib_regression public simple_add 1 4 int4 10 4 0 10 2 NULL NULL 4 NULL NULL 1 +contrib_regression public simple_add 1 4 int4 10 4 0 10 2 NULL NULL 4 NULL NULL 2 +contrib_regression public simple_add 4 4 int4 10 4 0 10 2 NULL NULL 4 NULL NULL 3 +Check for SQLTablePrivileges +Result set metadata: +TABLE_CAT: VARCHAR(128) digits: 0, nullable +TABLE_SCHEM: VARCHAR(128) digits: 0, nullable +TABLE_NAME: VARCHAR(128) digits: 0, nullable +GRANTOR: VARCHAR(128) digits: 0, nullable +GRANTEE: VARCHAR(128) digits: 0, nullable +PRIVILEGE: VARCHAR(128) digits: 0, nullable +IS_GRANTABLE: VARCHAR(128) digits: 0, nullable +Result set: +contrib_regression public testtab1 _SYSTEM INSERT YES +contrib_regression public testtab1 _SYSTEM SELECT YES +contrib_regression public testtab1 _SYSTEM UPDATE YES +contrib_regression public testtab1 _SYSTEM DELETE YES +contrib_regression public testtab1 _SYSTEM REFERENCES YES Result set: contrib_regression public testtab1 TABLE +contrib_regression public testtab_fk TABLE disconnecting diff --git a/test/expected/sampletables.out b/test/expected/sampletables.out index 51b9073..e4fcb71 100644 --- a/test/expected/sampletables.out +++ b/test/expected/sampletables.out @@ -1,8 +1,12 @@ -- This file creates some tables to be used in the tests -CREATE TABLE testtab1 (id integer, t varchar(20)); +CREATE TABLE testtab1 (id integer PRIMARY KEY, t varchar(20)); INSERT INTO testtab1 VALUES (1, 'foo'); INSERT INTO testtab1 VALUES (2, 'bar'); INSERT INTO testtab1 VALUES (3, 'foobar'); +CREATE TABLE testtab_fk (id integer REFERENCES testtab1, t varchar(20)); +INSERT INTO testtab_fk VALUES (1, 'hoge'); +INSERT INTO testtab_fk VALUES (2, 'pogno'); +INSERT INTO testtab_fk VALUES (3, 'poco'); CREATE TABLE byteatab (id integer, t bytea); INSERT INTO byteatab VALUES (1, E'\\001\\002\\003\\004\\005\\006\\007\\010'::bytea); INSERT INTO byteatab VALUES (2, 'bar'); @@ -19,3 +23,7 @@ INSERT INTO booltab VALUES (2, 'yes', true); INSERT INTO booltab VALUES (3, 'true', true); INSERT INTO booltab VALUES (4, 'false', false); INSERT INTO booltab VALUES (5, 'not', false); +-- Procedure for catalog function checks +CREATE FUNCTION simple_add(in int, in int, out int) +AS $$ SELECT $1 + $2; +$$ LANGUAGE SQL; diff --git a/test/sql/sampletables.sql b/test/sql/sampletables.sql index 78a7eb6..a917de7 100644 --- a/test/sql/sampletables.sql +++ b/test/sql/sampletables.sql @@ -1,10 +1,15 @@ -- This file creates some tables to be used in the tests -CREATE TABLE testtab1 (id integer, t varchar(20)); +CREATE TABLE testtab1 (id integer PRIMARY KEY, t varchar(20)); INSERT INTO testtab1 VALUES (1, 'foo'); INSERT INTO testtab1 VALUES (2, 'bar'); INSERT INTO testtab1 VALUES (3, 'foobar'); +CREATE TABLE testtab_fk (id integer REFERENCES testtab1, t varchar(20)); +INSERT INTO testtab_fk VALUES (1, 'hoge'); +INSERT INTO testtab_fk VALUES (2, 'pogno'); +INSERT INTO testtab_fk VALUES (3, 'poco'); + CREATE TABLE byteatab (id integer, t bytea); INSERT INTO byteatab VALUES (1, E'\\001\\002\\003\\004\\005\\006\\007\\010'::bytea); INSERT INTO byteatab VALUES (2, 'bar'); @@ -23,3 +28,8 @@ INSERT INTO booltab VALUES (2, 'yes', true); INSERT INTO booltab VALUES (3, 'true', true); INSERT INTO booltab VALUES (4, 'false', false); INSERT INTO booltab VALUES (5, 'not', false); + +-- Procedure for catalog function checks +CREATE FUNCTION simple_add(in int, in int, out int) +AS $$ SELECT $1 + $2; +$$ LANGUAGE SQL; diff --git a/test/src/catalogfunctions-test.c b/test/src/catalogfunctions-test.c index 180d1f1..3d2d9ac 100644 --- a/test/src/catalogfunctions-test.c +++ b/test/src/catalogfunctions-test.c @@ -1,16 +1,35 @@ +/* + * This test is used to check the output and processing of the catalog + * functions listed as below: + * - SQLGetTypeInfo + * - SQLTables + * - SQLColumns + * - SQLSpecialColumns + * - SQLStatistics + * - SQLPrimaryKeys + * - SQLForeignKeys + * - SQLProcedureColumns + * - SQLTablePrivileges + * - SQLColumnPrivileges + * - SQLProcedures + */ #include #include #include #include "common.h" -int main(int argc, char **argv) +int +main(int argc, char **argv) { int rc; HSTMT hstmt = SQL_NULL_HSTMT; char sql[100000]; char *sqlend; int i; + /* Cases where output is limited to relevant information only */ + SQLSMALLINT sql_tab_privileges_ids[6] = {1, 2, 3, 4, 6, 7}; + SQLSMALLINT sql_column_ids[6] = {1, 2, 3, 4, 5, 6}; test_connect(); @@ -21,22 +40,158 @@ int main(int argc, char **argv) exit(1); } - rc = SQLTables(hstmt, "", SQL_NTS, - "public", SQL_NTS, - "%", SQL_NTS, - "TABLE", SQL_NTS); + /* Check for SQLGetTypeInfo */ + printf("Check for SQLTypeInfo\n"); + rc = SQLGetTypeInfo(hstmt, SQL_VARCHAR); + CHECK_STMT_RESULT(rc, "SQLGetTypeInfo failed", hstmt); + print_result_meta(hstmt); + print_result(hstmt); + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + /* Check for SQLTables */ + printf("Check for SQLTables\n"); + rc = SQLTables(hstmt, NULL, 0, + (SQLCHAR *) "public", SQL_NTS, + (SQLCHAR *) "%", SQL_NTS, + (SQLCHAR *) "TABLE", SQL_NTS); CHECK_STMT_RESULT(rc, "SQLTables failed", hstmt); + print_result_meta(hstmt); + print_result(hstmt); + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + + /* Check for SQLColumns */ + printf("Check for SQLColumns\n"); + rc = SQLColumns(hstmt, + NULL, 0, + (SQLCHAR *) "public", SQL_NTS, + (SQLCHAR *) "%", SQL_NTS, + NULL, 0); + CHECK_STMT_RESULT(rc, "SQLColumns failed", hstmt); + print_result_meta(hstmt); + /* + * Print only the 6 first columns, we do not want for example + * to get the OID in output, and this information looks to be + * enough. + */ + print_result_series(hstmt, sql_column_ids, 6); + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + + /* Check for SQLColumnPrivileges */ + //printf("Check for SQLColumnPrivileges\n"); + //rc = SQLColumnPrivileges(hstmt, + // NULL, 0, + // (SQLCHAR *) "public", SQL_NTS, + // (SQLCHAR *) "testtab1", SQL_NTS, + // (SQLCHAR *) "id", SQL_NTS); + //CHECK_STMT_RESULT(rc, "SQLColumnPrivileges failed", hstmt); + //print_result_meta(hstmt); + //print_result(hstmt); + //rc = SQLFreeStmt(hstmt, SQL_CLOSE); + //CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + + /* Check for SQLSpecialColumns */ + printf("Check for SQLSpecialColumns\n"); + rc = SQLSpecialColumns(hstmt, SQL_ROWVER, + NULL, 0, + (SQLCHAR *) "public", SQL_NTS, + (SQLCHAR *) "testtab1", SQL_NTS, + SQL_SCOPE_SESSION, + SQL_NO_NULLS); + CHECK_STMT_RESULT(rc, "SQLSpecialColumns failed", hstmt); + print_result_meta(hstmt); + print_result(hstmt); + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + + /* + * Check for SQLStatistics. It is important to note that this function + * returns statistics like the number of pages used and the number of + * index scans. + */ + printf("Check for SQLStatistics\n"); + rc = SQLStatistics(hstmt, + NULL, 0, + (SQLCHAR *) "public", SQL_NTS, + (SQLCHAR *) "testtab1", SQL_NTS, + 0, 0); + CHECK_STMT_RESULT(rc, "SQLStatistics failed", hstmt); + print_result_meta(hstmt); + print_result(hstmt); + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + + /* Check for SQLPrimaryKeys */ + printf("Check for SQLPrimaryKeys\n"); + rc = SQLPrimaryKeys(hstmt, + NULL, 0, + (SQLCHAR *) "public", SQL_NTS, + (SQLCHAR *) "testtab1", SQL_NTS); + CHECK_STMT_RESULT(rc, "SQLPrimaryKeys failed", hstmt); + print_result_meta(hstmt); + print_result(hstmt); + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + + /* Check for SQLForeignKeys */ + printf("Check for SQLForeignKeys\n"); + rc = SQLForeignKeys(hstmt, + NULL, 0, + (SQLCHAR *) "public", SQL_NTS, + (SQLCHAR *) "testtab1", SQL_NTS, + NULL, 0, + (SQLCHAR *) "public", SQL_NTS, + (SQLCHAR *) "testtab_fk", SQL_NTS); + CHECK_STMT_RESULT(rc, "SQLForeignKeys failed", hstmt); + print_result_meta(hstmt); + print_result(hstmt); + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + + /* Check for SQLProcedures */ + printf("Check for SQLProcedures\n"); + rc = SQLProcedures(hstmt, + NULL, 0, + (SQLCHAR *) "public", SQL_NTS, + (SQLCHAR *) "simple_add", SQL_NTS); + CHECK_STMT_RESULT(rc, "SQLProcedures failed", hstmt); + print_result_meta(hstmt); + print_result(hstmt); + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + + /* Check for SQLProcedureColumns */ + printf("Check for SQLProcedureColumns\n"); + rc = SQLProcedureColumns(hstmt, + NULL, 0, + (SQLCHAR *) "public", SQL_NTS, + (SQLCHAR *) "simple_add", SQL_NTS, + NULL, 0); + CHECK_STMT_RESULT(rc, "SQLProcedureColumns failed", hstmt); + print_result_meta(hstmt); print_result(hstmt); + rc = SQLFreeStmt(hstmt, SQL_CLOSE); + CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); + /* Check for SQLTablePrivileges */ + printf("Check for SQLTablePrivileges\n"); + rc = SQLTablePrivileges(hstmt, + NULL, 0, + (SQLCHAR *) "public", 0, + (SQLCHAR *) "testtab1", SQL_NTS); + CHECK_STMT_RESULT(rc, "SQLTablePrivileges failed", hstmt); + print_result_meta(hstmt); + print_result_series(hstmt, sql_tab_privileges_ids, 6); rc = SQLFreeStmt(hstmt, SQL_CLOSE); CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); /* + * Extra tests. * Older versions of the driver had a bug in handling table-types lists * longer than 32 entries. Check for that. */ - rc = SQLTables(hstmt, "", SQL_NTS, "public", SQL_NTS, "testtab%", SQL_NTS, diff --git a/test/src/common.c b/test/src/common.c index 962d7d3..091dd1a 100644 --- a/test/src/common.c +++ b/test/src/common.c @@ -163,23 +163,17 @@ const char *nullable_str(SQLSMALLINT nullable) } void -print_result_meta(HSTMT hstmt) +print_result_meta_series(HSTMT hstmt, + SQLSMALLINT *colids, + SQLSMALLINT numcols) { - SQLRETURN rc; - SQLSMALLINT numcols; int i; - rc = SQLNumResultCols(hstmt, &numcols); - if (!SQL_SUCCEEDED(rc)) - { - print_diag("SQLNumResultCols failed", SQL_HANDLE_STMT, hstmt); - return; - } - printf("Result set metadata:\n"); - for (i = 1; i <= numcols; i++) + for (i = 0; i < numcols; i++) { + SQLRETURN rc; SQLCHAR colname[50]; SQLSMALLINT colnamelen; SQLSMALLINT datatype; @@ -187,7 +181,7 @@ print_result_meta(HSTMT hstmt) SQLSMALLINT decdigits; SQLSMALLINT nullable; - rc = SQLDescribeCol(hstmt, i, + rc = SQLDescribeCol(hstmt, colids[i], colname, sizeof(colname), &colnamelen, &datatype, @@ -206,10 +200,11 @@ print_result_meta(HSTMT hstmt) } void -print_result(HSTMT hstmt) +print_result_meta(HSTMT hstmt) { SQLRETURN rc; - SQLSMALLINT numcols; + SQLSMALLINT numcols, i; + SQLSMALLINT *colids; rc = SQLNumResultCols(hstmt, &numcols); if (!SQL_SUCCEEDED(rc)) @@ -218,6 +213,21 @@ print_result(HSTMT hstmt) return; } + colids = (SQLSMALLINT *) malloc(numcols * sizeof(SQLSMALLINT)); + for (i = 0; i < numcols; i++) + colids[i] = i + 1; + print_result_meta_series(hstmt, colids, numcols); + free(colids); +} + +/* + * Print result only for the selected columns. + */ +void +print_result_series(HSTMT hstmt, SQLSMALLINT *colids, SQLSMALLINT numcols) +{ + SQLRETURN rc; + printf("Result set:\n"); while(1) { @@ -230,9 +240,9 @@ print_result(HSTMT hstmt) int i; SQLLEN ind; - for (i = 1; i <= numcols; i++) + for (i = 0; i < numcols; i++) { - rc = SQLGetData(hstmt,i, SQL_C_CHAR, buf, sizeof(buf), &ind); + rc = SQLGetData(hstmt, colids[i], SQL_C_CHAR, buf, sizeof(buf), &ind); if (!SQL_SUCCEEDED(rc)) { print_diag("SQLGetData failed", SQL_HANDLE_STMT, hstmt); @@ -240,7 +250,7 @@ print_result(HSTMT hstmt) } if (ind == SQL_NULL_DATA) strcpy(buf, "NULL"); - printf("%s%s", (i > 1) ? "\t" : "", buf); + printf("%s%s", (i > 0) ? "\t" : "", buf); } printf("\n"); } @@ -251,3 +261,27 @@ print_result(HSTMT hstmt) } } } + +/* + * Print result on all the columns + */ +void +print_result(HSTMT hstmt) +{ + SQLRETURN rc; + SQLSMALLINT numcols, i; + SQLSMALLINT *colids; + + rc = SQLNumResultCols(hstmt, &numcols); + if (!SQL_SUCCEEDED(rc)) + { + print_diag("SQLNumResultCols failed", SQL_HANDLE_STMT, hstmt); + return; + } + + colids = (SQLSMALLINT *) malloc(numcols * sizeof(SQLSMALLINT)); + for (i = 0; i < numcols; i++) + colids[i] = i + 1; + print_result_series(hstmt, colids, numcols); + free(colids); +} diff --git a/test/src/common.h b/test/src/common.h index 2feceb9..34ad156 100644 --- a/test/src/common.h +++ b/test/src/common.h @@ -27,6 +27,12 @@ extern void print_diag(char *msg, SQLSMALLINT htype, SQLHANDLE handle); extern void test_connect_ext(char *extraparams); extern void test_connect(void); extern void test_disconnect(void); +extern void print_result_meta_series(HSTMT hstmt, + SQLSMALLINT *colids, + SQLSMALLINT numcols); +extern void print_result_series(HSTMT hstmt, + SQLSMALLINT *colids, + SQLSMALLINT numcols); extern void print_result_meta(HSTMT hstmt); extern void print_result(HSTMT hstmt); extern const char *datatype_str(SQLSMALLINT datatype);