Changeset: ce7f6e841c59 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ce7f6e841c59
Modified Files:
gdk/gdk_bbp.c
Branch: default
Log Message:
Merge with Mar2025 branch.
diffs (truncated from 1546 to 300 lines):
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c
--- a/clients/mapiclient/mclient.c
+++ b/clients/mapiclient/mclient.c
@@ -1382,7 +1382,8 @@ SQLrenderer(MapiHdl hdl)
strcmp(s, "clob") != 0 &&
strcmp(s, "char") != 0 &&
strcmp(s, "str") != 0 &&
- strcmp(s, "json") != 0)) {
+ strcmp(s, "json") != 0 &&
+ strcmp(s, "uuid") != 0)) {
/* no table width known, use maximum,
* rely on squeezing later on to fix
* it to whatever is available; note
diff --git a/gdk/CMakeLists.txt b/gdk/CMakeLists.txt
--- a/gdk/CMakeLists.txt
+++ b/gdk/CMakeLists.txt
@@ -16,7 +16,6 @@ set(gdk_public_headers
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_posix.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_atoms.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_tracer.h>
- $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_delta.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_hash.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_bbp.h>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/gdk_utils.h>
@@ -28,7 +27,6 @@ set(gdk_public_headers
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_posix.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_atoms.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_tracer.h>
- $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_delta.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_hash.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_bbp.h>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/monetdb/gdk_utils.h>
@@ -71,7 +69,7 @@ target_sources(bat
gdk_rsort.c
gdk_storage.c
gdk_bat.c
- gdk_delta.c gdk_delta.h
+ gdk_delta.c
gdk_cross.c
gdk_system.c
gdk_value.c
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1890,7 +1890,8 @@ gdk_export gdk_return BATorderidx(BAT *b
gdk_export gdk_return GDKmergeidx(BAT *b, BAT**a, int n_ar);
gdk_export bool BATcheckorderidx(BAT *b);
-#include "gdk_delta.h"
+#define DELTAdirty(b) ((b)->batInserted < BATcount(b))
+
#include "gdk_hash.h"
#include "gdk_bbp.h"
#include "gdk_utils.h"
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -276,7 +276,6 @@ COLnew2(oid hseq, int tt, BUN cap, role_
HEAPfree(bn->theap, true);
goto bailout;
}
- DELTAinit(bn);
if (BBPcacheit(bn, true) != GDK_SUCCEED) {
/* cannot happen, function always returns success */
goto bailout;
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2995,19 +2995,6 @@ decref(bat i, bool logical, bool lock, c
MT_lock_set(&b->theaplock);
locked = true;
}
-#if 0
- if (b->batCount > b->batInserted && !isVIEW(b)) {
- /* if batCount is larger than batInserted and
- * the dirty bits are off, it may be that a
- * (sub)commit happened in parallel to an
- * update; we must undo the turning off of the
- * dirty bits */
- if (b->theap && b->theap->parentid == i)
- b->theap->dirty = true;
- if (b->tvheap && b->tvheap->parentid == i)
- b->tvheap->dirty = true;
- }
-#endif
if (b->theap)
farmid = b->theap->farmid;
}
diff --git a/gdk/gdk_delta.h b/gdk/gdk_delta.h
deleted file mode 100644
--- a/gdk/gdk_delta.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * SPDX-License-Identifier: MPL-2.0
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright 2024, 2025 MonetDB Foundation;
- * Copyright August 2008 - 2023 MonetDB B.V.;
- * Copyright 1997 - July 2008 CWI.
- */
-
-#ifndef _GDK_DELTA_H_
-#define _GDK_DELTA_H_
-
-/*
- * We make sure here that the BUNs section of a BAT at least starts 4
- * bytes from the BUN start. This ensures that the first data item of
- * e.g. a BAT[void,bit] is (at least) integer aligned. This optimizes
- * processing on such BATs (DDBENCH).
- */
-static inline void
-DELTAinit(BAT *b)
-{
- BATsetcount(b, 0);
- b->theap->free = 0;
- b->batInserted = 0;
- b->tshift = ATOMelmshift(b->twidth);
- TRC_DEBUG(DELTA,
- "%s free %zu ins " BUNFMT " base %p\n",
- BBP_logical(b->batCacheid),
- b->theap->free,
- b->batInserted,
- b->theap->base);
-}
-
-/*
- * Upon saving a BAT, we should convert the delta marker BUN pointers
- * into indexes and convert them back into pointers upon reload.
- *
- * The BATdirty(b) tells you whether a BAT's main memory
- * representation differs from its saved image on stable storage. But
- * *not* whether it has changed since last transaction commit (it can
- * be storage-clean, but transaction-dirty). For this we have
- * DELTAdirty(b).
- */
-#define DELTAdirty(b) ((b)->batInserted < BATcount(b))
-
-#endif /* _GDK_DELTA_H_ */
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2976,9 +2976,8 @@ hashjoin(BAT **r1p, BAT **r2p, BAT **r3p
b = BATdescriptor(VIEWtparent(r));
if (b == NULL)
goto bailout;
- TRC_DEBUG(ALGO, "%s(%s): using "
+ TRC_DEBUG(ALGO, "%s: using "
"parent(" ALGOBATFMT ") for hash%s\n",
- __func__,
BATgetId(r), ALGOBATPAR(b),
swapped ? " (swapped)" : "");
roff = r->tbaseoff - b->tbaseoff;
diff --git a/sql/backends/monet5/vaults/monetdb/monetdb.c
b/sql/backends/monet5/vaults/monetdb/monetdb.c
--- a/sql/backends/monet5/vaults/monetdb/monetdb.c
+++ b/sql/backends/monet5/vaults/monetdb/monetdb.c
@@ -107,7 +107,16 @@ monetdb_relation(mvc *sql, sql_subfunc *
});
if ((hdl = mapi_query(dbh, query)) == NULL || mapi_error(dbh)) {
- ret = sa_strdup(sql->sa, mapi_error_str(dbh));
+ const char *err = mapi_error_str(dbh);
+ if (err)
+ ret = sa_strdup(sql->sa, err);
+ else
+ ret = sa_message(sql->sa, "Failed to access remote
server");
+ goto end;
+ }
+
+ if (mapi_get_row_count(hdl) == 0) { /* non existing table */
+ ret = sa_message(sql->sa, "Table %s.%s is missing on remote
server", sname, tname);
goto end;
}
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
@@ -13,7 +13,8 @@
#include "monetdb_config.h"
#include "rel_proto_loader.h"
#include "rel_exp.h"
-
+#include "gdk.h" // COLnew(), BUNappend()
+#include "gdk_time.h" // date_create(), daytime_create(), timestamp_create()
#include "mal_exception.h"
#include "mal_builder.h"
#include "mal_client.h"
@@ -30,6 +31,15 @@
#include <sql.h>
#include <sqlext.h>
+
+#define ODBC_RELATION 1
+#define ODBC_LOADER 2
+
+#define QUERY_MAX_COLUMNS 4096
+#define MAX_COL_NAME_LEN 1024
+#define MAX_TBL_NAME_LEN 1024
+
+
/* map ODBC SQL datatype to MonetDB SQL datatype */
static sql_subtype *
map_rescol_type(SQLSMALLINT dataType, SQLULEN columnSize, SQLSMALLINT
decimalDigits, mvc * sql)
@@ -163,6 +173,72 @@ map_rescol_type(SQLSMALLINT dataType, SQ
return sql_bind_subtype(sql->sa, typenm, interval_type, 0);
}
+/* return atom type for ODBC SQL datatype. */
+/* atom types are defined in gdk/gdh.h enum */
+static int
+map_rescol_mtype(SQLSMALLINT dataType, SQLULEN columnSize)
+{
+ switch (dataType) {
+ case SQL_CHAR:
+ case SQL_VARCHAR:
+ case SQL_LONGVARCHAR:
+ case SQL_WCHAR:
+ case SQL_WVARCHAR:
+ case SQL_WLONGVARCHAR:
+ return TYPE_str;
+ case SQL_BIT:
+ return TYPE_bit;
+ case SQL_TINYINT:
+ return TYPE_bte;
+ case SQL_SMALLINT:
+ return TYPE_sht;
+ case SQL_INTEGER:
+ return TYPE_int;
+ case SQL_BIGINT:
+ return TYPE_lng;
+ case SQL_REAL:
+ return TYPE_flt;
+ case SQL_FLOAT:
+ return (columnSize == 7) ? TYPE_flt : TYPE_dbl;
+ case SQL_DOUBLE:
+ return TYPE_dbl;
+ case SQL_BINARY:
+ case SQL_VARBINARY:
+ case SQL_LONGVARBINARY:
+ return TYPE_blob;
+ case SQL_TYPE_DATE:
+ return TYPE_date;
+ case SQL_TYPE_TIME:
+ return TYPE_daytime;
+ case SQL_DATETIME:
+ case SQL_TYPE_TIMESTAMP:
+ return TYPE_timestamp;
+ case SQL_GUID:
+ return TYPE_uuid;
+ case SQL_INTERVAL_MONTH:
+ case SQL_INTERVAL_YEAR:
+ case SQL_INTERVAL_YEAR_TO_MONTH:
+ return TYPE_int;
+ case SQL_INTERVAL_DAY:
+ case SQL_INTERVAL_HOUR:
+ case SQL_INTERVAL_MINUTE:
+ case SQL_INTERVAL_SECOND:
+ case SQL_INTERVAL_DAY_TO_HOUR:
+ case SQL_INTERVAL_DAY_TO_MINUTE:
+ case SQL_INTERVAL_DAY_TO_SECOND:
+ case SQL_INTERVAL_HOUR_TO_MINUTE:
+ case SQL_INTERVAL_HOUR_TO_SECOND:
+ case SQL_INTERVAL_MINUTE_TO_SECOND:
+ return TYPE_lng;
+
+ case SQL_DECIMAL:
+ case SQL_NUMERIC:
+ // we will fetch decimals as string data
+ default:
+ return TYPE_str;
+ }
+}
+
/* return name for ODBC SQL datatype */
static char *
nameofSQLtype(SQLSMALLINT dataType)
@@ -211,7 +287,7 @@ nameofSQLtype(SQLSMALLINT dataType)
}
}
-/* utility function to nicely close all opened ODBC resources */
+/* utility function to safely close all opened ODBC resources */
static void
odbc_cleanup(SQLHANDLE env, SQLHANDLE dbc, SQLHANDLE stmt) {
SQLRETURN ret = SQL_SUCCESS;
@@ -231,23 +307,45 @@ odbc_cleanup(SQLHANDLE env, SQLHANDLE db
}
}
-typedef struct odbc_loader_t {
- SQLHANDLE env;
- SQLHANDLE dbc;
- SQLHANDLE stmt;
- SQLSMALLINT nr_cols;
-} odbc_loader_t;
+/* copied from monetdb5/modules/mal/tablet.c */
+static BAT *
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]