Changeset: dfb66f0df8d9 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/dfb66f0df8d9
Branch: default
Log Message:

Merge with Mar2025 branch.


diffs (truncated from 615 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1644,6 +1644,7 @@ sql_part *partition_find_part(sql_trans 
 int pl_register(const char *name, pl_add_types_fptr add_types, pl_load_fptr 
pl_load);
 void pl_unregister(const char *name);
 prop *prop_create(allocator *sa, rel_prop kind, prop *pre);
+InstrPtr pushPtr(MalBlkPtr mb, InstrPtr q, ptr val);
 void qc_delete(qc *cache, cq *q);
 cq *qc_find(qc *cache, int id);
 cq *qc_insert(qc *cache, allocator *sa, sql_rel *r, symbol *s, list *params, 
mapi_query_t type, char *codedstr, int no_mitosis);
@@ -1681,7 +1682,10 @@ void sql_init_subtype(sql_subtype *res, 
 void sql_register(const char *name, const unsigned char *code);
 int sql_trans_add_dependency_change(sql_trans *tr, sqlid id, 
sql_dependency_change_type tp);
 int sql_trans_create_table(sql_table **tres, sql_trans *tr, sql_schema *s, 
const char *name, const char *sql, int tt, bit system, int persistence, int 
commit_action, int sz, bte properties);
+stmt *stmt_alias(backend *be, stmt *op1, int label, const char *tname, const 
char *name);
+stmt *stmt_blackbox_result(backend *be, InstrPtr q, int retnr, sql_subtype *t);
 stmt *stmt_func(backend *be, stmt *ops, const char *name, sql_rel *imp, int 
f_union);
+stmt *stmt_list(backend *be, list *l);
 
 # stream
 stream *block_stream(stream *s);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -776,6 +776,10 @@ la_bat_updates(logger *lg, logaction *la
                                                        b->tnokey[0] = 0;
                                                        b->tnokey[1] = 0;
                                                }
+                                               if (b->tminpos == q)
+                                                       b->tminpos = BUN_NONE;
+                                               if (b->tmaxpos == q)
+                                                       b->tmaxpos = BUN_NONE;
                                                b->tkey = false;
                                                b->tsorted = false;
                                                b->tkey = false;
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -86,7 +86,7 @@ dump_2(MalBlkPtr mb, const char *mod, co
        return q;
 }
 
-static InstrPtr
+InstrPtr
 pushPtr(MalBlkPtr mb, InstrPtr q, ptr val)
 {
        int _t;
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
+++ b/sql/backends/monet5/sql_statement.h
@@ -225,7 +225,7 @@ extern stmt *stmt_left_project(backend *
 extern stmt *stmt_dict(backend *be, stmt *op1, stmt *op2);
 extern stmt *stmt_for(backend *be, stmt *op1, stmt *minval);
 
-extern stmt *stmt_list(backend *be, list *l);
+sql_export stmt *stmt_list(backend *be, list *l);
 extern void stmt_set_nrcols(stmt *s);
 
 extern stmt *stmt_group(backend *be, stmt *op1, stmt *grp, stmt *ext, stmt 
*cnt, int done);
@@ -258,9 +258,9 @@ sql_export stmt *stmt_func(backend *be, 
 extern stmt *stmt_direct_func(backend *be, InstrPtr q);
 extern stmt *stmt_aggr(backend *be, stmt *op1, stmt *grp, stmt *ext, 
sql_subfunc *op, int reduce, int no_nil, int nil_if_empty);
 
-extern stmt *stmt_blackbox_result(backend *be, InstrPtr q, int retnr, 
sql_subtype *t);
+sql_export stmt *stmt_blackbox_result(backend *be, InstrPtr q, int retnr, 
sql_subtype *t);
 
-extern stmt *stmt_alias(backend *be, stmt *op1, int label, const char *tname, 
const char *name);
+sql_export stmt *stmt_alias(backend *be, stmt *op1, int label, const char 
*tname, const char *name);
 extern stmt *stmt_as(backend *be, stmt *s, stmt *org);
 
 extern int stmt_output(backend *be, stmt *l);
@@ -283,4 +283,5 @@ extern stmt *const_column(backend *ba, s
 extern stmt *stmt_fetch(backend *ba, stmt *val);
 extern stmt *stmt_rename(backend *ba, sql_exp *e, stmt *s);
 
+sql_export InstrPtr pushPtr(MalBlkPtr mb, InstrPtr q, ptr val);
 #endif /* _SQL_STATEMENT_H_ */
diff --git a/sql/backends/monet5/vaults/odbc/Tests/SingleServer 
b/sql/backends/monet5/vaults/odbc/Tests/SingleServer
deleted file mode 100644
--- a/sql/backends/monet5/vaults/odbc/Tests/SingleServer
+++ /dev/null
@@ -1,1 +0,0 @@
---loadmodule odbc_loader
diff --git a/sql/backends/monet5/vaults/odbc/odbc_loader.c 
b/sql/backends/monet5/vaults/odbc/odbc_loader.c
--- a/sql/backends/monet5/vaults/odbc/odbc_loader.c
+++ b/sql/backends/monet5/vaults/odbc/odbc_loader.c
@@ -15,6 +15,7 @@
 #include "rel_exp.h"
 
 #include "mal_exception.h"
+#include "mal_builder.h"
 #include "mal_client.h"
 
 //#ifdef _MSC_VER
@@ -29,28 +30,7 @@
 #include <sql.h>
 #include <sqlext.h>
 
-typedef struct odbc_loader_t {
-       SQLHANDLE env;
-       SQLHANDLE dbc;
-       SQLHANDLE stmt;
-       SQLSMALLINT nr_cols;
-} odbc_loader_t;
-
-static void
-odbc_cleanup(SQLHANDLE env, SQLHANDLE dbc, SQLHANDLE stmt) {
-       if (stmt != SQL_NULL_HSTMT) {
-               SQLFreeStmt(stmt, SQL_CLOSE);
-               SQLFreeHandle(SQL_HANDLE_STMT, stmt);
-       }
-       if (dbc != SQL_NULL_HDBC) {
-               SQLDisconnect(dbc);
-               SQLFreeHandle(SQL_HANDLE_DBC, dbc);
-       }
-       if (env != SQL_NULL_HENV) {
-               SQLFreeHandle(SQL_HANDLE_ENV, env);
-       }
-}
-
+/* map ODBC SQL datatype to MonetDB SQL datatype */
 static sql_subtype *
 map_rescol_type(SQLSMALLINT dataType, SQLULEN columnSize, SQLSMALLINT 
decimalDigits, mvc * sql)
 {
@@ -103,7 +83,9 @@ map_rescol_type(SQLSMALLINT dataType, SQ
                typenm = "double";
                break;
        case SQL_FLOAT:
-               /* the precision of SQL_FLOAT can be either 24 or 53: if it is 
24, the SQL_FLOAT data type is the same as SQL_REAL; if it is 53, the SQL_FLOAT 
data type is the same as SQL_DOUBLE. */
+               /* the precision of SQL_FLOAT can be either 24 or 53:
+                  if it is 24, the SQL_FLOAT data type is the same as SQL_REAL;
+                  if it is 53, the SQL_FLOAT data type is the same as 
SQL_DOUBLE. */
                typenm = (columnSize == 7) ? "real" : "double";
                break;
 
@@ -181,6 +163,7 @@ map_rescol_type(SQLSMALLINT dataType, SQ
        return sql_bind_subtype(sql->sa, typenm, interval_type, 0);
 }
 
+/* return name for ODBC SQL datatype */
 static char *
 nameofSQLtype(SQLSMALLINT dataType)
 {
@@ -228,22 +211,44 @@ nameofSQLtype(SQLSMALLINT dataType)
        }
 }
 
+/* utility function to nicely close all opened ODBC resources */
+static void
+odbc_cleanup(SQLHANDLE env, SQLHANDLE dbc, SQLHANDLE stmt) {
+       SQLRETURN ret = SQL_SUCCESS;
+
+       if (stmt != SQL_NULL_HSTMT) {
+               ret = SQLFreeStmt(stmt, SQL_CLOSE);
+               if (ret != SQL_INVALID_HANDLE)
+                       SQLFreeHandle(SQL_HANDLE_STMT, stmt);
+       }
+       if (dbc != SQL_NULL_HDBC) {
+               ret = SQLDisconnect(dbc);
+               if (ret != SQL_INVALID_HANDLE)
+                       SQLFreeHandle(SQL_HANDLE_DBC, dbc);
+       }
+       if (env != SQL_NULL_HENV) {
+               SQLFreeHandle(SQL_HANDLE_ENV, env);
+       }
+}
+
+typedef struct odbc_loader_t {
+       SQLHANDLE env;
+       SQLHANDLE dbc;
+       SQLHANDLE stmt;
+       SQLSMALLINT nr_cols;
+} odbc_loader_t;
+
+
 /*
- * returns an error string (static or via tmp sa_allocator allocated), NULL on 
success
- *
- * Extend the subfunc f with result columns, ie.
-       f->res = typelist;
-       f->coltypes = typelist;
-       f->colnames = nameslist; use tname if passed, for the relation name
- * Fill the list res_exps, with one result expressions per resulting column.
+ * odbc_query() contains the logic for both odbc_relation() and ODBCloader()
+ * the caller arg is 1 when called from odbc_relation and 2 when called from 
ODBCloader
  */
 static str
-odbc_query(mvc *sql, sql_subfunc *f, char *url, list *res_exps, sql_exp *topn, 
int caller)
+odbc_query(mvc *sql, sql_subfunc *f, char *url, list *res_exps, int caller)
 {
-       (void) topn;
        bool trace_enabled = false;     /* used for development only */
 
-       /* check received url and extract the ODBC connection string and yhe 
SQL query */
+       /* check received url and extract the ODBC connection string and the 
SQL query */
        if (!url || (url && strncasecmp("odbc:", url, 5) != 0))
                return "Invalid URI. Must start with 'odbc:'.";
 
@@ -267,11 +272,11 @@ odbc_query(mvc *sql, sql_subfunc *f, cha
        // create a new ODBC connection string without the QUERY= part
        char * odbc_con_str = GDKstrndup(con_str, qry_str - con_str);
 
+       // trace_enabled = true;
        if (trace_enabled)
-               printf("\nExtracted ODBC connection string: %s\nand SQL query: 
%s\n", odbc_con_str, query);
+               printf("\nExtracted ODBC connection string: %s\n  and SQL 
query: %s\n", odbc_con_str, query);
 
-
-       /* now we can try to connect to the ODBC driver and execute the SQL 
query */
+       /* now we can (try to) connect to the ODBC driver and execute the SQL 
query */
        SQLRETURN ret = SQL_INVALID_HANDLE;
        SQLHANDLE env = SQL_NULL_HENV;
        SQLHANDLE dbc = SQL_NULL_HDBC;
@@ -288,11 +293,18 @@ odbc_query(mvc *sql, sql_subfunc *f, cha
                errmsg = "SQLSetEnvAttr (SQL_ATTR_ODBC_VERSION ODBC3) failed.";
                goto finish;
        }
+
        ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
        if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
                errmsg = "Allocate ODBC DBC handle failed.";
                goto finish;
        }
+       /* to avoid an endless blocking SQLDriverConnect() set a login timeout 
of 8s */
+       ret = SQLSetConnectAttr(dbc, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER) 
(uintptr_t) 8UL, 0);
+       if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
+               errmsg = "SQLSetConnectAttr (SQL_ATTR_LOGIN_TIMEOUT 8s) 
failed.";
+               goto finish;
+       }
 
        SQLSMALLINT len = 0;
        ret = SQLDriverConnect(dbc, NULL, (SQLCHAR *) odbc_con_str, SQL_NTS, 
NULL, 0, &len, SQL_DRIVER_NOPROMPT);
@@ -334,6 +346,8 @@ odbc_query(mvc *sql, sql_subfunc *f, cha
        if (caller == 1) {
                char tname[1024];
                char cname[1024];
+               char * tblname;
+               char * colname;
                SQLSMALLINT dataType = 0;
                SQLULEN columnSize = 0;
                SQLSMALLINT decimalDigits = 0;
@@ -343,7 +357,7 @@ odbc_query(mvc *sql, sql_subfunc *f, cha
                for (SQLUSMALLINT col = 1; col <= (SQLUSMALLINT) nr_cols; 
col++) {
                        /* for each result column get name, datatype, size and 
decdigits */
                        ret = SQLDescribeCol(stmt, col, (SQLCHAR *) cname, 
(SQLSMALLINT) sizeof(cname),
-                               NULL, &dataType, &columnSize, &decimalDigits, 
NULL);
+                                       NULL, &dataType, &columnSize, 
&decimalDigits, NULL);
                        if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) 
{
                                errmsg = "SQLDescribeCol failed.";
                                goto finish;
@@ -351,7 +365,8 @@ odbc_query(mvc *sql, sql_subfunc *f, cha
                        if (trace_enabled)
                                printf("ResCol %d, name: %s, type %d (%s), size 
%d, decdigits %d\n",
                                        col, cname, (int)dataType, 
nameofSQLtype(dataType), (int)columnSize, (int)decimalDigits);
-                       list_append(nameslist, sa_strdup(sql->sa, cname));
+                       colname = sa_strdup(sql->sa, cname);
+                       list_append(nameslist, colname);
                        sql_mtype = map_rescol_type(dataType, columnSize, 
decimalDigits, sql);
                        list_append(typelist, sql_mtype);
 
@@ -360,16 +375,17 @@ odbc_query(mvc *sql, sql_subfunc *f, cha
                        if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) 
{
                                strcpy(tname, "");
                        }
-                       sql_exp *ne = exp_column(sql->sa, sa_strdup(sql->sa, 
tname), sa_strdup(sql->sa, cname), sql_mtype, CARD_MULTI, 1, 0, 0);
+                       tblname = sa_strdup(sql->sa, tname);
+                       sql_exp *ne = exp_column(sql->sa, tblname, colname, 
sql_mtype, CARD_MULTI, 1, 0, 0);
                        set_basecol(ne);
                        ne->alias.label = -(sql->nid++);
                        list_append(res_exps, ne);
                }
 
                f->tname = sa_strdup(sql->sa, tname);
-               f->res = typelist;
+               f->colnames = nameslist;
                f->coltypes = typelist;
-               f->colnames = nameslist;
+               f->res = typelist;
 
                odbc_loader_t *r = (odbc_loader_t *)sa_alloc(sql->sa, 
sizeof(odbc_loader_t));
                r->env = env;
@@ -381,9 +397,8 @@ odbc_query(mvc *sql, sql_subfunc *f, cha
                goto finish;
        }
 
-       /* when called from odbc_load() we can now fetch the data */
-       if (caller == 2 && stmt != SQL_NULL_HSTMT) {
-               //odbc_loader_t *r = (odbc_loader_t *)f->sname;
+       /* when called from odbc_load() */
+       if (caller == 2) {
                sql_table *t;
 
                if (trace_enabled)
@@ -397,38 +412,60 @@ odbc_query(mvc *sql, sql_subfunc *f, cha
                        printf("After mvc_create_table()\n");
 
                node *n, *nn = f->colnames->h, *tn = f->coltypes->h;
-               for (n = f->res->h; n; n = n->next, nn = nn->next, tn = 
tn->next) {
+               int col = 1;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to