Changeset: a6ec18daf0b8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/a6ec18daf0b8 Branch: default Log Message:
Merge branch odbc_loader into default. diffs (truncated from 3977 to 300 lines): diff --git a/clients/Tests/MAL-signatures-hge.test b/clients/Tests/MAL-signatures-hge.test --- a/clients/Tests/MAL-signatures-hge.test +++ b/clients/Tests/MAL-signatures-hge.test @@ -47373,6 +47373,16 @@ tanh command mmath.tanh(X_0:flt):flt MATHunary_TANHflt (empty) +monetdb +epilogue +command monetdb.epilogue():void +MONETDBepilogue +(empty) +monetdb +prelude +pattern monetdb.prelude():void +MONETDBprelude +(empty) mtime addmonths command mtime.addmonths(X_0:date, X_1:int):date @@ -49199,6 +49209,11 @@ unsafe pattern sql.next_value(X_0:str, X mvc_next_value return the next value of the sequence sql +normalize_monetdb_url +pattern sql.normalize_monetdb_url(X_0:str):str +SQLnormalize_monetdb_url +Normalize mapi:monetdb://, monetdb:// or monetdbs:// URL +sql nth_value pattern sql.nth_value(X_0:any_1, X_1:lng, X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):any_1 SQLnth_value diff --git a/clients/Tests/MAL-signatures.test b/clients/Tests/MAL-signatures.test --- a/clients/Tests/MAL-signatures.test +++ b/clients/Tests/MAL-signatures.test @@ -35853,6 +35853,16 @@ tanh command mmath.tanh(X_0:flt):flt MATHunary_TANHflt (empty) +monetdb +epilogue +command monetdb.epilogue():void +MONETDBepilogue +(empty) +monetdb +prelude +pattern monetdb.prelude():void +MONETDBprelude +(empty) mtime addmonths command mtime.addmonths(X_0:date, X_1:int):date @@ -37654,6 +37664,11 @@ unsafe pattern sql.next_value(X_0:str, X mvc_next_value return the next value of the sequence sql +normalize_monetdb_url +pattern sql.normalize_monetdb_url(X_0:str):str +SQLnormalize_monetdb_url +Normalize mapi:monetdb://, monetdb:// or monetdbs:// URL +sql nth_value pattern sql.nth_value(X_0:any_1, X_1:lng, X_2:bit, X_3:bit, X_4:int, X_5:oid, X_6:oid):any_1 SQLnth_value 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 @@ -745,19 +745,19 @@ mparm mparm_enumerate(int i); bool mparm_is_core(mparm parm); const char *mparm_name(mparm parm); mparm mparm_parse(const char *name); -char *msetting_as_string(const msettings *mp, mparm parm); +const char *msetting_as_string(const msettings *mp, mparm parm, char *scratch, size_t scratch_size); bool msetting_bool(const msettings *mp, mparm parm); long msetting_long(const msettings *mp, mparm parm); const char *msetting_parm_name(const msettings *mp, mparm parm); msettings_error msetting_parse(msettings *mp, mparm parm, const char *text); int msetting_parse_bool(const char *text); msettings_error msetting_set_bool(msettings *mp, mparm parm, bool value); -msettings_error msetting_set_ignored(msettings *mp, const char *key, const char *value); msettings_error msetting_set_long(msettings *mp, mparm parm, long value); msettings_error msetting_set_named(msettings *mp, bool allow_core, const char *key, const char *value); msettings_error msetting_set_string(msettings *mp, mparm parm, const char *value) __attribute__((__nonnull__(3))); const char *msetting_string(const msettings *mp, mparm parm); msettings *msettings_clone(const msettings *mp); +msettings *msettings_clone_with(msettings_allocator alloc, void *alloc_state, const msettings *mp); long msettings_connect_binary(const msettings *mp); const char *msettings_connect_certhash_digits(const msettings *mp); const char *msettings_connect_clientcert(const msettings *mp); @@ -768,13 +768,16 @@ const char *msettings_connect_tcp(const enum msetting_tls_verify msettings_connect_tls_verify(const msettings *mp); const char *msettings_connect_unix(const msettings *mp); msettings *msettings_create(void); +msettings *msettings_create_with(msettings_allocator alloc, void *alloc_state); const msettings *msettings_default; msettings *msettings_destroy(msettings *mp); +msettings_allocator msettings_get_allocator(const msettings *mp, void **put_alloc_state_here); bool msettings_malloc_failed(msettings_error err); -bool msettings_parse_url(msettings *mp, const char *url, char **error_buffer); +msettings_error msettings_parse_url(msettings *mp, const char *url); void msettings_reset(msettings *mp); void msettings_set_localizer(msettings *mp, const char *(*localizer)(const void *data, mparm parm), void *data); -bool msettings_validate(msettings *mp, char **errmsg); +msettings_error msettings_validate(msettings *mp); +size_t msettings_write_url(const msettings *mp, char *buffer, size_t); const char *wsaerror(int); # monetdb5 @@ -1624,6 +1627,8 @@ str lng_num2dec_flt(flt *res, const lng str lng_num2dec_int(int *res, const lng *v, const int *d2, const int *s2); str lng_num2dec_lng(lng *res, const lng *v, const int *d2, const int *s2); str lng_num2dec_sht(sht *res, const lng *v, const int *d2, const int *s2); +const char *mapiuri_uri(const char *uri, allocator *sa); +int mapiuri_valid(const char *uri, allocator *sa); sql_schema *mvc_bind_schema(mvc *c, const char *sname); sql_table *mvc_bind_table(mvc *c, sql_schema *s, const char *tname); str mvc_commit(mvc *c, int chain, const char *name, bool enabling_auto_commit); @@ -1636,13 +1641,21 @@ str mvc_rollback(mvc *c, int chain, cons str number2name(str s, int len, int i); bool option_disable_fork; sql_part *partition_find_part(sql_trans *tr, sql_table *pt, sql_part *pp); +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); 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); +void rel_base_use_all(mvc *sql, sql_rel *rel); +sql_rel *rel_basetable(mvc *sql, sql_table *t, const char *tname); sql_rel *rel_project(allocator *sa, sql_rel *l, list *e); +list *rel_projections(mvc *sql, sql_rel *rel, const char *tname, int settname, int intern); void res_tables_destroy(res_table *results); list *sa_list(allocator *sa); char *sa_message(allocator *sa, _In_z_ _Printf_format_string_ const char *format, ...) __attribute__((__format__(__printf__, 2, 3))); +msettings *sa_msettings_create(allocator *sa); +char *sa_msettings_to_string(const msettings *mp, allocator *sa, size_t size_hint); str sht_dec2_bte(bte *res, const int *s1, const sht *v); str sht_dec2_dbl(dbl *res, const int *s1, const sht *v); str sht_dec2_flt(flt *res, const int *s1, const sht *v); @@ -1668,6 +1681,7 @@ 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_func(backend *be, stmt *ops, const char *name, sql_rel *imp, int f_union); # stream stream *block_stream(stream *s); diff --git a/clients/examples/C/murltest.c b/clients/examples/C/murltest.c --- a/clients/examples/C/murltest.c +++ b/clients/examples/C/murltest.c @@ -19,7 +19,7 @@ #include <stdlib.h> #include <string.h> -char *USAGE = "Usage: murltest TESTFILES.."; +char *USAGE = "Usage: murltest [-c] [-v[v[v]]] TESTFILES.."; static bool run_file(const char *filename, int verbose) @@ -71,7 +71,9 @@ main(int argc, char **argv) *next_slot++ = arg; continue; } - if (arg[1] == 'v') { + if (strcmp(arg, "-c") == 0) { + use_custom_allocator(); + }else if (arg[1] == 'v') { char *p = &arg[1]; while (*p == 'v') { p++; diff --git a/clients/examples/C/murltest.h b/clients/examples/C/murltest.h --- a/clients/examples/C/murltest.h +++ b/clients/examples/C/murltest.h @@ -11,7 +11,10 @@ */ #include "monetdb_config.h" +#include "stream.h" +#include "msettings.h" -#include "stream.h" + +void use_custom_allocator(void); bool run_tests(stream *s, int verbose); diff --git a/clients/examples/C/testsfile.c b/clients/examples/C/testsfile.c --- a/clients/examples/C/testsfile.c +++ b/clients/examples/C/testsfile.c @@ -27,52 +27,145 @@ static int start_line = -1; static int nstarted = 0; static msettings *mp = NULL; +static msettings_allocator allocator = NULL; + +static +bool verify_roundtrip(const char *location) +{ + const char ch = '*'; + char buffer[1000 + 1]; // + 1 canary byte + memset(buffer, ch, sizeof(buffer)); + const size_t buffer_size = sizeof(buffer) - 1; + + size_t length = msettings_write_url(mp, buffer, buffer_size); + if (length == 0) { + fprintf(stderr, "%s: msettings_write_url returned 0\n", location); + return false; + } + if (length > buffer_size - 1) { + fprintf(stderr, "%s: Reconstructed the URL unexpectedly large: %zu\n", location, length); + return false; + } + if (memchr(buffer, '\0', buffer_size) == NULL) { + fprintf(stderr, "%s: msettings_write_url didn't NUL terminate the result\n", location); + return false; + } + if (buffer[buffer_size] != ch) { + fprintf(stderr, "%s: msettting_write_url wrote beyond the end of the buffer\n", location); + return false; + } + + msettings *tmp = msettings_create_with(allocator, NULL); + if (tmp == NULL) { + fprintf(stderr, "malloc failed\n"); + return false; + } + msettings_error err = msettings_parse_url(tmp, buffer); + if (err) { + fprintf(stderr, "%s: Reconstructed URL <%s> couldn't be parsed: %s", location, buffer, err); + msettings_destroy(tmp); + return false; + } + + mparm parm; + bool ok = true; + for (int i = 0; (parm = mparm_enumerate(i)) != MP_UNKNOWN; i++) { + if (parm == MP_IGNORE) + continue; + char scratch1[100], scratch2[100]; + const char *mp_val = msetting_as_string(mp, parm, scratch1, sizeof(scratch1)); + const char *tmp_val = msetting_as_string(tmp, parm, scratch2, sizeof(scratch2)); + if (strcmp(mp_val, tmp_val) != 0) { + fprintf( + stderr, + "%s: setting %s: reconstructed value <%s> != <%s>\n", + location, mparm_name(parm), tmp_val, mp_val); + ok = false; + } + } + msettings_destroy(tmp); + if (!ok) + return false; + + // check if rendering to a smaller buffer returns the same length + // and writes a prefix of the original. + + assert(length > 0); // we checked this above + + char buffer2[sizeof(buffer)]; + for (size_t shorter = length; shorter > 0; shorter--) { + memset(buffer2, ch, sizeof(buffer)); + size_t n = msettings_write_url(mp, buffer2, shorter); + if (n != length) { + fprintf( + stderr,\ + "%s: writing to buffer of size %zu returns %zu, expected %zu\n", + location, shorter, n, length); + return false; + } + char *first_nul = memchr(buffer2, '\0', shorter); + if (first_nul == NULL) { + fprintf(stderr, "%s: truncated <%zu> msettings_write_url didn't NUL terminate\n", location, shorter); + return false; + } else if (strncmp(buffer2, buffer, shorter - 1) != 0) { + fprintf(stderr, + "%s: truncated <%zu> msettings_write_url wrote <%s> which isn't a prefix of <%s>", + location, shorter, + buffer2, buffer + ); + return false; + } + for (size_t i = shorter + 1; i < sizeof(buffer); i++) { + if (buffer2[i] != ch) { + fprintf( + stderr, + "%s: truncated <%zu> wsettings_write_url wrote beyond end of buffer (pos %zu)\n", + location, shorter, i); + return false; + } + } + } + + return true; +} static bool handle_parse_command(const char *location, char *url) { - char *errmsg = NULL; - bool ok = msettings_parse_url(mp, url, &errmsg); - if (!ok) { _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org