Changeset: f26678352b0f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f26678352b0f
Branch: extract_types
Log Message:
merged with default
diffs (truncated from 342 to 300 lines):
diff --git a/common/utils/sha.h b/common/utils/sha.h
--- a/common/utils/sha.h
+++ b/common/utils/sha.h
@@ -160,7 +160,6 @@ typedef struct SHA256Context {
int Corrupted; /* Cumulative corruption code */
} SHA256Context;
-#define USE_32BIT_ONLY
/*
* This structure will hold context information for the SHA-512
* hashing operation.
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -45,6 +45,7 @@
#include "monetdb_config.h"
#include "gdk.h"
#include "gdk_private.h"
+#include "gdk_interprocess.h"
#include "mutils.h"
static void *
@@ -606,7 +607,7 @@ void
HEAPfree(Heap *h, bool rmheap)
{
if (h->base) {
- if (h->farmid == 1) {
+ if (h->farmid == 1 && (h->storage == STORE_MEM || h->storage ==
STORE_MMAP || h->storage == STORE_PRIV)) {
QryCtx *qc = MT_thread_get_qry_ctx();
if (qc)
ATOMIC_SUB(&qc->datasize, h->size);
@@ -617,7 +618,14 @@ HEAPfree(Heap *h, bool rmheap)
} else if (h->storage == STORE_CMEM) {
//heap is stored in regular C memory rather than GDK
memory,so we call free()
free(h->base);
- } else { /* mapped file, or STORE_PRIV */
+#ifdef HAVE_FORK
+ } else if (h->storage == STORE_MMAPABS) {
+ size_t id;
+ sscanf(h->filename, "%zu", &id);
+ GDKreleasemmap(h->base, h->size, id);
+ rmheap = true;
+#endif
+ } else if (h->storage != STORE_NOWN) { /* mapped file, or
STORE_PRIV */
gdk_return ret = GDKmunmap(h->base, h->size);
if (ret != GDK_SUCCEED) {
@@ -630,16 +638,6 @@ HEAPfree(Heap *h, bool rmheap)
}
}
h->base = NULL;
-#ifdef HAVE_FORK
- if (h->storage == STORE_MMAPABS) {
- /* heap is stored in a mmap() file, but h->filename
- * is the absolute path */
- char *path = GDKfilepath(0, BATDIR, h->filename, NULL);
- if (path && MT_remove(path) != 0 && errno != ENOENT)
- perror(path);
- GDKfree(path);
- } else
-#endif
if (rmheap && !GDKinmemory(h->farmid)) {
if (h->hasfile) {
char *path = GDKfilepath(h->farmid, BATDIR,
h->filename, NULL);
diff --git a/sql/backends/monet5/UDF/pyapi3/conversion.h
b/sql/backends/monet5/UDF/pyapi3/conversion.h
--- a/sql/backends/monet5/UDF/pyapi3/conversion.h
+++ b/sql/backends/monet5/UDF/pyapi3/conversion.h
@@ -22,6 +22,7 @@ typedef struct {
PyObject *numpy_mask; // PyArrayObject* with mask (NULL if there is no
mask)
void *array_data; // void* pointer to data
bool *mask_data; // bool* pointer to mask data
+ size_t array_size;
size_t count; // amount of return elements
size_t memory_size; // memory size of each element
lng mmap_id;
@@ -32,6 +33,7 @@ typedef struct {
typedef struct {
void *dataptr; // pointer to input data
BAT *bat; // pointer to input BAT
+ BAT *conv_bat; // converted input BAT
int bat_type; // BAT type as TYPE_<type>
sql_subtype *sql_subtype; // SQL typename (for _column_types)
size_t count; // amount of elements in BAT
diff --git a/sql/backends/monet5/UDF/pyapi3/conversion3.c
b/sql/backends/monet5/UDF/pyapi3/conversion3.c
--- a/sql/backends/monet5/UDF/pyapi3/conversion3.c
+++ b/sql/backends/monet5/UDF/pyapi3/conversion3.c
@@ -201,7 +201,7 @@ PyObject *PyArrayObject_FromBAT(PyInput
goto wrapup;
} else {
BAT *ret_bat = NULL;
- msg = ConvertFromSQLType(inp->bat, inp->sql_subtype,
&ret_bat,
+ msg = ConvertFromSQLType(b, inp->sql_subtype, &ret_bat,
&inp->bat_type);
if (msg != MAL_SUCCEED) {
freeException(msg);
@@ -500,7 +500,7 @@ PyObject *PyArrayObject_FromBAT(PyInput
goto wrapup;
}
if (b != inp->bat)
- BBPunfix(b->batCacheid);
+ inp->conv_bat = b; /* still in use, free later */
return vararray;
wrapup:
*return_message = msg;
@@ -1131,6 +1131,7 @@ BAT *PyObject_ConvertToBAT(PyReturn *ret
if (ConvertableSQLType(type)) {
BAT *result;
msg = ConvertToSQLType(NULL, b, type, &result, &bat_type);
+ BBPunfix(b->batCacheid);
if (msg != MAL_SUCCEED) {
goto wrapup;
}
@@ -1242,6 +1243,7 @@ str ConvertFromSQLType(BAT *b, sql_subty
}
if (res == MAL_SUCCEED) {
*ret_bat = BATdescriptor(result);
+ BBPrelease(result);
*ret_type = TYPE_dbl;
} else {
*ret_bat = NULL;
diff --git a/sql/backends/monet5/UDF/pyapi3/convert_loops.h
b/sql/backends/monet5/UDF/pyapi3/convert_loops.h
--- a/sql/backends/monet5/UDF/pyapi3/convert_loops.h
+++ b/sql/backends/monet5/UDF/pyapi3/convert_loops.h
@@ -71,11 +71,14 @@
#if defined(HAVE_FORK)
#define CREATE_BAT_ZEROCOPY(bat, mtpe, batstore)
\
{
\
- bat = COLnew(seqbase, TYPE_##mtpe, 0, TRANSIENT);
\
+ bat = COLnew(seqbase, TYPE_void, 0, TRANSIENT);
\
if (bat == NULL) {
\
msg = createException(MAL, "pyapi3.eval",
SQLSTATE(PY000) "Cannot create column"); \
goto wrapup;
\
}
\
+ bat->ttype = TYPE_##mtpe;
\
+ bat->twidth = ATOMsize(TYPE_##mtpe);
\
+ bat->tshift = ATOMelmshift(b->twidth);
\
bat->tnil = false;
\
bat->tnonil = true;
\
bat->tkey = false;
\
@@ -97,31 +100,26 @@
nancheck_##mtpe(bat);
\
}
\
\
- /*When we create a BAT a small part of memory is allocated,
free it*/ \
- GDKfree(bat->theap->base);
\
+ assert(bat->theap->base == NULL);
\
bat->theap->base =
\
&data[(index_offset * ret->count) * ret->memory_size];
\
- bat->theap->size = ret->count * ret->memory_size;
\
- bat->theap->free =
\
- bat->theap->size; /*There are no free places in the
array*/ \
+ bat->theap->free = ret->count * ret->memory_size;
\
bat->theap->dirty = true;
\
/*If index_offset > 0, we are mapping part of a
multidimensional */ \
/* array.*/
\
/*The entire array will be cleared when the part with
index_offset=0 */\
/* is freed*/
\
/*So we set this part of the mapping to 'NOWN'*/
\
- if (index_offset > 0)
\
+ if (index_offset > 0) {
\
+ bat->theap->size = bat->theap->free;
\
bat->theap->storage = STORE_NOWN;
\
- else {
\
+ } else {
\
+ bat->theap->size = ret->array_size ? ret->array_size :
bat->theap->free; \
bat->theap->storage = batstore;
\
if (batstore == STORE_MMAPABS) {
\
- /* If we are taking data from a MMAP file, set
the filename to \
- * the absolute path */
\
- char address[sizeof(bat->theap->filename)-4];
\
- GDKmmapfile(address, sizeof(address),
ret->mmap_id); \
- strconcat_len(bat->theap->filename,
\
-
sizeof(bat->theap->filename), \
- address, ".tmp",
NULL); \
+ /* Communicate the id to the GDK layer */
\
+ snprintf(bat->theap->filename,
sizeof(bat->theap->filename), \
+ LLFMT, ret->mmap_id);
\
ret->mmap_id = -1;
\
}
\
}
\
@@ -137,11 +135,14 @@
#else
#define CREATE_BAT_ZEROCOPY(bat, mtpe, batstore)
\
{
\
- bat = COLnew(seqbase, TYPE_##mtpe, 0, TRANSIENT);
\
+ bat = COLnew(seqbase, TYPE_void, 0, TRANSIENT);
\
if (bat == NULL) {
\
msg = createException(MAL, "pyapi3.eval",
SQLSTATE(PY000) "Cannot create column"); \
goto wrapup;
\
}
\
+ bat->ttype = TYPE_##mtpe;
\
+ bat->twidth = ATOMsize(TYPE_##mtpe);
\
+ bat->tshift = ATOMelmshift(b->twidth);
\
bat->tnil = false;
\
bat->tnonil = true;
\
bat->tkey = false;
\
@@ -162,22 +163,21 @@
bat->tnonil = false;
\
nancheck_##mtpe(bat);
\
}
\
- /*When we create a BAT a small part of memory is allocated,
free it*/ \
- GDKfree(bat->theap->base);
\
+ assert(bat->theap->base == NULL);
\
bat->theap->base =
\
&data[(index_offset * ret->count) * ret->memory_size];
\
- bat->theap->size = ret->count * ret->memory_size;
\
- bat->theap->free =
\
- bat->theap->size; /*There are no free places in the
array*/ \
+ bat->theap->free = ret->count * ret->memory_size;
\
bat->theap->dirty = true;
\
/*If index_offset > 0, we are mapping part of a
multidimensional */ \
/* array.*/
\
/*The entire array will be cleared when the part with
index_offset=0 */\
/* is freed*/
\
/*So we set this part of the mapping to 'NOWN'*/
\
- if (index_offset > 0)
\
+ if (index_offset > 0) {
\
+ bat->theap->size = bat->theap->free;
\
bat->theap->storage = STORE_NOWN;
\
- else {
\
+ } else {
\
+ bat->theap->size = ret->array_size ? ret->array_size :
bat->theap->free; \
bat->theap->storage = batstore;
\
}
\
bat->theap->newstorage = STORE_MEM;
\
diff --git a/sql/backends/monet5/UDF/pyapi3/pyapi3.c
b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
--- a/sql/backends/monet5/UDF/pyapi3/pyapi3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
@@ -183,7 +183,7 @@ static str PyAPIeval(Client cntxt, MalBl
char *mmap_ptr;
QueryStruct *query_ptr = NULL;
int query_sem = -1;
- int mmap_id = -1;
+ lng mmap_id = -1;
size_t memory_size = 0;
bool child_process = false;
bool holds_gil = !mapped;
@@ -528,6 +528,7 @@ static str PyAPIeval(Client cntxt, MalBl
goto wrapup;
}
ret->array_data = mmap_ptrs[i + 3];
+ ret->array_size = mmap_sizes[i + 3];
ret->mask_data = NULL;
ret->numpy_array = NULL;
ret->numpy_mask = NULL;
@@ -1151,6 +1152,7 @@ static str PyAPIeval(Client cntxt, MalBl
ret->count = PyArray_DIMS((PyArrayObject
*)ret->numpy_array)[0];
ret->array_data =
PyArray_DATA((PyArrayObject
*)ret->numpy_array);
+ ret->array_size = ret->memory_size * ret->count;
}
descr->npy_type = ret->result_type;
@@ -1338,6 +1340,8 @@ wrapup:
PyInput *inp = &pyinput_values[i - (pci->retc + 2 +
has_card_arg)];
if (inp->bat != NULL)
BBPunfix(inp->bat->batCacheid);
+ if (inp->conv_bat != NULL)
+ BBPunfix(inp->conv_bat->batCacheid); /* delayed free */
}
if (pResult != NULL && gstate == 0) {
// if there is a pResult here, we are running single threaded
(LANGUAGE
diff --git a/sql/jdbc/tests/Tests/JDBC_API_Tester.SQL.py
b/sql/jdbc/tests/Tests/JDBC_API_Tester.SQL.py
--- a/sql/jdbc/tests/Tests/JDBC_API_Tester.SQL.py
+++ b/sql/jdbc/tests/Tests/JDBC_API_Tester.SQL.py
@@ -10,7 +10,7 @@ USER='monetdb'
PASSWORD='monetdb'
JDBC_EXTRA_ARGS=os.getenv('JDBC_EXTRA_ARGS', default='')
-URL=f"jdbc:monetdb://{HOST}:{MAPIPORT}/{TSTDB}?user=monetdb&password=monetdb{JDBC_EXTRA_ARGS}"
+URL=f"jdbc:monetdb://{HOST}:{MAPIPORT}/{TSTDB}?user={USER}&password={PASSWORD}{JDBC_EXTRA_ARGS}"
cmd = ['java', 'JDBC_API_Tester', URL]
try:
diff --git a/testing/CMakeLists.txt b/testing/CMakeLists.txt
--- a/testing/CMakeLists.txt
+++ b/testing/CMakeLists.txt
@@ -138,30 +138,6 @@ if(PYTHON3_LIBDIR)
utils.py
DESTINATION ${PYTHON3_LIBDIR}/MonetDBtesting
COMPONENT pytesting)
-
- if(BUILD_TESTING_PACKAGE)
- set(pypackagedir "${CMAKE_BINARY_DIR}/pytesting/src")
- make_directory("${pypackagedir}/MonetDBtesting")
- install(FILES
- process.py
- __init__.py
- ${CMAKE_CURRENT_BINARY_DIR}/listexports.py
- exportutils.py
- melcheck.py
- sqllogictest.py
- explain.py
- mapicursor.py
- malmapi.py
- helpers.py
- sqltest.py
- utils.py
- DESTINATION "${pypackagedir}/MonetDBtesting")
-
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]