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]