Changeset: 07207b13c2cb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/07207b13c2cb
Modified Files:
        ctest/tools/monetdbe/example1.c
        ctest/tools/monetdbe/example2.c
        ctest/tools/monetdbe/example_append.c
        ctest/tools/monetdbe/example_append_raw.c
        ctest/tools/monetdbe/example_blob.c
        ctest/tools/monetdbe/example_connections.c
        ctest/tools/monetdbe/example_decimals.c
        ctest/tools/monetdbe/example_proxy.c
        ctest/tools/monetdbe/example_temporal.c
        ctest/tools/monetdbe/test_helper_template.h
        tools/monetdbe/monetdbe.c
        tools/monetdbe/monetdbe.h
        tools/monetdbe/monetdbe_mapi.c
Branch: default
Log Message:

Add more type info to monetdbe columns.


diffs (truncated from 394 to 300 lines):

diff --git a/ctest/tools/monetdbe/example1.c b/ctest/tools/monetdbe/example1.c
--- a/ctest/tools/monetdbe/example1.c
+++ b/ctest/tools/monetdbe/example1.c
@@ -36,7 +36,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example2.c b/ctest/tools/monetdbe/example2.c
--- a/ctest/tools/monetdbe/example2.c
+++ b/ctest/tools/monetdbe/example2.c
@@ -43,7 +43,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_bool: {
                                        monetdbe_column_bool * col = 
(monetdbe_column_bool *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_append.c 
b/ctest/tools/monetdbe/example_append.c
--- a/ctest/tools/monetdbe/example_append.c
+++ b/ctest/tools/monetdbe/example_append.c
@@ -44,7 +44,7 @@ main(void)
                for (size_t c = 0; c < result->ncols; c++) {
                        if ((err = monetdbe_result_fetch(result, rcol+c, c)) != 
NULL)
                                error(err)
-                       switch (rcol[c]->type) {
+                       switch (rcol[c]->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol[c];
                                        if (col->data[r] == col->null_value) {
@@ -129,7 +129,7 @@ main(void)
                for (size_t c = 0; c < result->ncols; c++) {
                        if ((err = monetdbe_result_fetch(result, rcol+c, c)) != 
NULL)
                                error(err)
-                       switch (rcol[c]->type) {
+                       switch (rcol[c]->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol[c];
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_append_raw.c 
b/ctest/tools/monetdbe/example_append_raw.c
--- a/ctest/tools/monetdbe/example_append_raw.c
+++ b/ctest/tools/monetdbe/example_append_raw.c
@@ -38,11 +38,11 @@ main(void)
        int32_t i1 = 42;
        int32_t i2 = *(int32_t*)monetdbe_null(mdbe, monetdbe_int32_t);
        int32_t ints[2] = { i1, i2 };
-       monetdbe_column col0 = { .type = monetdbe_int32_t, .data = &ints, 
.count = 2 };
+       monetdbe_column col0 = { .type.type = monetdbe_int32_t, .data = &ints, 
.count = 2 };
 
        // str
        char* dstr[2] = { "Hello", "World" };
-       monetdbe_column col1 = { .type = monetdbe_str, .data = &dstr, .count = 
2 };
+       monetdbe_column col1 = { .type.type = monetdbe_str, .data = &dstr, 
.count = 2 };
 
        // timestamp
        monetdbe_data_date dt = { .day = 2, .month = 3, .year = 2020 };
@@ -50,25 +50,25 @@ main(void)
        monetdbe_data_timestamp t1 = { .date = dt, .time = tm };
        monetdbe_data_timestamp t2 = 
*(monetdbe_data_timestamp*)monetdbe_null(mdbe, monetdbe_timestamp);
        monetdbe_data_timestamp tss[2] = { t1, t2 };
-       monetdbe_column col2 = { .type = monetdbe_timestamp, .data = &tss, 
.count = 2 };
+       monetdbe_column col2 = { .type.type = monetdbe_timestamp, .data = &tss, 
.count = 2 };
 
        // date
        monetdbe_data_date d1 = dt;
        monetdbe_data_date d2 = *(monetdbe_data_date*)monetdbe_null(mdbe, 
monetdbe_date);
        monetdbe_data_date dts[2] = { d1, d2 };
-       monetdbe_column col3 = { .type = monetdbe_date, .data = &dts, .count = 
2 };
+       monetdbe_column col3 = { .type.type = monetdbe_date, .data = &dts, 
.count = 2 };
 
        // time
        monetdbe_data_time tm1 = tm;
        monetdbe_data_time tm2 = *(monetdbe_data_time*)monetdbe_null(mdbe, 
monetdbe_time);
        monetdbe_data_time tms[2] = { tm1, tm2 };
-       monetdbe_column col4 = { .type = monetdbe_time, .data = &tms, .count = 
2 };
+       monetdbe_column col4 = { .type.type = monetdbe_time, .data = &tms, 
.count = 2 };
 
        // blob
        monetdbe_data_blob b1 = { .size = 1, .data = "33" };
        monetdbe_data_blob b2 = *(monetdbe_data_blob*)monetdbe_null(mdbe, 
monetdbe_blob);
        monetdbe_data_blob bs[2] = { b1, b2 };
-       monetdbe_column col5 = { .type = monetdbe_blob, .data = &bs, .count = 2 
};
+       monetdbe_column col5 = { .type.type = monetdbe_blob, .data = &bs, 
.count = 2 };
 
        monetdbe_column* dcol[6] = { &col0, &col1, &col2, &col3, &col4, &col5 };
        if ((err = monetdbe_append(mdbe, "sys", "test", (monetdbe_column**) 
&dcol, 6)) != NULL)
@@ -76,7 +76,7 @@ main(void)
 
        // str with wrong utf8
        char* dstr2[2] = { "\xc3\x28", "\xe2\x28\xa1" };
-       monetdbe_column col12 = { .type = monetdbe_str, .data = &dstr2, .count 
= 2 };
+       monetdbe_column col12 = { .type.type = monetdbe_str, .data = &dstr2, 
.count = 2 };
        monetdbe_column* dcol2[6] = { &col0, &col12, &col2, &col3, &col4, &col5 
};
        if ((err = monetdbe_append(mdbe, "sys", "test", (monetdbe_column**) 
&dcol2, 6)) == NULL)
                error("Invalid UTF-8 string expected")
@@ -89,7 +89,7 @@ main(void)
                for (size_t c = 0; c < result->ncols; c++) {
                        if ((err = monetdbe_result_fetch(result, rcol+c, c)) != 
NULL)
                                error(err)
-                       switch (rcol[c]->type) {
+                       switch (rcol[c]->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol[c];
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_blob.c 
b/ctest/tools/monetdbe/example_blob.c
--- a/ctest/tools/monetdbe/example_blob.c
+++ b/ctest/tools/monetdbe/example_blob.c
@@ -38,7 +38,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_blob: {
                                        monetdbe_column_blob * col = 
(monetdbe_column_blob *) rcol;
                                        if (!col->data[r].data) {
diff --git a/ctest/tools/monetdbe/example_connections.c 
b/ctest/tools/monetdbe/example_connections.c
--- a/ctest/tools/monetdbe/example_connections.c
+++ b/ctest/tools/monetdbe/example_connections.c
@@ -38,7 +38,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_decimals.c 
b/ctest/tools/monetdbe/example_decimals.c
--- a/ctest/tools/monetdbe/example_decimals.c
+++ b/ctest/tools/monetdbe/example_decimals.c
@@ -36,7 +36,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_bool: {
                                        monetdbe_column_bool * col = 
(monetdbe_column_bool *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_proxy.c 
b/ctest/tools/monetdbe/example_proxy.c
--- a/ctest/tools/monetdbe/example_proxy.c
+++ b/ctest/tools/monetdbe/example_proxy.c
@@ -38,7 +38,7 @@ main(int argc, char** argv)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/example_temporal.c 
b/ctest/tools/monetdbe/example_temporal.c
--- a/ctest/tools/monetdbe/example_temporal.c
+++ b/ctest/tools/monetdbe/example_temporal.c
@@ -39,7 +39,7 @@ main(void)
                        monetdbe_column* rcol;
                        if ((err = monetdbe_result_fetch(result, &rcol, c)) != 
NULL)
                                error(err)
-                       switch (rcol->type) {
+                       switch (rcol->type.type) {
                                case monetdbe_int32_t: {
                                        monetdbe_column_int32_t * col = 
(monetdbe_column_int32_t *) rcol;
                                        if (col->data[r] == col->null_value) {
diff --git a/ctest/tools/monetdbe/test_helper_template.h 
b/ctest/tools/monetdbe/test_helper_template.h
--- a/ctest/tools/monetdbe/test_helper_template.h
+++ b/ctest/tools/monetdbe/test_helper_template.h
@@ -29,7 +29,7 @@ bool CHECK_COLUMN_FUNC (
 
     const monetdbe_types expected_type = TPE_ENUM;
 
-    if (rcol->type != expected_type) {
+    if (rcol->type.type != expected_type) {
         printf("Actual column and expected column differ in type.\n");
         return false;
     }
diff --git a/tools/monetdbe/monetdbe.c b/tools/monetdbe/monetdbe.c
--- a/tools/monetdbe/monetdbe.c
+++ b/tools/monetdbe/monetdbe.c
@@ -36,7 +36,7 @@
 #define UNUSED(x) (void)(x)
 
 static int
-monetdbe_type(monetdbe_types t) {
+monetdbe_2_gdk_type(monetdbe_types t) {
        switch(t) {
        case monetdbe_bool: return TYPE_bit;
        case monetdbe_int8_t: return TYPE_bte;
@@ -240,14 +240,14 @@ monetdbe_destroy_column(monetdbe_column*
        if (!column)
                return;
 
-       if (column->type == monetdbe_str) {
+       if (column->type.type == monetdbe_str) {
                // FIXME: clean up individual strings
                char** data = (char**)column->data;
                for(j = 0; j < column->count; j++) {
                        if (data[j])
                                GDKfree(data[j]);
                }
-       } else if (column->type == monetdbe_blob) {
+       } else if (column->type.type == monetdbe_blob) {
                monetdbe_data_blob* data = (monetdbe_data_blob*)column->data;
                for(j = 0; j < column->count; j++) {
                        if (data[j].data)
@@ -1697,10 +1697,12 @@ monetdbe_cleanup_result(monetdbe_databas
 }
 
 static inline void
-cleanup_get_columns_result(size_t column_count, char ** column_names, int 
*column_types)
+cleanup_get_columns_result(size_t column_count, char ** column_names, 
monetdbe_type* column_types)
 {
                if (column_names) for (size_t c = 0; c < column_count; c++) 
GDKfree(column_names[c]);
 
+               if (column_types) for (size_t c = 0; c < column_count; c++) 
GDKfree(column_types[c].sql_type);
+
                GDKfree(column_names);
                GDKfree(column_types);
 
@@ -1732,7 +1734,7 @@ escape_identifier(const char *s) /* Esca
 
 static char*
 monetdbe_get_columns_remote(monetdbe_database_internal *mdbe, const char* 
schema_name, const char *table_name, size_t *column_count,
-                                       char ***column_names, int 
**column_types)
+                                       char ***column_names, monetdbe_type 
**column_types)
 {
        char buf[1024], *escaped_schema_name = NULL, *escaped_table_name = NULL;
 
@@ -1764,7 +1766,7 @@ monetdbe_get_columns_remote(monetdbe_dat
 
        *column_count = result->ncols;
        *column_names = GDKzalloc(sizeof(char*) * result->ncols);
-       *column_types = GDKzalloc(sizeof(int) * result->ncols);
+       *column_types = GDKzalloc(sizeof(monetdbe_type) * result->ncols);
 
 
        if (*column_names == NULL || *column_types == NULL)
@@ -1781,7 +1783,13 @@ monetdbe_get_columns_remote(monetdbe_dat
                                set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_get_columns", MAL_MALLOC_FAIL));
                                break;
                        }
-                       (*column_types)[c] = rcol->type;
+                       if (((*column_types)[c].sql_type = 
GDKstrdup(rcol->type.sql_type)) == NULL) {
+                               set_error(mdbe, createException(MAL, 
"monetdbe.monetdbe_get_columns", MAL_MALLOC_FAIL));
+                               break;
+                       }
+                       (*column_types)[c].type = rcol->type.type;
+                       (*column_types)[c].scale = rcol->type.scale;
+                       (*column_types)[c].digits = rcol->type.digits;
                }
 
        // cleanup
@@ -1805,7 +1813,7 @@ monetdbe_get_columns_remote(monetdbe_dat
 
 char*
 monetdbe_get_columns(monetdbe_database dbhdl, const char *schema_name, const 
char *table_name, size_t *column_count,
-                                       char ***column_names, int 
**column_types)
+                                       char ***column_names, monetdbe_type 
**column_types)
 {
        monetdbe_database_internal *mdbe = (monetdbe_database_internal*)dbhdl;
        mvc *m = NULL;
@@ -1865,7 +1873,10 @@ monetdbe_get_columns(monetdbe_database d
        for (node *n = ol_first_node(t->columns); n; n = n->next) {
                sql_column *col = n->data;
                (*column_names)[col->colnr] = col->base.name;
-               (*column_types)[col->colnr] = 
embedded_type(col->type.type->localtype);
+               if (((*column_types)[col->colnr].sql_type = 
GDKstrdup(col->type.type->base.name)) == NULL) goto cleanup;
+               (*column_types)[col->colnr].type = 
embedded_type(col->type.type->localtype);
+               (*column_types)[col->colnr].digits = col->type.type->digits;
+               (*column_types)[col->colnr].scale = col->type.type->scale;
        }
 
 cleanup:
@@ -1940,7 +1951,7 @@ append_create_remote_append_mal_program(
        Symbol* prg,
        sql_schema **s,
        sql_table **t,
-       Client c, const char* schema, const char* table, size_t ccount, char** 
cnames, int* ctypes) {
+       Client c, const char* schema, const char* table, size_t ccount, char** 
cnames, monetdbe_type* ctypes) {
 
        char* msg                                       = MAL_SUCCEED;
        char buf[16]                            = {0};
@@ -2013,9 +2024,12 @@ append_create_remote_append_mal_program(
        for (size_t i = 0; i < ccount; i++) {
                sql_column *col = NULL;
                sql_type *tpe = SA_ZNEW(m->sa, sql_type);
-               tpe->localtype = monetdbe_type((monetdbe_types) ctypes[i]);
+               tpe->base.name = sa_strdup(m->sa, ctypes[i].sql_type);
+               tpe->localtype = monetdbe_2_gdk_type((monetdbe_types) 
ctypes[i].type);
+               tpe->digits = ctypes[i].digits;
+               tpe->scale = ctypes[i].scale;
                sql_subtype *st = SA_ZNEW(m->sa, sql_subtype);
-               sql_init_subtype(st, tpe, 0, 0);
+               sql_init_subtype(st, tpe, ctypes[i].digits, ctypes[i].scale);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to