List:Commits« Previous MessageNext Message »
From:jbalint Date:March 7 2007 7:22am
Subject:ODBC C-tests commit: r36 - in trunk: include testsuites/t_jbalint
View as plain text  
Modified:
   trunk/include/odbctest.h
   trunk/testsuites/t_jbalint/catalog.c
   trunk/testsuites/t_jbalint/t_jbalint.h
   trunk/testsuites/t_jbalint/t_jbalint_suite.c
Log:
changed param name in CHECK_SQL_RC macro so it won't clash with outer code (eg, if
x->rc)
cleaned up SQLSpecialColumns() test and added new tests

Modified: trunk/include/odbctest.h
===================================================================
--- trunk/include/odbctest.h	2007-03-06 14:14:10 UTC (rev 35)
+++ trunk/include/odbctest.h	2007-03-07 07:22:55 UTC (rev 36)
@@ -147,10 +147,10 @@
  * CuTest test-case pointer in the current scope.
  */
 #define CHECK_SQL_S(x, hnd) {\
-    SQLRETURN rc = (x); \
-    test_sql_return(rc, #x, __FILE__, __LINE__, __FUNCTION__, \
+    SQLRETURN rcX = (x); \
+    test_sql_return(rcX, #x, __FILE__, __LINE__, __FUNCTION__, \
         hnd, SQL_HANDLE_STMT, SQL_SUCCESS); \
-    CuAssertIntEquals_Msg(tc, "SQLRETURN", SQL_SUCCESS, rc); \
+    CuAssertIntEquals_Msg(tc, "SQLRETURN", SQL_SUCCESS, rcX); \
 }
 
 /*

Modified: trunk/testsuites/t_jbalint/catalog.c
===================================================================
--- trunk/testsuites/t_jbalint/catalog.c	2007-03-06 14:14:10 UTC (rev 35)
+++ trunk/testsuites/t_jbalint/catalog.c	2007-03-07 07:22:55 UTC (rev 36)
@@ -191,42 +191,127 @@
     free_statement(stmt);
 }
 
+/* struct for representing a row returns from SQLSpecialColumns() */
+typedef struct
+{
+    SQLINTEGER scope;
+    SQLCHAR *colname;
+    SQLINTEGER type;
+    SQLCHAR *typestr;
+    SQLINTEGER colsize;
+    SQLINTEGER buflen;
+    SQLINTEGER decdigits;
+    SQLINTEGER pseudocol;
+} sc_row;
+
+void specialcolumns_check(CuTest *tc, SQLHANDLE stmt, sc_row *specialcols)
+{
+    SQLRETURN rc;
+    int i = 0;
+    sc_row tr;
+    SQLCHAR tcol[STRLEN];
+    SQLCHAR ttype[STRLEN];
+    tr.colname = tcol;
+    tr.typestr = ttype;
+
+    CHECK_SQL_S(SQLBindCol(stmt, 1, SQL_C_SLONG, &tr.scope, 0, NULL), stmt);
+    CHECK_SQL_S(SQLBindCol(stmt, 2, SQL_C_CHAR,
+        tr.colname, STRLEN, NULL), stmt);
+    CHECK_SQL_S(SQLBindCol(stmt, 3, SQL_C_SLONG, &tr.type, 0, NULL), stmt);
+    CHECK_SQL_S(SQLBindCol(stmt, 4, SQL_C_CHAR,
+        tr.typestr, STRLEN, NULL), stmt);
+    CHECK_SQL_S(SQLBindCol(stmt, 5, SQL_C_SLONG, &tr.colsize, 0, NULL), stmt);
+    CHECK_SQL_S(SQLBindCol(stmt, 6, SQL_C_SLONG, &tr.buflen, 0, NULL), stmt);
+    CHECK_SQL_S(SQLBindCol(stmt, 7, SQL_C_SLONG, &tr.decdigits, 0, NULL), stmt);
+    CHECK_SQL_S(SQLBindCol(stmt, 8, SQL_C_SLONG, &tr.pseudocol, 0, NULL), stmt);
+
+    while((rc = SQLFetch(stmt)) == SQL_SUCCESS)
+    {
+        sc_row d = specialcols[i++];
+        test_printf("fld=%s,type=%s,scope=%d\n",
+            tr.colname, tr.typestr, tr.scope);
+        OT_ASSERT_INT_MSG("rowid scope should be what we requested",
+            d.scope, tr.scope);
+        OT_ASSERT_STR_MSG("should be one rowid", d.colname, tr.colname);
+        OT_ASSERT_INT_MSG("id type", d.type, tr.type);
+        OT_ASSERT_STR_MSG("type name", d.typestr, tr.typestr);
+        OT_ASSERT_INT_MSG("column size", d.colsize, tr.colsize); /* ?? */
+        OT_ASSERT_INT_MSG("buffer length", d.buflen, tr.buflen);
+        OT_ASSERT_INT_MSG("decimal digits", d.decdigits, tr.decdigits);
+        OT_ASSERT_INT_MSG("pseudo column", d.pseudocol, tr.pseudocol);
+    }
+
+    CHECK_SQL_RC(rc, stmt, SQL_HANDLE_STMT, SQL_NO_DATA);
+    OT_ASSERT_INT_MSG("SQLFetch() ran to completion", SQL_NO_DATA, rc);
+}
+
 /* Test getting primary keys using the rowid param. */
 OT_TEST_METHOD(specialcolumns_pk_as_rowid)
 {
     SQLHANDLE stmt = get_statement();
-    SQLINTEGER vint;
-    SQLCHAR vstr[STRLEN];
+    sc_row specialcols[] = {{SQL_SCOPE_SESSION, "rowid",
+        SQL_INTEGER, "integer", 11, 11, 0, SQL_PC_NOT_PSEUDO}};
 
     CHECK_SQL_S(SQLSpecialColumns(stmt, SQL_BEST_ROWID,
         NULL, SQL_NTS, NULL, SQL_NTS, "simple1", SQL_NTS,
         /* scope is ignored in the driver */
         SQL_SCOPE_SESSION, SQL_NULLABLE), stmt);
-    CHECK_SQL_S(SQLFetch(stmt), stmt);
 
-    CHECK_SQL_S(SQLGetData(stmt, 1, SQL_C_SLONG, &vint, 0, NULL), stmt);
-    OT_ASSERT_INT_MSG("rowid scope should be what we requested",
-        SQL_SCOPE_SESSION, vint);
-    CHECK_SQL_S(SQLGetData(stmt, 2, SQL_C_CHAR, vstr, STRLEN, NULL), stmt);
-    OT_ASSERT_STR_MSG("should be one rowid", "rowid", vstr);
-    CHECK_SQL_S(SQLGetData(stmt, 3, SQL_C_SLONG, &vint, 0, NULL), stmt);
-    OT_ASSERT_INT_MSG("id type", SQL_INTEGER, vint);
-    CHECK_SQL_S(SQLGetData(stmt, 4, SQL_C_CHAR, vstr, STRLEN, NULL), stmt);
-    OT_ASSERT_STR_MSG("type name", "integer", vstr);
-    CHECK_SQL_S(SQLGetData(stmt, 5, SQL_C_SLONG, &vint, 0, NULL), stmt);
-    OT_ASSERT_INT_MSG("column size", 11, vint); /* ?? */
-    CHECK_SQL_S(SQLGetData(stmt, 6, SQL_C_SLONG, &vint, 0, NULL), stmt);
-    OT_ASSERT_INT_MSG("buffer length", 11, vint);
-    CHECK_SQL_S(SQLGetData(stmt, 7, SQL_C_SLONG, &vint, 0, NULL), stmt);
-    OT_ASSERT_INT_MSG("decimal digits", 0, vint);
-    CHECK_SQL_S(SQLGetData(stmt, 8, SQL_C_SLONG, &vint, 0, NULL), stmt);
-    OT_ASSERT_INT_MSG("pseudo column", SQL_PC_NOT_PSEUDO, vint);
+    test_printf("\tTest single PK as rowid\n");
+    specialcolumns_check(tc, stmt, specialcols);
 
-    CHECK_SQL_RC(SQLFetch(stmt), stmt, SQL_HANDLE_STMT, SQL_NO_DATA);
+    free_statement(stmt);
+}
 
+/* Test retrieving a unique index column as the row id. */
+OT_TEST_METHOD(specialcolumns_uidx_as_rowid)
+{
+    SQLHANDLE stmt = get_statement();
+    const char *crtqry = "create table tst_rowid (a int not null, unique(a))";
+    const char *drpqry = "drop table if exists tst_rowid";
+    sc_row specialcols[] = {{SQL_SCOPE_SESSION, "a",
+        SQL_INTEGER, "integer", 11, 11, 0, SQL_PC_NOT_PSEUDO}};
+
+    CHECK_SQL_S(SQLExecDirect(stmt, (SQLCHAR *)drpqry, SQL_NTS), stmt);
+    CHECK_SQL_S(SQLExecDirect(stmt, (SQLCHAR *)crtqry, SQL_NTS), stmt);
+
+    CHECK_SQL_S(SQLSpecialColumns(stmt, SQL_BEST_ROWID, NULL, SQL_NTS,
+        NULL, SQL_NTS, "tst_rowid", SQL_NTS,
+        SQL_SCOPE_SESSION, SQL_NULLABLE), stmt);
+
+    test_printf("\tTest single-col unique idx (non-pk) as rowid\n");
+    specialcolumns_check(tc, stmt, specialcols);
+
     free_statement(stmt);
 }
 
+/* Test recognizing a multi-column unique index as row id. */
+OT_TEST_METHOD(specialcolumns_multicol_uidx_as_rowid)
+{
+    SQLHANDLE stmt = get_statement();
+    const char *crtqry = "create table tst_rowid ("
+        "a int not null, b int not null, unique(a, b))";
+    const char *drpqry = "drop table if exists tst_rowid";
+    sc_row specialcols[] = {
+        {SQL_SCOPE_SESSION, "a",
+         SQL_INTEGER, "integer", 11, 11, 0, SQL_PC_NOT_PSEUDO},
+        {SQL_SCOPE_SESSION, "b",
+         SQL_INTEGER, "integer", 11, 11, 0, SQL_PC_NOT_PSEUDO},    
+    };
+
+    CHECK_SQL_S(SQLExecDirect(stmt, (SQLCHAR *)drpqry, SQL_NTS), stmt);
+    CHECK_SQL_S(SQLExecDirect(stmt, (SQLCHAR *)crtqry, SQL_NTS), stmt);
+
+    CHECK_SQL_S(SQLSpecialColumns(stmt, SQL_BEST_ROWID, NULL, SQL_NTS,
+        NULL, SQL_NTS, "tst_rowid", SQL_NTS,
+        SQL_SCOPE_SESSION, SQL_NULLABLE), stmt);
+
+    test_printf("\tTest multi-col unique idx (non-pk) as rowid\n");
+    specialcolumns_check(tc, stmt, specialcols);
+
+    free_statement(stmt);
+}
+
 /*
  * Test basic use of SQLPrimaryKeys.
  *

Modified: trunk/testsuites/t_jbalint/t_jbalint.h
===================================================================
--- trunk/testsuites/t_jbalint/t_jbalint.h	2007-03-06 14:14:10 UTC (rev 35)
+++ trunk/testsuites/t_jbalint/t_jbalint.h	2007-03-07 07:22:55 UTC (rev 36)
@@ -28,6 +28,8 @@
 OT_TEST_METHOD(describecol_alltypes);
 OT_TEST_METHOD(specialcolumns_nonulls);
 OT_TEST_METHOD(specialcolumns_pk_as_rowid);
+OT_TEST_METHOD(specialcolumns_uidx_as_rowid);
+OT_TEST_METHOD(specialcolumns_multicol_uidx_as_rowid);
 OT_TEST_METHOD(primarykeys);
 OT_TEST_METHOD(statistics);
 OT_TEST_METHOD(columns);

Modified: trunk/testsuites/t_jbalint/t_jbalint_suite.c
===================================================================
--- trunk/testsuites/t_jbalint/t_jbalint_suite.c	2007-03-06 14:14:10 UTC (rev 35)
+++ trunk/testsuites/t_jbalint/t_jbalint_suite.c	2007-03-07 07:22:55 UTC (rev 36)
@@ -29,6 +29,8 @@
     OT_SUITE_ADD_TEST(describecol_alltypes, NULL, NULL);
     OT_SUITE_ADD_TEST(specialcolumns_nonulls, NULL, NULL);
     OT_SUITE_ADD_TEST(specialcolumns_pk_as_rowid, NULL, NULL);
+    OT_SUITE_ADD_TEST(specialcolumns_uidx_as_rowid, NULL, NULL);
+    OT_SUITE_ADD_TEST(specialcolumns_multicol_uidx_as_rowid, NULL, NULL);
     OT_SUITE_ADD_TEST(primarykeys, NULL, NULL);
     OT_SUITE_ADD_TEST(statistics, NULL, NULL);
     OT_SUITE_ADD_TEST(columns, NULL, NULL);

Thread
ODBC C-tests commit: r36 - in trunk: include testsuites/t_jbalintjbalint7 Mar