Changeset: ed9c9e15c398 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ed9c9e15c398
Modified Files:
clients/mapilib/mapi.c
sql/backends/monet5/sql_result.c
Branch: protocol
Log Message:
now shipping all of lineitem
diffs (228 lines):
diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c
--- a/clients/mapilib/mapi.c
+++ b/clients/mapilib/mapi.c
@@ -4001,6 +4001,11 @@ static char* mapi_convert_int(struct Map
return (char*) col->write_buf;
}
+static char* mapi_convert_lng(struct MapiColumn *col) {
+ sprintf(col->write_buf, "%lld", *((lng*) col->buffer_ptr));
+ return (char*) col->write_buf;
+}
+
static char* mapi_convert_smallint(struct MapiColumn *col) {
sprintf(col->write_buf, "%hd", *((short*) col->buffer_ptr));
return (char*) col->write_buf;
@@ -4011,6 +4016,11 @@ static char* mapi_convert_tinyint(struct
return (char*) col->write_buf;
}
+static char* mapi_convert_double(struct MapiColumn *col) {
+ sprintf(col->write_buf, "%g", *((double*) col->buffer_ptr));
+ return (char*) col->write_buf;
+}
+
static char* mapi_convert_boolean(struct MapiColumn *col) {
if (*((signed char*) col->buffer_ptr) == 1) {
return "true";
@@ -4020,6 +4030,86 @@ static char* mapi_convert_boolean(struct
}
}
+
+/* apologies for now */
+typedef int date;
+int date_nil = -1;
+
+static int
+leapyears(int year)
+{
+ /* count the 4-fold years that passed since jan-1-0 */
+ int y4 = year / 4;
+
+ /* count the 100-fold years */
+ int y100 = year / 100;
+
+ /* count the 400-fold years */
+ int y400 = year / 400;
+
+ return y4 + y400 - y100 + (year >= 0); /* may be negative */
+}
+
+#define leapyear(y) ((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400
== 0))
+
+#define YEARDAYS(y) (leapyear(y) ? 366 : 365)
+
+static int CUMDAYS[13] = {
+ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
+};
+static int CUMLEAPDAYS[13] = {
+ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366
+};
+
+
+static char*
+mapi_convert_date(struct MapiColumn *col){
+ int day, month, year;
+
+ date n = *((date*) col->buffer_ptr);
+
+ if (n == date_nil) {
+ return "NULL";
+ }
+ year = n / 365;
+ day = (n - year * 365) - leapyears(year >= 0 ? year - 1 : year);
+ if (n < 0) {
+ year--;
+ while (day >= 0) {
+ year++;
+ day -= YEARDAYS(year);
+ }
+ day = YEARDAYS(year) + day;
+ } else {
+ while (day < 0) {
+ year--;
+ day += YEARDAYS(year);
+ }
+ }
+
+ day++;
+ if (leapyear(year)) {
+ for (month = day / 31 == 0 ? 1 : day / 31; month <= 12; month++)
+ if (day > CUMLEAPDAYS[month - 1] && day <=
CUMLEAPDAYS[month]) {
+ break;
+ }
+ day -= CUMLEAPDAYS[month - 1];
+ } else {
+ for (month = day / 31 == 0 ? 1 : day / 31; month <= 12; month++)
+ if (day > CUMDAYS[month - 1] && day <= CUMDAYS[month]) {
+ break;
+ }
+ day -= CUMDAYS[month - 1];
+ }
+
+ sprintf(col->write_buf, "%04d-%02d-%02d", year, month, day);
+
+ return col->write_buf;
+}
+
+
+/* end of apologies */
+
static char* mapi_convert_unknown(struct MapiColumn *col) {
(void) col;
return "<unknown>";
@@ -4117,6 +4207,14 @@ read_into_cache(MapiHdl hdl, int lookahe
result->fields[i].converter =
(mapi_converter) mapi_convert_tinyint;
} else if (strcasecmp(type_sql_name, "boolean")
== 0) {
result->fields[i].converter =
(mapi_converter) mapi_convert_boolean;
+ } else if (strcasecmp(type_sql_name, "decimal")
== 0) {
+ result->fields[i].converter =
(mapi_converter) mapi_convert_double;
+ } else if (strcasecmp(type_sql_name, "double")
== 0) {
+ result->fields[i].converter =
(mapi_converter) mapi_convert_double;
+ } else if (strcasecmp(type_sql_name, "date") ==
0) {
+ result->fields[i].converter =
(mapi_converter) mapi_convert_date;
+ } else if (strcasecmp(type_sql_name, "bigint")
== 0) {
+ result->fields[i].converter =
(mapi_converter) mapi_convert_lng;
} else {
result->fields[i].converter =
(mapi_converter) mapi_convert_unknown;
// TODO: complain
@@ -5382,7 +5480,7 @@ mapi_fetch_row(MapiHdl hdl)
}
bs2_resetbuf(hdl->mid->from);
- fprintf(stderr, "nrows=%llu\n", nrows);
+// fprintf(stderr, "nrows=%llu\n", nrows);
buf = (char*) bs2_getbuf(hdl->mid->from) + sizeof(lng);
// iterate over cols
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -1870,6 +1870,7 @@ static int mvc_export_resultset_prot10(r
size_t srow = 0;
lng *var_col_len;
BATiter *iterators;
+ lng fixed_lengths = 0;
iterators = GDKmalloc(sizeof(BATiter) * t->nr_cols);
var_col_len = GDKmalloc(sizeof(lng) * t->nr_cols);
@@ -1900,8 +1901,47 @@ static int mvc_export_resultset_prot10(r
int typelen = ATOMsize(mtype);
iterators[i] = bat_iterator(BATdescriptor(c->b));
+ if (strcasecmp(c->type.type->sqlname, "decimal") == 0) {
+ str res = MAL_SUCCEED;
+ int bat_type = ATOMstorage(iterators[i].b->ttype);
+ int hpos = c->type.scale; //this value isn't right, it's always
3. todo: find the right scale value (i.e. where the decimal point is)
+ bat result = 0;
+ //decimal values can be stored in various numeric fields, so
check the numeric field and convert the one it's actually stored in
+ switch(bat_type)
+ {
+ case TYPE_bte:
+ res = batbte_dec2_dbl(&result, &hpos,
&iterators[i].b->batCacheid);
+ break;
+ case TYPE_sht:
+ res = batsht_dec2_dbl(&result, &hpos,
&iterators[i].b->batCacheid);
+ break;
+ case TYPE_int:
+ res = batint_dec2_dbl(&result, &hpos,
&iterators[i].b->batCacheid);
+ break;
+ case TYPE_lng:
+ res = batlng_dec2_dbl(&result, &hpos,
&iterators[i].b->batCacheid);
+ break;
+ #ifdef HAVE_HGE
+ case TYPE_hge:
+ res = bathge_dec2_dbl(&result, &hpos,
&iterators[i].b->batCacheid);
+ break;
+ #endif
+ default:
+ return -1;
+ }
+ if (res == MAL_SUCCEED) {
+ typelen = sizeof(dbl);
+ BBPunfix(iterators[i].b->batCacheid);
+ iterators[i].b = BATdescriptor(result);
+ } else {
+ return -1;
+ }
+ }
+
if (ATOMvarsized(mtype)) {
typelen = -1;
+ } else {
+ fixed_lengths += typelen;
}
if (!mnstr_writeLng(s, (lng)(strlen(c->tn) + strlen(c->name) +
strlen(c->type.type->sqlname) + sizeof(int) + 3)) ||
@@ -1923,7 +1963,7 @@ static int mvc_export_resultset_prot10(r
// FIXME: this can be skipped if there are no variable-length
types in the result set
while (row < (size_t) count) {
- size_t rowsize = 0;
+ size_t rowsize = fixed_lengths;
for (i = 0; i < (size_t) t->nr_cols; i++) {
res_col *c = t->cols + i;
int mtype = c->type.type->localtype;
@@ -1933,8 +1973,6 @@ static int mvc_export_resultset_prot10(r
assert(mtype == TYPE_str);
rowsize += slen;
var_col_len[i] += slen;
- } else {
- rowsize += ATOMsize(mtype);
}
}
if (bytes_left < rowsize) break;
@@ -1974,7 +2012,11 @@ static int mvc_export_resultset_prot10(r
}
}
} else {
- if (mnstr_write(s, Tloc(iterators[i].b, srow),
ATOMsize(mtype), row - srow) != (ssize_t) (row - srow)) {
+ int atom_size = ATOMsize(mtype);
+ if (strcasecmp(c->type.type->sqlname,
"decimal") == 0) {
+ atom_size = sizeof(dbl);
+ }
+ if (mnstr_write(s, Tloc(iterators[i].b, srow),
atom_size, row - srow) != (ssize_t) (row - srow)) {
return -1;
}
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list