Changeset: 66141ffe9d92 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=66141ffe9d92
Modified Files:
clients/mapiclient/dump.c
Branch: Jul2015
Log Message:
Gross hack: mserver creates but doesn't accept columns of type decimal(39,X).
Or decimal(19,X) for non 128 bit systems.
diffs (124 lines):
diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -171,6 +171,41 @@ has_schemas_system(Mapi mid)
return 0;
}
+/* return TRUE if the HUGEINT type exists */
+static int
+has_hugeint(Mapi mid)
+{
+ MapiHdl hdl;
+ int ret;
+
+ if ((hdl = mapi_query(mid,
+ "SELECT id "
+ "FROM sys.types "
+ "WHERE sqlname = 'hugeint'")) == NULL ||
+ mapi_error(mid))
+ goto bailout;
+ ret = mapi_get_row_count(hdl) == 1;
+ while ((mapi_fetch_row(hdl)) != 0) {
+ if (mapi_error(mid))
+ goto bailout;
+ }
+ if (mapi_error(mid))
+ goto bailout;
+ mapi_close_handle(hdl);
+ return ret;
+
+ bailout:
+ if (hdl) {
+ if (mapi_result_error(hdl))
+ mapi_explain_result(hdl, stderr);
+ else
+ mapi_explain_query(hdl, stderr);
+ mapi_close_handle(hdl);
+ } else
+ mapi_explain(mid, stderr);
+ return 0;
+}
+
static int
dump_foreign_keys(Mapi mid, const char *schema, const char *tname, const char
*tid, stream *toConsole)
{
@@ -394,10 +429,11 @@ static int dump_column_definition(
const char *schema,
const char *tname,
const char *tid,
- int foreign);
+ int foreign,
+ int hashge);
static int
-dump_type(Mapi mid, stream *toConsole, char *c_type, char *c_type_digits, char
*c_type_scale)
+dump_type(Mapi mid, stream *toConsole, char *c_type, char *c_type_digits, char
*c_type_scale, int hashge)
{
int space = 0;
@@ -502,13 +538,19 @@ dump_type(Mapi mid, stream *toConsole, c
space = mnstr_printf(toConsole, "DECIMAL");
} else if (strcmp(c_type, "table") == 0) {
mnstr_printf(toConsole, "TABLE ");
- dump_column_definition(mid, toConsole, NULL, NULL,
c_type_digits, 1);
+ dump_column_definition(mid, toConsole, NULL, NULL,
c_type_digits, 1, hashge);
} else if (strcmp(c_type_digits, "0") == 0) {
space = mnstr_printf(toConsole, "%s", toUpper(c_type));
} else if (strcmp(c_type_scale, "0") == 0) {
space = mnstr_printf(toConsole, "%s(%s)",
toUpper(c_type), c_type_digits);
} else {
+ if (strcmp(c_type, "decimal") == 0) {
+ if (strcmp(c_type_digits, "39") == 0)
+ c_type_digits = "38";
+ else if (!hashge && strcmp(c_type_digits, "19") == 0)
+ c_type_digits = "18";
+ }
space = mnstr_printf(toConsole, "%s(%s,%s)",
toUpper(c_type), c_type_digits, c_type_scale);
}
@@ -516,7 +558,7 @@ dump_type(Mapi mid, stream *toConsole, c
}
static int
-dump_column_definition(Mapi mid, stream *toConsole, const char *schema, const
char *tname, const char *tid, int foreign)
+dump_column_definition(Mapi mid, stream *toConsole, const char *schema, const
char *tname, const char *tid, int foreign, int hashge)
{
MapiHdl hdl = NULL;
char *query;
@@ -586,7 +628,7 @@ dump_column_definition(Mapi mid, stream
mnstr_printf(toConsole, "\t\"%s\"%*s ",
c_name, CAP(slen - strlen(c_name)), "");
- space = dump_type(mid, toConsole, c_type, c_type_digits,
c_type_scale);
+ space = dump_type(mid, toConsole, c_type, c_type_digits,
c_type_scale, hashge);
if (strcmp(c_null, "false") == 0) {
mnstr_printf(toConsole, "%*s NOT NULL",
CAP(13 - space), "");
@@ -763,6 +805,7 @@ describe_table(Mapi mid, char *schema, c
int type = 0;
size_t maxquerylen;
char *sname = NULL;
+ int hashge;
if (schema == NULL) {
if ((sname = strchr(tname, '.')) != NULL) {
@@ -778,6 +821,8 @@ describe_table(Mapi mid, char *schema, c
schema = sname;
}
+ hashge = has_hugeint(mid);
+
maxquerylen = 512 + strlen(tname) + strlen(schema);
query = malloc(maxquerylen);
@@ -830,7 +875,7 @@ describe_table(Mapi mid, char *schema, c
"",
schema, tname);
- if (dump_column_definition(mid, toConsole, schema, tname, NULL,
foreign))
+ if (dump_column_definition(mid, toConsole, schema, tname, NULL,
foreign, hashge))
goto bailout;
if (type == 5)
mnstr_printf(toConsole, " ON '%s'", view);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list