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 -- [email protected]
To unsubscribe send an email to [email protected]