Changeset: 1fcc6b61b775 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1fcc6b61b775
Modified Files:
        sql/backends/monet5/sql.c
        sql/storage/bat/bat_storage.c
Branch: properties
Log Message:

Merged with default


diffs (269 lines):

diff --git a/clients/odbc/ChangeLog b/clients/odbc/ChangeLog
--- a/clients/odbc/ChangeLog
+++ b/clients/odbc/ChangeLog
@@ -1,3 +1,9 @@
 # ChangeLog file for odbc
 # This file is updated with Maddlog
 
+* Thu Apr 21 2022 Martin van Dinther <martin.van.dint...@monetdbsolutions.com>
+- Corrected ODBC API functions SQLPrimaryKeys(), SQLSpecialColumns() and
+  SQLStatistics() for local temporary tables located in schema tmp. They did
+  not return any rows when the temp table had a primary or unique key or
+  index. Now they do return rows as expected.
+
diff --git a/clients/odbc/driver/SQLPrimaryKeys.c 
b/clients/odbc/driver/SQLPrimaryKeys.c
--- a/clients/odbc/driver/SQLPrimaryKeys.c
+++ b/clients/odbc/driver/SQLPrimaryKeys.c
@@ -45,6 +45,7 @@ MNDBPrimaryKeys(ODBCStmt *stmt,
        size_t querylen;
        size_t pos = 0;
        char *sch = NULL, *tab = NULL;
+       char *sysORtmp = "sys";
 
        /* deal with SQL_NTS and SQL_NULL_DATA */
        fixODBCstring(CatalogName, NameLength1, SQLSMALLINT,
@@ -60,6 +61,12 @@ MNDBPrimaryKeys(ODBCStmt *stmt,
                addStmtError(stmt, "HY009", NULL, 0);
                return SQL_ERROR;
        }
+       if (NameLength3 == 0) {
+               /* Invalid string or buffer length */
+               addStmtError(stmt, "HY090", NULL, 0);
+               return SQL_ERROR;
+       }
+
 #ifdef ODBCDEBUG
        ODBCLOG("\"%.*s\" \"%.*s\" \"%.*s\"\n",
                (int) NameLength1, CatalogName ? (char *) CatalogName : "",
@@ -106,6 +113,9 @@ MNDBPrimaryKeys(ODBCStmt *stmt,
        if (query == NULL)
                goto nomem;
 
+       if (SchemaName != NULL && strcmp((const char *) SchemaName, "tmp") == 0)
+               sysORtmp = "tmp";
+
        /* SQLPrimaryKeys returns a table with the following columns:
           VARCHAR      table_cat
           VARCHAR      table_schem
@@ -121,13 +131,14 @@ MNDBPrimaryKeys(ODBCStmt *stmt,
                      "kc.name as column_name, "
                      "cast(kc.nr + 1 as smallint) as key_seq, "
                      "k.name as pk_name "
-              "from sys.schemas s, sys.tables t, "
-                   "sys.keys k, sys.objects kc "
+              "from sys.schemas s, %s._tables t, "
+                   "%s.keys k, %s.objects kc "
               "where k.id = kc.id and "
                     "k.table_id = t.id and "
                     "t.schema_id = s.id and "
                     "k.type = 0",
-               stmt->Dbc->dbname);
+               stmt->Dbc->dbname,
+               sysORtmp, sysORtmp, sysORtmp);
        assert(pos < 800);
 
        /* Construct the selection condition query part */
diff --git a/clients/odbc/driver/SQLSpecialColumns.c 
b/clients/odbc/driver/SQLSpecialColumns.c
--- a/clients/odbc/driver/SQLSpecialColumns.c
+++ b/clients/odbc/driver/SQLSpecialColumns.c
@@ -95,6 +95,7 @@ MNDBSpecialColumns(ODBCStmt *stmt,
        size_t querylen;
        size_t pos = 0;
        char *sch = NULL, *tab = NULL;
+       char *sysORtmp = "sys";
 
        fixODBCstring(CatalogName, NameLength1, SQLSMALLINT, addStmtError, 
stmt, return SQL_ERROR);
        fixODBCstring(SchemaName, NameLength2, SQLSMALLINT, addStmtError, stmt, 
return SQL_ERROR);
@@ -204,6 +205,9 @@ MNDBSpecialColumns(ODBCStmt *stmt,
                if (query == NULL)
                        goto nomem;
 
+               if (SchemaName != NULL && strcmp((const char *) SchemaName, 
"tmp") == 0)
+                       sysORtmp = "tmp";
+
                /* Note: SCOPE is SQL_SCOPE_TRANSACTION */
                /* Note: PSEUDO_COLUMN is SQL_PC_NOT_PSEUDO */
                pos += snprintf(query + pos, querylen - pos,
@@ -218,10 +222,10 @@ MNDBSpecialColumns(ODBCStmt *stmt,
                        DECIMAL_DIGITS(c) ", "
                               "cast(%d as smallint) as pseudo_column "
                         "from sys.schemas s, "
-                             "sys.tables t, "
-                             "sys.columns c, "
-                             "sys.keys k, "
-                             "sys.objects kc "
+                             "%s._tables t, "
+                             "%s._columns c, "
+                             "%s.keys k, "
+                             "%s.objects kc "
                         "where s.id = t.schema_id and "
                               "t.id = c.table_id and "
                               "t.id = k.table_id and "
@@ -246,7 +250,8 @@ MNDBSpecialColumns(ODBCStmt *stmt,
                        DECIMAL_DIGITS_ARGS,
 #endif
                        /* pseudo_column: */
-                       SQL_PC_NOT_PSEUDO);
+                       SQL_PC_NOT_PSEUDO,
+                       sysORtmp, sysORtmp, sysORtmp, sysORtmp);
                assert(pos < 4300);
                /* TODO: improve the SQL to get the correct result:
                   - only one set of columns should be returned, also
@@ -285,11 +290,11 @@ MNDBSpecialColumns(ODBCStmt *stmt,
                        pos += strcpy_len(query + pos, " and c.\"null\" = 
false", querylen - pos);
                }
 
-               pos += strcpy_len(query + pos,
+               pos += snprintf(query + pos, querylen - pos,
                       "), "
                        "tid as ("
                           "select t.id as tid "
-                           "from sys._tables t, sys.keys k "
+                           "from %s._tables t, %s.keys k "
                            "where t.id = k.table_id and k.type = 0"
                       ") "
                        "select sc.scope, sc.column_name, sc.data_type, "
@@ -301,7 +306,7 @@ MNDBSpecialColumns(ODBCStmt *stmt,
                               "sc.table_id in (select tid from tid)) or "
                              "(sc.type = 1 and "
                               "sc.table_id not in (select tid from tid))",
-                       querylen - pos);
+                       sysORtmp, sysORtmp);
 
                /* ordering on SCOPE not needed (since it is constant) */
        } else {
diff --git a/clients/odbc/driver/SQLStatistics.c 
b/clients/odbc/driver/SQLStatistics.c
--- a/clients/odbc/driver/SQLStatistics.c
+++ b/clients/odbc/driver/SQLStatistics.c
@@ -76,6 +76,7 @@ MNDBStatistics(ODBCStmt *stmt,
        size_t querylen;
        size_t pos = 0;
        char *sch = NULL, *tab = NULL;
+       char *sysORtmp = "sys";
 
        fixODBCstring(TableName, NameLength3, SQLSMALLINT,
                      addStmtError, stmt, return SQL_ERROR);
@@ -114,7 +115,6 @@ MNDBStatistics(ODBCStmt *stmt,
                return SQL_ERROR;
        }
 
-
        /* check if a valid (non null, not empty) table name is supplied */
        if (TableName == NULL) {
                /* Invalid use of null pointer */
@@ -166,6 +166,9 @@ MNDBStatistics(ODBCStmt *stmt,
        if (query == NULL)
                goto nomem;
 
+       if (SchemaName != NULL && strcmp((const char *) SchemaName, "tmp") == 0)
+               sysORtmp = "tmp";
+
        /* SQLStatistics returns a table with the following columns:
           VARCHAR      table_cat
           VARCHAR      table_schem
@@ -198,12 +201,12 @@ MNDBStatistics(ODBCStmt *stmt,
                       "cast(null as integer) as cardinality, "
                       "cast(null as integer) as pages, "
                       "cast(null as varchar(1)) as filter_condition "
-               "from sys.idxs i, "
+               "from %s.idxs i, "
                     "sys.schemas s, "
-                    "sys.tables t, "
-                    "sys.columns c, "
-                    "sys.objects kc, "
-                    "sys.keys k "
+                    "%s._tables t, "
+                    "%s._columns c, "
+                    "%s.objects kc, "
+                    "%s.keys k "
                "where i.table_id = t.id and "
                      "t.schema_id = s.id and "
                      "i.id = kc.id and "
@@ -212,7 +215,8 @@ MNDBStatistics(ODBCStmt *stmt,
                      "k.name = i.name and "
                      "k.type in (0, 1)",
                stmt->Dbc->dbname,
-               SQL_INDEX_HASHED, SQL_INDEX_OTHER);
+               SQL_INDEX_HASHED, SQL_INDEX_OTHER,
+               sysORtmp, sysORtmp, sysORtmp, sysORtmp, sysORtmp);
        assert(pos < 1000);
 
        /* Construct the selection condition query part */
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2457,7 +2457,7 @@ BATmode(BAT *b, bool transient)
 #ifdef NDEBUG
 /* assertions are disabled, turn failing tests into a message */
 #undef assert
-#define assert(test)   ((void) ((test) || (TRC_CRITICAL_ENDIF(CHECK, 
"Assertion `%s' failed\n", #test), 0)))
+#define assert(test)   ((void) ((test) || (TRC_CRITICAL_ENDIF(CHECK_, 
"Assertion `%s' failed\n", #test), 0)))
 #endif
 
 /* Assert that properties are set correctly.
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -4892,11 +4892,11 @@ SQLstr_column_vacuum(Client cntxt, MalBl
                throw(SQL, "sql.str_column_vacuum", SQLSTATE(42000) "%s '%s' is 
not persistent",
                          TABLE_TYPE_DESCRIPTION(t->type, t->properties), 
t->base.name);
        if (isTempTable(t))
-               throw(SQL, "sql.str_column_vacuum", SQLSTATE(42000) "Cannot 
vaccum column from temporary table");
+               throw(SQL, "sql.str_column_vacuum", SQLSTATE(42000) "Cannot 
vacuum column from temporary table");
        if ((c = mvc_bind_column(m, t, cname)) == NULL)
                throw(SQL, "sql.str_column_vacuum", SQLSTATE(42S22) "Column not 
found %s.%s",sname,tname);
        if (c->storage_type)
-               throw(SQL, "sql.str_column_vacuum", SQLSTATE(42000) "Cannot 
vaccum compressed column");
+               throw(SQL, "sql.str_column_vacuum", SQLSTATE(42000) "Cannot 
vacuum compressed column");
 
        return do_str_column_vacuum(tr, c, sname, tname, cname);
 }
@@ -5029,11 +5029,11 @@ SQLstr_column_auto_vacuum(Client cntxt, 
                throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000) "%s 
'%s' is not persistent",
                          TABLE_TYPE_DESCRIPTION(t->type, t->properties), 
t->base.name);
        if (isTempTable(t))
-               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000) 
"Cannot vaccum column from temporary table");
+               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000) 
"Cannot vacuum column from temporary table");
        if ((c = mvc_bind_column(m, t, cname)) == NULL)
                throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42S22) 
"Column not found %s.%s",sname,tname);
        if (c->storage_type)
-               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000) 
"Cannot vaccum compressed column");
+               throw(SQL, "sql.str_column_auto_vacuum", SQLSTATE(42000) 
"Cannot vacuum compressed column");
 
        if (!(sname_copy = GDKstrdup(sname)) || !(tname_copy = 
GDKstrdup(tname)) || !(cname_copy = GDKstrdup(cname))) {
                GDKfree(sname_copy);
@@ -5084,7 +5084,7 @@ SQLstr_column_stop_vacuum(Client cntxt, 
                throw(SQL, "sql.str_column_stop_vacuum", SQLSTATE(42000) "%s 
'%s' is not persistent",
                          TABLE_TYPE_DESCRIPTION(t->type, t->properties), 
t->base.name);
        if (isTempTable(t))
-               throw(SQL, "sql.str_column_stop_vacuum", SQLSTATE(42000) 
"Cannot vaccum column from temporary table");
+               throw(SQL, "sql.str_column_stop_vacuum", SQLSTATE(42000) 
"Cannot vacuum column from temporary table");
        if ((c = mvc_bind_column(m, t, cname)) == NULL)
                throw(SQL, "sql.str_column_stop_vacuum", SQLSTATE(42S22) 
"Column not found %s.%s",sname,tname);
 
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -2314,15 +2314,13 @@ delta_append_val(sql_trans *tr, sql_delt
        if (cnt) {
                if (BATcount(b) < offset) { /* add space */
                        const void *tv = ATOMnilptr(b->ttype);
-                       lng j, d = offset - BATcount(b);
-                       for(j=0;j<d;j++) {
-                               if (BUNappend(b, tv, true) != GDK_SUCCEED) {
-                                       bat_destroy(b);
-                                       if (i != oi)
-                                               GDKfree(i);
-                                       unlock_column(tr->store, id);
-                                       return LOG_ERR;
-                               }
+                       lng d = offset - BATcount(b);
+                       if (BUNappendmulti(b, tv, d, true) != GDK_SUCCEED) {
+                               bat_destroy(b);
+                               if (i != oi)
+                                       GDKfree(i);
+                               unlock_column(tr->store, id);
+                               return LOG_ERR;
                        }
                }
                if (BUNappendmulti(b, i, cnt, true) != GDK_SUCCEED) {
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to