Changeset: 7b1014a306e0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7b1014a306e0
Modified Files:
        clients/odbc/driver/SQLColumns.c
Branch: Aug2011
Log Message:

Fix SQLColumns.
At some point (probably long ago) the representation of the various
interval types was changed.  Adapt to that.
Also, when catalogs aren't used, the value is supposed to be NULL, not
the empty string.


diffs (169 lines):

diff --git a/clients/odbc/driver/SQLColumns.c b/clients/odbc/driver/SQLColumns.c
--- a/clients/odbc/driver/SQLColumns.c
+++ b/clients/odbc/driver/SQLColumns.c
@@ -148,7 +148,7 @@ SQLColumns_(ODBCStmt *stmt,
 
        sprintf(query_end,
                "select "
-               "cast('' as varchar(1)) as table_cat, "
+               "cast(NULL as varchar(1)) as table_cat, "
                "s.\"name\" as table_schem, "
                "t.\"name\" as table_name, "
                "c.\"name\" as column_name, "
@@ -252,9 +252,42 @@ SQLColumns_(ODBCStmt *stmt,
                        concise_type = ODBCConciseType(tuples[i][5]);
                        free((void *) tuples[i][5]);
                        switch (concise_type) {
+                       case SQL_INTERVAL_MONTH: {
+                               int q1 = atoi(tuples[i][6]);
+
+                               /* we assume a leading precision of 6 */
+                               free((void *) tuples[i][6]);
+                               tuples[i][6] = NULL;
+                               free((void *) tuples[i][7]);
+                               tuples[i][7] = NULL;
+                               free((void *) tuples[i][8]);
+                               tuples[i][8] = NULL;
+                               switch (q1) {
+                               case 1:
+                                       concise_type = SQL_INTERVAL_YEAR;
+                                       tuples[i][6] = strdup("26");
+                                       tuples[i][7] = strdup("26");
+                                       tuples[i][8] = strdup("0");
+                                       break;
+                               case 2:
+                                       concise_type = 
SQL_INTERVAL_YEAR_TO_MONTH;
+                                       tuples[i][6] = strdup("38");
+                                       tuples[i][7] = strdup("38");
+                                       tuples[i][8] = strdup("0");
+                                       break;
+                               case 3:
+                                       concise_type = SQL_INTERVAL_MONTH;
+                                       tuples[i][6] = strdup("27");
+                                       tuples[i][7] = strdup("27");
+                                       tuples[i][8] = strdup("0");
+                                       break;
+                               default:
+                                       assert(0);
+                               }
+                               break;
+                       }
                        case SQL_INTERVAL_SECOND: {
-                               int q2 = atoi(tuples[i][7]);
-                               int q1 = atoi(tuples[i][8]);
+                               int q1 = atoi(tuples[i][6]);
 
                                /* we assume a leading precision of 6
                                   and a second precision of 0 */
@@ -264,88 +297,70 @@ SQLColumns_(ODBCStmt *stmt,
                                tuples[i][7] = NULL;
                                free((void *) tuples[i][8]);
                                tuples[i][8] = NULL;
-                               if (q1 == 3 && q2 == 3) {
+                               switch (q1) {
+                               case 4:
                                        concise_type = SQL_INTERVAL_DAY;
                                        tuples[i][6] = strdup("25");
                                        tuples[i][7] = strdup("25");
                                        tuples[i][8] = strdup("0");
-                               } else if (q1 == 3 && q2 == 4) {
+                                       break;
+                               case 5:
                                        concise_type = SQL_INTERVAL_DAY_TO_HOUR;
                                        tuples[i][6] = strdup("36");
                                        tuples[i][7] = strdup("36");
                                        tuples[i][8] = strdup("0");
-                               } else if (q1 == 3 && q2 == 5) {
+                                       break;
+                               case 6:
                                        concise_type = 
SQL_INTERVAL_DAY_TO_MINUTE;
                                        tuples[i][6] = strdup("41");
                                        tuples[i][7] = strdup("41");
                                        tuples[i][8] = strdup("0");
-                               } else if (q1 == 3 && q2 == 6) {
+                                       break;
+                               case 7:
                                        concise_type = 
SQL_INTERVAL_DAY_TO_SECOND;
                                        tuples[i][6] = strdup("47");
                                        tuples[i][7] = strdup("47");
                                        tuples[i][8] = strdup("0");
-                               } else if (q1 == 4 && q2 == 4) {
+                                       break;
+                               case 8:
                                        concise_type = SQL_INTERVAL_HOUR;
                                        tuples[i][6] = strdup("26");
                                        tuples[i][7] = strdup("26");
                                        tuples[i][8] = strdup("0");
-                               } else if (q1 == 4 && q2 == 5) {
+                                       break;
+                               case 9:
                                        concise_type = 
SQL_INTERVAL_HOUR_TO_MINUTE;
                                        tuples[i][6] = strdup("39");
                                        tuples[i][7] = strdup("39");
                                        tuples[i][8] = strdup("0");
-                               } else if (q1 == 4 && q2 == 6) {
+                                       break;
+                               case 10:
                                        concise_type = 
SQL_INTERVAL_HOUR_TO_SECOND;
                                        tuples[i][6] = strdup("45");
                                        tuples[i][7] = strdup("45");
                                        tuples[i][8] = strdup("0");
-                               } else if (q1 == 5 && q2 == 5) {
+                                       break;
+                               case 11:
                                        concise_type = SQL_INTERVAL_MINUTE;
                                        tuples[i][6] = strdup("28");
                                        tuples[i][7] = strdup("28");
                                        tuples[i][8] = strdup("0");
-                               } else if (q1 == 5 && q2 == 6) {
+                                       break;
+                               case 12:
                                        concise_type = 
SQL_INTERVAL_MINUTE_TO_SECOND;
                                        tuples[i][6] = strdup("44");
                                        tuples[i][7] = strdup("44");
                                        tuples[i][8] = strdup("0");
-                               } else if (q1 == 6 && q2 == 6) {
+                                       break;
+                               case 13:
                                        concise_type = SQL_INTERVAL_SECOND;
                                        tuples[i][6] = strdup("30");
                                        tuples[i][7] = strdup("30");
                                        tuples[i][8] = strdup("0");
-                               } else
+                                       break;
+                               default:
                                        assert(0);
-                               break;
-                       }
-                       case SQL_INTERVAL_MONTH: {
-                               int q2 = atoi(tuples[i][7]);
-                               int q1 = atoi(tuples[i][8]);
-
-                               /* we assume a leading precision of 6 */
-                               free((void *) tuples[i][6]);
-                               tuples[i][6] = NULL;
-                               free((void *) tuples[i][7]);
-                               tuples[i][7] = NULL;
-                               free((void *) tuples[i][8]);
-                               tuples[i][8] = NULL;
-                               if (q1 == 1 && q2 == 1) {
-                                       concise_type = SQL_INTERVAL_YEAR;
-                                       tuples[i][6] = strdup("26");
-                                       tuples[i][7] = strdup("26");
-                                       tuples[i][8] = strdup("0");
-                               } else if (q1 == 1 && q2 == 2) {
-                                       concise_type = 
SQL_INTERVAL_YEAR_TO_MONTH;
-                                       tuples[i][6] = strdup("38");
-                                       tuples[i][7] = strdup("38");
-                                       tuples[i][8] = strdup("0");
-                               } else if (q1 == 2 && q2 == 2) {
-                                       concise_type = SQL_INTERVAL_MONTH;
-                                       tuples[i][6] = strdup("27");
-                                       tuples[i][7] = strdup("27");
-                                       tuples[i][8] = strdup("0");
-                               } else
-                                       assert(0);
+                               }
                                break;
                        }
                        case SQL_DOUBLE:
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to