MonetDB: default - Merge with Jul2017 branch.
Changeset: e54f487eabf4 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e54f487eabf4 Added Files: sql/test/BugTracker-2016/Tests/min-max-uuid-column-wrong-results.Bug-3953.sql Removed Files: sql/test/BugTracker-2016/Tests/data-uuid.csv.bz2 sql/test/BugTracker-2016/Tests/min-max-uuid-column-wrong-results.Bug-3953.sql.in Modified Files: monetdb5/mal/mal_builder.c monetdb5/mal/mal_function.c monetdb5/mal/mal_instruction.c monetdb5/modules/mal/language.c monetdb5/optimizer/opt_multiplex.c monetdb5/optimizer/opt_remap.c sql/backends/monet5/sql_scenario.c sql/server/sql_mvc.c sql/storage/store.c sql/test/BugTracker-2016/Tests/All sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.sql sql/test/BugTracker-2017/Tests/double-groupby-column.Bug-6207.stable.out sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out sql/test/emptydb-upgrade/Tests/upgrade.stable.out sql/test/mergetables/Tests/All sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.out Branch: default Log Message: Merge with Jul2017 branch. diffs (truncated from 370 to 300 lines): diff --git a/monetdb5/mal/mal_builder.c b/monetdb5/mal/mal_builder.c --- a/monetdb5/mal/mal_builder.c +++ b/monetdb5/mal/mal_builder.c @@ -38,8 +38,13 @@ newAssignment(MalBlkPtr mb) InstrPtr newStmt(MalBlkPtr mb, const char *module, const char *name) { - InstrPtr q = newInstruction(mb, putName(module), putName(name)); + InstrPtr q; + str mName = putName(module), nName = putName(name); + if(mName == NULL || nName == NULL) { + return NULL; + } + q = newInstruction(mb, mName, nName); if ( q == NULL) return NULL; setDestVar(q, newTmpVariable(mb, TYPE_any)); @@ -71,11 +76,18 @@ InstrPtr newFcnCall(MalBlkPtr mb, char *mod, char *fcn) { InstrPtr q = newAssignment(mb); + str fcnName, modName; if ( q == NULL || mod == NULL || fcn == NULL) return NULL; - setModuleId(q, putName(mod)); - setFunctionId(q, putName(fcn)); + modName = putName(mod); + fcnName = putName(fcn); + if(modName == NULL || fcnName == NULL) { + freeInstruction(q); + return NULL; + } + setModuleId(q, modName); + setFunctionId(q, fcnName); return q; } diff --git a/monetdb5/mal/mal_function.c b/monetdb5/mal/mal_function.c --- a/monetdb5/mal/mal_function.c +++ b/monetdb5/mal/mal_function.c @@ -23,6 +23,9 @@ Symbol newFunction(str mod, str nme,int InstrPtr p; int varid; + if(mod == NULL || nme == NULL) + return NULL; + s = newSymbol(nme,kind); if (s == NULL) return NULL; diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c --- a/monetdb5/mal/mal_instruction.c +++ b/monetdb5/mal/mal_instruction.c @@ -48,6 +48,10 @@ newSymbol(str nme, int kind) if (cur == NULL) return NULL; cur->name = putName(nme); + if(cur->name == NULL) { + GDKfree(cur); + return NULL; + } cur->kind = kind; cur->peer = NULL; cur->def = newMalBlk(kind == FUNCTIONsymbol? STMT_INCREMENT : 2); diff --git a/monetdb5/modules/mal/language.c b/monetdb5/modules/mal/language.c --- a/monetdb5/modules/mal/language.c +++ b/monetdb5/modules/mal/language.c @@ -180,7 +180,7 @@ CMDregisterFunction(Client cntxt, MalBlk str *code = getArgReference_str(stk,pci,3); str *help = getArgReference_str(stk,pci,4); InstrPtr sig; - str msg; + str msg, fcnName, modName, ahelp; msg= compileString(&sym, cntxt,*code); if( sym) { @@ -188,11 +188,19 @@ CMDregisterFunction(Client cntxt, MalBlk //mnstr_printf(cntxt->fdout,"#register FUNCTION %s.%s\n", //getModuleId(sym->def->stmt[0]), getFunctionId(sym->def->stmt[0])); mb= sym->def; + fcnName = putName(*fcn); + modName = putName(*mod); + ahelp = GDKstrdup(*help); + if(fcnName == NULL || modName == NULL || help == NULL) { + freeSymbol(sym); + GDKfree(ahelp); + throw(MAL, "language.register", MAL_MALLOC_FAIL); + } if( help) - mb->help= GDKstrdup(*help); + mb->help= ahelp; sig= getSignature(sym); - sym->name= putName(*fcn); - setModuleId(sig, putName(*mod)); + sym->name= fcnName; + setModuleId(sig, modName); setFunctionId(sig, sym->name); insertSymbol(findModule(cntxt->usermodule, getModuleId(sig)),
MonetDB: default - Introduced macros is_XXX_nil() to check wheth...
Changeset: 9298bfa9d5d7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9298bfa9d5d7 Modified Files: gdk/gdk.h gdk/gdk_aggr.c gdk/gdk_align.c gdk/gdk_atoms.c gdk/gdk_atoms.h gdk/gdk_bat.c gdk/gdk_batop.c gdk/gdk_bbp.c gdk/gdk_calc.c gdk/gdk_calc_compare.h gdk/gdk_group.c gdk/gdk_hash.c gdk/gdk_imprints.c gdk/gdk_join.c gdk/gdk_logger.c gdk/gdk_project.c gdk/gdk_qsort.c gdk/gdk_search.c gdk/gdk_select.c gdk/gdk_ssort.c gdk/gdk_unique.c gdk/gdk_value.c geom/monetdb5/geom.c monetdb5/extras/rapi/converters.c.h monetdb5/mal/mal_atom.c monetdb5/mal/mal_authorize.c monetdb5/mal/mal_debugger.c monetdb5/mal/mal_interpreter.c monetdb5/mal/mal_parser.c monetdb5/modules/atoms/color.c monetdb5/modules/atoms/color.h monetdb5/modules/atoms/json.c monetdb5/modules/atoms/mtime.c monetdb5/modules/atoms/str.c monetdb5/modules/kernel/algebra.c monetdb5/modules/kernel/batcolor.c monetdb5/modules/kernel/batmmath.c monetdb5/modules/kernel/microbenchmark.c monetdb5/modules/kernel/mmath.c monetdb5/modules/mal/batcalc.c monetdb5/modules/mal/calc.c monetdb5/modules/mal/clients.c monetdb5/modules/mal/iterator.c monetdb5/modules/mal/language.c monetdb5/modules/mal/mal_io.c monetdb5/modules/mal/mkey.c monetdb5/modules/mal/pcre.c monetdb5/modules/mal/remote.c monetdb5/modules/mal/tablet.c monetdb5/optimizer/opt_mergetable.c sql/backends/monet5/LSST/lsst.c sql/backends/monet5/UDF/cudf/udf_impl.h sql/backends/monet5/UDF/pyapi/conversion.c sql/backends/monet5/UDF/pyapi/convert_loops.h sql/backends/monet5/UDF/pyapi/emit.c sql/backends/monet5/generator/generator.c sql/backends/monet5/sql.c sql/backends/monet5/sql_cast_impl_down_from_flt.h sql/backends/monet5/sql_cast_impl_int.h sql/backends/monet5/sql_cast_impl_up_to_flt.h sql/backends/monet5/sql_cat.c sql/backends/monet5/sql_fround.c sql/backends/monet5/sql_fround_impl.h sql/backends/monet5/sql_result.c sql/backends/monet5/sql_round.c sql/backends/monet5/sql_round_impl.h sql/backends/monet5/sql_user.c sql/backends/monet5/vaults/bam/bam_lib.c sql/backends/monet5/vaults/fits/fits.c sql/backends/monet5/vaults/lidar/lidar.c sql/backends/monet5/vaults/netcdf/netcdf.c sql/backends/monet5/vaults/shp/shp.c sql/server/sql_atom.c sql/server/sql_mvc.c sql/server/sql_parser.y sql/server/sql_privileges.c sql/storage/bat/bat_storage.c sql/storage/bat/bat_table.c sql/storage/store.c sql/storage/store_dependency.c Branch: default Log Message: Introduced macros is_XXX_nil() to check whether a value is NIL. diffs (truncated from 6846 to 300 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -1293,13 +1293,13 @@ gdk_export BUN ORDERfndlast(BAT *b, cons gdk_export BUN BUNfnd(BAT *b, const void *right); #define BUNfndVOID(b, v) \ - (((*(const oid*)(v) == oid_nil) ^ ((b)->tseqbase == oid_nil)) | \ + ((is_oid_nil(*(const oid*)(v)) ^ is_oid_nil((b)->tseqbase)) | \ (*(const oid*)(v) < (b)->tseqbase) |\ (*(const oid*)(v) >= (b)->tseqbase + (b)->batCount) ? \ BUN_NONE : \ (BUN) (*(const oid*)(v) - (b)->tseqbase)) -#define BATttype(b)((b)->ttype == TYPE_void && (b)->tseqbase != oid_nil ? \ +#define BATttype(b)((b)->ttype == TYPE_void && !is_oid_nil((b)->tseqbase) ? \ TYPE_oid : (b)->ttype) #define Tbase(b) ((b)->tvheap->base) @@ -1528,19 +1528,19 @@ gdk_export void GDKqsort(void *h, void * gdk_export void GDKqsort_rev(void *h, void *t, const void *base, size_t n, int hs, int ts, int tpe); #define BATtordered(b) ((b)->ttype == TYPE_void || (b)->tsorted) -#define BATtrevordered(b) (((b)->ttype == TYPE_void && (b)->tseqbase == oid_nil) || (b)->trevsorted) -#define BATtdense(b) (BATtvoid(b) && (b)->tseqbase != oid_nil) +#define BATtrevordered(b) (((b)->ttype == TYPE_void && is_oid_nil((b)->tseqbase)) || (b)->trevsorted) +#define BATtdense(b) (BATtvoid(b) && !is_oid_nil((b)->tseqbase)) #define BATtvoid(b)(((b)->tdense && (b)->tsorted) || (b)->ttype==TYPE_void) #define BATtkey(b) (b->tkey != FALSE || BATtdense(b)) /* set some properties that are trivial to deduce */ #define BATsettrivprop(b) \ do {
MonetDB: default - GDK_XXX_min and GDK_XXX_max are now inclusive.
Changeset: b411630655c7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b411630655c7 Modified Files: gdk/gdk_aggr.c gdk/gdk_atoms.c gdk/gdk_atoms.h gdk/gdk_bat.c gdk/gdk_bbp.c gdk/gdk_calc.c gdk/gdk_select.c monetdb5/mal/mal_parser.c monetdb5/modules/atoms/mtime.c sql/backends/monet5/sql_cast_impl_int.h sql/backends/monet5/sql_round_impl.h sql/server/sql_parser.y Branch: default Log Message: GDK_XXX_min and GDK_XXX_max are now inclusive. This also means that the nil value is not equal to GDK_XXX_min. diffs (truncated from 368 to 300 lines): diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -363,7 +363,7 @@ dofsum(const void *restrict values, oid x = 2 * (hi + y); if (tp2 == TYPE_flt) { if (x > GDK_flt_max || - x <= GDK_flt_min) { + x < GDK_flt_min) { if (abort_on_error) goto overflow; ((flt *) results)[grp] = flt_nil; @@ -432,7 +432,7 @@ dofsum(const void *restrict values, oid GDKfree(pergroup[grp].partials); pergroup[grp].partials = NULL; if (tp2 == TYPE_flt) { - if (hi > GDK_flt_max || hi <= GDK_flt_min) { + if (hi > GDK_flt_max || hi < GDK_flt_min) { if (abort_on_error) goto overflow; ((flt *) results)[grp] = flt_nil; diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -248,14 +248,14 @@ ATOMisdescendant(int tpe, int parent) } -const bte bte_nil = GDK_bte_min; -const sht sht_nil = GDK_sht_min; -const int int_nil = GDK_int_min; -const flt flt_nil = GDK_flt_min; -const dbl dbl_nil = GDK_dbl_min; -const lng lng_nil = GDK_lng_min; +const bte bte_nil = GDK_bte_min-1; +const sht sht_nil = GDK_sht_min-1; +const int int_nil = GDK_int_min-1; +const flt flt_nil = -FLT_MAX; +const dbl dbl_nil = -DBL_MAX; +const lng lng_nil = GDK_lng_min-1; #ifdef HAVE_HGE -const hge hge_nil = GDK_hge_min; +const hge hge_nil = GDK_hge_min-1; #endif const oid oid_nil = (oid) 1 << (sizeof(oid) * 8 - 1); const char str_nil[2] = { '\200', 0 }; @@ -718,7 +718,7 @@ numFromStr(const char *src, size_t *len, switch (sz) { case 1: { bte **dstbte = (bte **) dst; - if (base <= GDK_bte_min || base > GDK_bte_max) { + if (base < GDK_bte_min || base > GDK_bte_max) { goto overflow; } **dstbte = (bte) base; @@ -726,7 +726,7 @@ numFromStr(const char *src, size_t *len, } case 2: { sht **dstsht = (sht **) dst; - if (base <= GDK_sht_min || base > GDK_sht_max) { + if (base < GDK_sht_min || base > GDK_sht_max) { goto overflow; } **dstsht = (sht) base; @@ -734,7 +734,7 @@ numFromStr(const char *src, size_t *len, } case 4: { int **dstint = (int **) dst; - if (base <= GDK_int_min || base > GDK_int_max) { + if (base < GDK_int_min || base > GDK_int_max) { goto overflow; } **dstint = (int) base; @@ -743,7 +743,7 @@ numFromStr(const char *src, size_t *len, case 8: { lng **dstlng = (lng **) dst; #ifdef HAVE_HGE - if (base <= GDK_lng_min || base > GDK_lng_max) { + if (base < GDK_lng_min || base > GDK_lng_max) { goto overflow; } #endif @@ -861,7 +861,7 @@ hgeToStr(char **dst, size_t *len, const strncpy(*dst, "nil", *len); return 3; } - if ((hge) GDK_lng_min < *src && *src <= (hge) GDK_lng_max) { + if ((hge) GDK_lng_min <= *src && *src <= (hge) GDK_lng_max) { lng s = (lng) *src; return lngToStr(dst, len, &s); } else { diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h --- a/gdk/gdk_atoms.h +++ b/gdk/gdk_atoms.h @@ -84,22 +84,22 @@ gdk_export size_t escapedStr(char *dst, #define GDK_bit_max ((bit) 1) #define GDK_bit_min ((bit) 0) #define GDK_bte_max ((bte) SCHAR_MAX) -#define GDK_bte_min ((bte) SCHAR_MIN) +#define GDK_bte_min ((bte) SCHAR_MIN+1) #define GDK_sht_max ((sht) SHRT_MAX) -#define GDK_sht_min ((sht) SHRT_MIN) +#define GDK_sht_min ((sht) SHRT_MIN+1) #define GDK_int_max INT_MAX -#define GDK_int_min INT_MIN +#define GDK_int_min (INT
MonetDB: default - Check whether conversion to float caused over...
Changeset: 44310b9a44ff for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=44310b9a44ff Modified Files: gdk/gdk_aggr.c Branch: default Log Message: Check whether conversion to float caused overflow by checking for INFINITY. diffs (48 lines): diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c --- a/gdk/gdk_aggr.c +++ b/gdk/gdk_aggr.c @@ -215,6 +215,7 @@ dofsum(const void *restrict values, oid volatile double lo, hi; double twopow = pow((double) FLT_RADIX, (double) (DBL_MAX_EXP - 1)); BUN nils = 0; + volatile flt f; ALGODEBUG fprintf(stderr, "#%s: floating point summation\n", func); /* we only deal with the two floating point types */ @@ -362,14 +363,16 @@ dofsum(const void *restrict values, oid pergroup[grp].partials = NULL; x = 2 * (hi + y); if (tp2 == TYPE_flt) { - if (x > GDK_flt_max || - x < GDK_flt_min) { + f = (flt) x; + if (isinf(f) || + isnan(f) || + is_flt_nil(f)) { if (abort_on_error) goto overflow; ((flt *) results)[grp] = flt_nil; nils++; } else - ((flt *) results)[grp] = (flt) x; + ((flt *) results)[grp] = f; } else if (is_dbl_nil(x)) { if (abort_on_error) goto overflow; @@ -432,13 +435,14 @@ dofsum(const void *restrict values, oid GDKfree(pergroup[grp].partials); pergroup[grp].partials = NULL; if (tp2 == TYPE_flt) { - if (hi > GDK_flt_max || hi < GDK_flt_min) { + f = (flt) hi; + if (isinf(f) || isnan(f) || is_flt_nil(f)) { if (abort_on_error) goto overflow; ((flt *) results)[grp] = flt_nil; nils++; } else - ((flt *) results)[grp] = (flt) hi; + ((flt *) results)[grp] = f; } else if (is_dbl_nil(hi)) { if (abort_on_error) goto overflow; ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Simplify code.
Changeset: 31a3d252b036 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=31a3d252b036 Modified Files: geom/monetdb5/geom.c Branch: default Log Message: Simplify code. diffs (14 lines): diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c --- a/geom/monetdb5/geom.c +++ b/geom/monetdb5/geom.c @@ -2095,9 +2095,7 @@ geom_epilogue(void *ret) static int mbr_isnil(const mbr *m) { - if (m == NULL || is_flt_nil(m->xmin) || is_flt_nil(m->ymin) || is_flt_nil(m->xmax) || is_flt_nil(m->ymax)) - return 1; - return 0; + return (m == NULL || is_flt_nil(m->xmin) || is_flt_nil(m->ymin) || is_flt_nil(m->xmax) || is_flt_nil(m->ymax)); } /* returns the size of variable-sized atom wkb */ ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Use the floating point NaN (not-a-number) val...
Changeset: cfe690cd2d4d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cfe690cd2d4d Modified Files: gdk/gdk_atoms.c gdk/gdk_atoms.h gdk/gdk_calc.c gdk/gdk_calc_private.h gdk/gdk_search.c sql/test/Tests/fsum.sql sql/test/Tests/fsum.stable.err sql/test/Tests/fsum.stable.out Branch: default Log Message: Use the floating point NaN (not-a-number) value for the NIL representation. TODO: upgrade code. diffs (198 lines): diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -251,8 +251,8 @@ ATOMisdescendant(int tpe, int parent) const bte bte_nil = GDK_bte_min-1; const sht sht_nil = GDK_sht_min-1; const int int_nil = GDK_int_min-1; -const flt flt_nil = -FLT_MAX; -const dbl dbl_nil = -DBL_MAX; +const flt flt_nil = NAN; +const dbl dbl_nil = NAN; const lng lng_nil = GDK_lng_min-1; #ifdef HAVE_HGE const hge hge_nil = GDK_hge_min-1; diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h --- a/gdk/gdk_atoms.h +++ b/gdk/gdk_atoms.h @@ -90,7 +90,7 @@ gdk_export size_t escapedStr(char *dst, #define GDK_int_max INT_MAX #define GDK_int_min (INT_MIN+1) #define GDK_flt_max ((flt) FLT_MAX) -#define GDK_flt_min (-3.4028233e+38F) /* nextafterf(-FLT_MAX,0) */ +#define GDK_flt_min ((flt) -FLT_MAX) #define GDK_lng_max ((lng) LLONG_MAX) #define GDK_lng_min ((lng) LLONG_MIN+1) #ifdef HAVE_HGE @@ -99,7 +99,7 @@ gdk_export size_t escapedStr(char *dst, #define GDK_hge_min (-GDK_hge_max) #endif #define GDK_dbl_max ((dbl) DBL_MAX) -#define GDK_dbl_min (-1.7976931348623155e+308) /* nextafter(-DBL_MAX,0) */ +#define GDK_dbl_min ((dbl) -DBL_MAX) /* GDK_oid_max see below */ #define GDK_oid_min ((oid) 0) /* representation of the nil */ @@ -136,10 +136,20 @@ gdk_export const ptr ptr_nil; #define is_hge_nil(v) ((v) == hge_nil) #endif #define is_oid_nil(v) ((v) == oid_nil) -#define is_flt_nil(v) ((v) == flt_nil) -#define is_dbl_nil(v) ((v) == dbl_nil) +#define is_flt_nil(v) isnan(v) +#define is_dbl_nil(v) isnan(v) #define is_bat_nil(v) ((v) == bat_nil || (v) == 0) +#if defined(_MSC_VER) && defined(__INTEL_COMPILER) +#include +#else +#include +#endif + +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && _MSC_VER < 1800 +#define isnan(x) _isnan(x) +#endif + /* * @- Derived types * In all algorithms across GDK, you will find switches on the types diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c --- a/gdk/gdk_calc.c +++ b/gdk/gdk_calc.c @@ -5806,9 +5806,14 @@ mul_##TYPE1##_##TYPE2##_##TYPE3(const TY dst[k] = TYPE3##_nil; \ nils++; \ } else {\ - FLTDBLMUL_CHECK(TYPE1, lft[i], TYPE2, rgt[j], \ - TYPE3, dst[k], max, \ - ON_OVERFLOW(TYPE1, TYPE2, "*")); \ + /* only check for overflow, not for underflow */ \ + dst[k] = (TYPE3) (lft[i] * rgt[j]); \ + if (isinf(dst[k]) || ABSOLUTE(dst[k]) > max) { \ + if (abort_on_error) \ + ON_OVERFLOW(TYPE1, TYPE2, "*"); \ + dst[k] = TYPE3##_nil; \ + nils++; \ + } \ } \ } \ CANDLOOP(dst, k, TYPE3##_nil, end, cnt);\ diff --git a/gdk/gdk_calc_private.h b/gdk/gdk_calc_private.h --- a/gdk/gdk_calc_private.h +++ b/gdk/gdk_calc_private.h @@ -257,17 +257,3 @@ } while (0) #endif /* HAVE___BUILTIN_ADD_OVERFLOW */ #endif /* HAVE_HGE */ - -#define FLTDBLMUL_CHECK(TYPE1, lft, TYPE2, rgt, TYPE3, dst, max, on_overflow) \ - do {\ - /* only check for overflow, not for underflow */\ - if (ABSOLUTE(lft) > 1 &&\ - (max) / ABSOLUTE(lft) < ABSOLUTE(rgt)) {\ - if (abort_on_error) \ - on_overflow;\ - (dst) = TYPE3##_nil;\ - nils++; \ - } else {\ - (dst) = (TYPE3) (lft) * (rgt); \ - } \ - } while (0) diff --git a/gdk/gdk_search.c b
MonetDB: default - Properly do floating point comparisons which ...
Changeset: 5ba4400fec07 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5ba4400fec07 Modified Files: gdk/gdk_firstn.c gdk/gdk_qsort.c Branch: default Log Message: Properly do floating point comparisons which may include NIL (NaN). We can't compare NILs with anything, but we must maintain the illusion that they are smaller than anything else. diffs (166 lines): diff --git a/gdk/gdk_firstn.c b/gdk/gdk_firstn.c --- a/gdk/gdk_firstn.c +++ b/gdk/gdk_firstn.c @@ -87,12 +87,26 @@ siftup(OPER, i - 1, SWAP); \ } while (0) -#define LTany(p1, p2) (cmp(BUNtail(bi, oids[p1] - b->hseqbase), \ +#define LTany(p1, p2) (cmp(BUNtail(bi, oids[p1] - b->hseqbase), \ BUNtail(bi, oids[p2] - b->hseqbase)) < 0) -#define GTany(p1, p2) (cmp(BUNtail(bi, oids[p1] - b->hseqbase), \ +#define GTany(p1, p2) (cmp(BUNtail(bi, oids[p1] - b->hseqbase), \ BUNtail(bi, oids[p2] - b->hseqbase)) > 0) -#define LTfix(p1, p2) (vals[oids[p1] - b->hseqbase] < vals[oids[p2] - b->hseqbase]) -#define GTfix(p1, p2) (vals[oids[p1] - b->hseqbase] > vals[oids[p2] - b->hseqbase]) +#define LTflt(a, b)((bit) (!is_flt_nil(b) && (is_flt_nil(a) || (a) < (b +#define LTdbl(a, b)((bit) (!is_dbl_nil(b) && (is_dbl_nil(a) || (a) < (b +#define GTflt(a, b)((bit) (!is_flt_nil(a) && (is_flt_nil(b) || (a) > (b +#define GTdbl(a, b)((bit) (!is_dbl_nil(a) && (is_dbl_nil(b) || (a) > (b +#define LTfltfix(p1, p2) LTflt(vals[oids[p1] - b->hseqbase], \ + vals[oids[p2] - b->hseqbase]) +#define GTfltfix(p1, p2) GTflt(vals[oids[p1] - b->hseqbase], \ + vals[oids[p2] - b->hseqbase]) +#define LTdblfix(p1, p2) LTdbl(vals[oids[p1] - b->hseqbase], \ + vals[oids[p2] - b->hseqbase]) +#define GTdblfix(p1, p2) GTdbl(vals[oids[p1] - b->hseqbase], \ + vals[oids[p2] - b->hseqbase]) +#define LTfix(p1, p2) LT(vals[oids[p1] - b->hseqbase],\ + vals[oids[p2] - b->hseqbase]) +#define GTfix(p1, p2) GT(vals[oids[p1] - b->hseqbase],\ + vals[oids[p2] - b->hseqbase]) #define SWAP1(p1, p2) \ do {\ item = oids[p1];\ @@ -248,10 +262,10 @@ BATfirstn_unique(BAT *b, BAT *s, BUN n, break; #endif case TYPE_flt: - shuffle_unique(flt, LT); + shuffle_unique(flt, LTflt); break; case TYPE_dbl: - shuffle_unique(dbl, LT); + shuffle_unique(dbl, LTdbl); break; default: heapify(LTany, SWAP1); @@ -285,10 +299,10 @@ BATfirstn_unique(BAT *b, BAT *s, BUN n, break; #endif case TYPE_flt: - shuffle_unique(flt, GT); + shuffle_unique(flt, GTflt); break; case TYPE_dbl: - shuffle_unique(dbl, GT); + shuffle_unique(dbl, GTdbl); break; default: heapify(GTany, SWAP1); @@ -316,14 +330,30 @@ BATfirstn_unique(BAT *b, BAT *s, BUN n, return bn; } -#define LTfixgrp(p1, p2) \ - (goids[p1] < goids[p2] || \ -(goids[p1] == goids[p2] && \ - vals[oids[p1] - b->hseqbase] < vals[oids[p2] - b->hseqbase])) -#define GTfixgrp(p1, p2) \ - (goids[p1] < goids[p2] || \ -(goids[p1] == goids[p2] && \ - vals[oids[p1] - b->hseqbase] > vals[oids[p2] - b->hseqbase])) +#define LTfixgrp(p1, p2) \ + (goids[p1] < goids[p2] || \ +(goids[p1] == goids[p2] && \ + LTfix(p1, p2))) +#define LTfltfixgrp(p1, p2)\ + (goids[p1] < goids[p2] || \ +(goids[p1] == goids[p2] && \ + LTfltfix(p1, p2))) +#define LTdblfixgrp(p1, p2)\ + (goids[p1] < goids[p2] || \ +(goids[p1] == goids[p2] && \ + LTdblfix(p1, p2))) +#define GTfixgrp(p1, p2) \ + (goids[p1] < goids[p2] || \ +(goids[p1] == goids[p2] && \ + GTfix(p1, p2))) +#define GTfltfixgrp(p1, p2)\ + (goids[p1] < goids[p2] ||
MonetDB: default - Implemented data base upgrade code for conver...
Changeset: 64682e00f4ab for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=64682e00f4ab Modified Files: gdk/gdk.h gdk/gdk_bbp.c gdk/gdk_logger.c gdk/gdk_logger.h Branch: default Log Message: Implemented data base upgrade code for converting old floating point NIL to NaN. diffs (truncated from 432 to 300 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -859,7 +859,8 @@ typedef struct { #define GDKLIBRARY_NOKEY 061034 /* nokey values can't be trusted */ #define GDKLIBRARY_BADEMPTY061035 /* possibility of duplicate empty str */ #define GDKLIBRARY_TALIGN 061036 /* talign field in BBP.dir */ -#define GDKLIBRARY 061037 +#define GDKLIBRARY_NIL_NAN 061037 /* flt/dbl NIL not represented by NaN */ +#define GDKLIBRARY 061040 typedef struct BAT { /* static bat properties */ diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -922,6 +922,179 @@ fixstrbats(void) } #endif +#ifdef GDKLIBRARY_NIL_NAN +static void +fixfltheap(BAT *b) +{ + long_str filename; + Heap h1;/* old heap */ + Heap h2;/* new heap */ + const char *nme, *bnme; + char *srcdir; + BUN i; + int nofix = 1; + + nme = BBP_physical(b->batCacheid); + srcdir = GDKfilepath(NOFARM, BATDIR, nme, NULL); + if (srcdir == NULL) + GDKfatal("fixfltheap: GDKmalloc failed\n"); + *strrchr(srcdir, DIR_SEP) = 0; + + if ((bnme = strrchr(nme, DIR_SEP)) != NULL) + bnme++; + else + bnme = nme; + sprintf(filename, "BACKUP%c%s", DIR_SEP, bnme); + + /* make backup of heap */ + if (GDKmove(b->theap.farmid, srcdir, bnme, "tail", BAKDIR, bnme, "tail") != GDK_SUCCEED) + GDKfatal("fixfltheap: cannot make backup of %s.tail\n", nme); + /* load old heap */ + h1 = b->theap; + h1.filename = NULL; + h1.base = NULL; + h1.dirty = 0; + if (HEAPload(&h1, filename, "tail", 0) != GDK_SUCCEED) + GDKfatal("fixfltheap: loading old tail heap " +"for BAT %d failed\n", b->batCacheid); + + /* create new heap */ + h2 = b->theap; + h2.filename = GDKfilepath(NOFARM, NULL, nme, "tail"); + if (h2.filename == NULL) + GDKfatal("fixfltheap: GDKmalloc failed\n"); + if (HEAPalloc(&h2, b->batCapacity, b->twidth) != GDK_SUCCEED) + GDKfatal("fixfltheap: allocating new tail heap " +"for BAT %d failed\n", b->batCacheid); + h2.dirty = TRUE; + h2.free = h1.free; + + switch (b->ttype) { + case TYPE_flt: { + const flt *restrict o = (const flt *) h1.base; + flt *restrict n = (flt *) h2.base; + + for (i = 0; i < b->batCount; i++) { + if (o[i] == GDK_flt_min) { + b->tnil = 1; + n[i] = flt_nil; + nofix = 0; + } else { + n[i] = o[i]; + } + } + break; + } + case TYPE_dbl: { + const dbl *restrict o = (const dbl *) h1.base; + dbl *restrict n = (dbl *) h2.base; + + for (i = 0; i < b->batCount; i++) { + if (o[i] == GDK_dbl_min) { + b->tnil = 1; + n[i] = dbl_nil; + nofix = 0; + } else { + n[i] = o[i]; + } + } + break; + } + default: { + struct mbr { + float xmin, ymin, xmax, ymax; + }; + const struct mbr *restrict o = (const struct mbr *) h1.base; + struct mbr *restrict n = (struct mbr *) h2.base; + + assert(strcmp(ATOMunknown_name(b->ttype), "mbr") == 0); + assert(b->twidth == 4 * sizeof(flt)); + + for (i = 0; i < b->batCount; i++) { + if (o[i].xmin == GDK_flt_min || + o[i].xmax == GDK_flt_min || + o[i].ymin == GDK_flt_min || + o[i].ymax == GDK_flt_min) { + b->tnil = 1; + n[i].xmin = n[i].xmax = n[i].ymin = n[i].ymax = flt_nil; + nofix = 0; + } else { + n[i] = o[i]; + } + } + break; + } + } + + /* cleanup */ + HEAPfree(&h1, 0); + if (nofix) { + /* didn't fix anything, move backup back */ + HEAPfree(&h2, 1); +
MonetDB: default - Changelog message.
Changeset: 36067aac1de3 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=36067aac1de3 Modified Files: gdk/ChangeLog sql/ChangeLog Branch: default Log Message: Changelog message. diffs (29 lines): diff --git a/gdk/ChangeLog b/gdk/ChangeLog --- a/gdk/ChangeLog +++ b/gdk/ChangeLog @@ -1,6 +1,10 @@ # ChangeLog file for MonetDB # This file is updated with Maddlog +* Tue Nov 7 2017 Sjoerd Mullender +- The NIL representation of the internal flt and dbl types was changed + from the smallest representable finite value to NaN (not-a-number). + * Mon Sep 18 2017 Sjoerd Mullender - Changed the interface of ATOMformat and VALformat: they now return a pointer to the allocated string. diff --git a/sql/ChangeLog b/sql/ChangeLog --- a/sql/ChangeLog +++ b/sql/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog file for sql # This file is updated with Maddlog +* Tue Nov 7 2017 Sjoerd Mullender +- The internal NULL representation of the REAL (FLOAT) and DOUBLE + types was changed from the smallest representable finite value to NaN + (not-a-number). + * Tue Aug 1 2017 Sjoerd Mullender - Lots of changes to streamline the internal error handling. In principle, all errors should now include a SQLSTATE error code ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jul2017 - Approve upgrade: there should be no GRANTs du...
Changeset: bf278e0f101c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bf278e0f101c Modified Files: sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out sql/test/emptydb-upgrade/Tests/upgrade.stable.out sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out sql/test/testdb-upgrade/Tests/upgrade.stable.out Branch: Jul2017 Log Message: Approve upgrade: there should be no GRANTs during upgrade. diffs (84 lines): diff --git a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out --- a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out +++ b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out @@ -24,17 +24,6 @@ stdout of test 'upgrade` in directory 's # MonetDB/R module loaded Ready. -Running database upgrade commands: -GRANT SELECT ON sys.keywords TO PUBLIC; -GRANT SELECT ON sys.table_types TO PUBLIC; -GRANT SELECT ON sys.dependency_types TO PUBLIC; -GRANT SELECT ON sys.function_types TO PUBLIC; -GRANT SELECT ON sys.function_languages TO PUBLIC; -GRANT SELECT ON sys.key_types TO PUBLIC; -GRANT SELECT ON sys.index_types TO PUBLIC; -GRANT SELECT ON sys.privilege_codes TO PUBLIC; -GRANT EXECUTE ON FUNCTION sys.environment() TO PUBLIC; -GRANT SELECT ON sys.environment TO PUBLIC; # 13:21:57 > # 13:21:57 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-29247" "--port=33065" diff --git a/sql/test/emptydb-upgrade/Tests/upgrade.stable.out b/sql/test/emptydb-upgrade/Tests/upgrade.stable.out --- a/sql/test/emptydb-upgrade/Tests/upgrade.stable.out +++ b/sql/test/emptydb-upgrade/Tests/upgrade.stable.out @@ -24,17 +24,6 @@ stdout of test 'upgrade` in directory 's # MonetDB/R module loaded Ready. -Running database upgrade commands: -GRANT SELECT ON sys.keywords TO PUBLIC; -GRANT SELECT ON sys.table_types TO PUBLIC; -GRANT SELECT ON sys.dependency_types TO PUBLIC; -GRANT SELECT ON sys.function_types TO PUBLIC; -GRANT SELECT ON sys.function_languages TO PUBLIC; -GRANT SELECT ON sys.key_types TO PUBLIC; -GRANT SELECT ON sys.index_types TO PUBLIC; -GRANT SELECT ON sys.privilege_codes TO PUBLIC; -GRANT EXECUTE ON FUNCTION sys.environment() TO PUBLIC; -GRANT SELECT ON sys.environment TO PUBLIC; # 15:41:18 > # 15:41:18 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=/var/tmp/mtest-7576" "--port=32696" diff --git a/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out b/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out --- a/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out +++ b/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out @@ -19,17 +19,6 @@ stdout of test 'upgrade` in directory 's # MonetDB/SQL module loaded Ready. -Running database upgrade commands: -GRANT SELECT ON sys.keywords TO PUBLIC; -GRANT SELECT ON sys.table_types TO PUBLIC; -GRANT SELECT ON sys.dependency_types TO PUBLIC; -GRANT SELECT ON sys.function_types TO PUBLIC; -GRANT SELECT ON sys.function_languages TO PUBLIC; -GRANT SELECT ON sys.key_types TO PUBLIC; -GRANT SELECT ON sys.index_types TO PUBLIC; -GRANT SELECT ON sys.privilege_codes TO PUBLIC; -GRANT EXECUTE ON FUNCTION sys.environment() TO PUBLIC; -GRANT SELECT ON sys.environment TO PUBLIC; # 13:21:58 > # 13:21:58 > "/usr/bin/python2" "upgrade.SQL.py" "upgrade" diff --git a/sql/test/testdb-upgrade/Tests/upgrade.stable.out b/sql/test/testdb-upgrade/Tests/upgrade.stable.out --- a/sql/test/testdb-upgrade/Tests/upgrade.stable.out +++ b/sql/test/testdb-upgrade/Tests/upgrade.stable.out @@ -19,17 +19,6 @@ stdout of test 'upgrade` in directory 's # MonetDB/SQL module loaded Ready. -Running database upgrade commands: -GRANT SELECT ON sys.keywords TO PUBLIC; -GRANT SELECT ON sys.table_types TO PUBLIC; -GRANT SELECT ON sys.dependency_types TO PUBLIC; -GRANT SELECT ON sys.function_types TO PUBLIC; -GRANT SELECT ON sys.function_languages TO PUBLIC; -GRANT SELECT ON sys.key_types TO PUBLIC; -GRANT SELECT ON sys.index_types TO PUBLIC; -GRANT SELECT ON sys.privilege_codes TO PUBLIC; -GRANT EXECUTE ON FUNCTION sys.environment() TO PUBLIC; -GRANT SELECT ON sys.environment TO PUBLIC; # 16:00:56 > # 16:00:56 > "/usr/bin/python2" "upgrade.SQL.py" "upgrade" ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Clang on FreeBSD has problems with an assignm...
Changeset: eebe2e1f921f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=eebe2e1f921f Modified Files: gdk/gdk_select.c Branch: default Log Message: Clang on FreeBSD has problems with an assignment as argument to isnan. diffs (31 lines): diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c --- a/gdk/gdk_select.c +++ b/gdk/gdk_select.c @@ -2399,9 +2399,11 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT #endif case TYPE_flt: { flt vl, vh; - if (is_flt_nil((vl = *(flt *) vrl))) + vl = *(flt *) vrl; + if (is_flt_nil(vl)) continue; - if (is_flt_nil((vh = *(flt *) vrh))) + vh = *(flt *) vrh; + if (is_flt_nil(vh)) continue; if (!li) { if (vl == MAXVALUEflt) @@ -2431,9 +2433,11 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT } case TYPE_dbl: { dbl vl, vh; - if (is_dbl_nil((vl = *(dbl *) vrl))) + vl = *(dbl *) vrl; + if (is_dbl_nil(vl)) continue; - if (is_dbl_nil((vh = *(dbl *) vrh))) + vh = *(dbl *) vrh; + if (is_dbl_nil(vh)) continue; if (!li) { if (vl == MAXVALUEdbl) ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Work around issues with Intel compiler.
Changeset: d12146e172a5 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d12146e172a5 Modified Files: NT/monetdb_config.h.in gdk/gdk_atoms.c gdk/gdk_atoms.h gdk/gdk_utils.c Branch: default Log Message: Work around issues with Intel compiler. - On Windows, make sure mathimf.h is included before there is any chance math.h is included. - On both Windows and Linux, initialize flt_nil and dbl_nil to NAN at run time, since the Intel compiler uses a value that cannot be used as static initializer. diffs (73 lines): diff --git a/NT/monetdb_config.h.in b/NT/monetdb_config.h.in --- a/NT/monetdb_config.h.in +++ b/NT/monetdb_config.h.in @@ -33,6 +33,12 @@ #define _CRT_SECURE_NO_DEPRECATE 1 #endif +/* include Intel's mathimf.h early, before any other include files + * might try to include math.h */ +#ifdef __INTEL_COMPILER +#include +#endif + #include #if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c --- a/gdk/gdk_atoms.c +++ b/gdk/gdk_atoms.c @@ -251,8 +251,15 @@ ATOMisdescendant(int tpe, int parent) const bte bte_nil = GDK_bte_min-1; const sht sht_nil = GDK_sht_min-1; const int int_nil = GDK_int_min-1; +#ifdef __INTEL_COMPILER +/* stupid Intel compiler uses a value that cannot be used in an + * initializer for NAN, so we have to initialize at run time */ +flt flt_nil; +dbl dbl_nil; +#else const flt flt_nil = NAN; const dbl dbl_nil = NAN; +#endif const lng lng_nil = GDK_lng_min-1; #ifdef HAVE_HGE const hge hge_nil = GDK_hge_min-1; diff --git a/gdk/gdk_atoms.h b/gdk/gdk_atoms.h --- a/gdk/gdk_atoms.h +++ b/gdk/gdk_atoms.h @@ -106,8 +106,15 @@ gdk_export size_t escapedStr(char *dst, gdk_export const bte bte_nil; gdk_export const sht sht_nil; gdk_export const int int_nil; -gdk_export const flt flt_nil; -gdk_export const dbl dbl_nil; +#ifdef __INTEL_COMPILER +/* stupid Intel compiler uses a value that cannot be used in an + * initializer for NAN, so we have to initialize at run time */ +#define NANCONST +#else +#define NANCONST const +#endif +gdk_export NANCONST flt flt_nil; +gdk_export NANCONST dbl dbl_nil; gdk_export const lng lng_nil; #ifdef HAVE_HGE gdk_export const hge hge_nil; diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -449,6 +449,13 @@ GDKinit(opt *set, int setlen) assert(sizeof(size_t) == SIZEOF_SIZE_T); assert(SIZEOF_OID == SIZEOF_INT || SIZEOF_OID == SIZEOF_LNG); +#ifdef __INTEL_COMPILER + /* stupid Intel compiler uses a value that cannot be used in an +* initializer for NAN, so we have to initialize at run time */ + flt_nil = NAN; + dbl_nil = NAN; +#endif + #ifdef NEED_MT_LOCK_INIT MT_lock_init(&MT_system_lock,"MT_system_lock"); ATOMIC_INIT(GDKstoppedLock); ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: default - Approved after d12146e172a5.
Changeset: e451183b4d0b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e451183b4d0b Modified Files: clients/Tests/exports.stable.out Branch: default Log Message: Approved after d12146e172a5. diffs (21 lines): 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 @@ -377,7 +377,7 @@ const bte bte_nil; int closedir(DIR *dir); ssize_t dblFromStr(const char *src, size_t *len, dbl **dst); ssize_t dblToStr(str *dst, size_t *len, const dbl *src); -const dbl dbl_nil; +NANCONST dbl dbl_nil; char *dirname(char *path); int dlclose(void *handle); char *dlerror(void); @@ -387,7 +387,7 @@ size_t escapedStr(char *dst, const char size_t escapedStrlen(const char *src, const char *sep1, const char *sep2, int quote); ssize_t fltFromStr(const char *src, size_t *len, flt **dst); ssize_t fltToStr(str *dst, size_t *len, const flt *src); -const flt flt_nil; +NANCONST flt flt_nil; geomcatalogfix_fptr geomcatalogfix_get(void); void geomcatalogfix_set(geomcatalogfix_fptr); geomsqlfix_fptr geomsqlfix_get(void); ___ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list
MonetDB: Jul2017 - Properly support dates, times and timestamps ...
Changeset: 839bd7161d60 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=839bd7161d60 Modified Files: sql/backends/monet5/Tests/pyloader07.sql sql/backends/monet5/Tests/pyloader07.stable.out sql/backends/monet5/Tests/pyloader07.stable.out.Windows sql/backends/monet5/UDF/pyapi/convert_loops.h sql/backends/monet5/UDF/pyapi/emit.c Branch: Jul2017 Log Message: Properly support dates, times and timestamps in Python loader functions. diffs (247 lines): diff --git a/sql/backends/monet5/Tests/pyloader07.sql b/sql/backends/monet5/Tests/pyloader07.sql --- a/sql/backends/monet5/Tests/pyloader07.sql +++ b/sql/backends/monet5/Tests/pyloader07.sql @@ -9,3 +9,21 @@ SELECT * FROM pyloader07table; DROP TABLE pyloader07table; DROP LOADER pyloader07; ROLLBACK; + +START TRANSACTION; + +CREATE TABLE tstamp(d DATE, s TIME, t TIMESTAMP); + + +CREATE LOADER pyloader07() LANGUAGE PYTHON { +_emit.emit({'d': '2014-05-20', 's': '00:02:30', 't': '2014-05-20 00:02:30'}); +_emit.emit({'d': ['2014-05-20'], 's': ['00:02:30'], 't': ['2014-05-20 00:02:30']}); +}; + +COPY LOADER INTO tstamp FROM pyloader07(); + +SELECT * FROM tstamp; +DROP TABLE tstamp; +DROP LOADER pyloader07; + +ROLLBACK; diff --git a/sql/backends/monet5/Tests/pyloader07.stable.out b/sql/backends/monet5/Tests/pyloader07.stable.out --- a/sql/backends/monet5/Tests/pyloader07.stable.out +++ b/sql/backends/monet5/Tests/pyloader07.stable.out @@ -75,6 +75,24 @@ Ready. #DROP TABLE pyloader07table; #DROP LOADER pyloader07; #ROLLBACK; +#START TRANSACTION; +#CREATE TABLE tstamp(d DATE, s TIME, t TIMESTAMP); +#CREATE LOADER pyloader07() LANGUAGE PYTHON { +#_emit.emit({'d': '2014-05-20', 's': '00:02:30', 't': '2014-05-20 00:02:30'}); +#_emit.emit({'d': ['2014-05-20'], 's': ['00:02:30'], 't': ['2014-05-20 00:02:30']}); +#}; +#COPY LOADER INTO tstamp FROM pyloader07(); +[ 2] +#SELECT * FROM tstamp; +% sys.tstamp, sys.tstamp, sys.tstamp # table_name +% d, s, t # name +% date,time, timestamp # type +% 10, 8, 26 # length +[ 2014-05-20, 00:02:30, 2014-05-20 00:02:30.00 ] +[ 2014-05-20, 00:02:30, 2014-05-20 00:02:30.00 ] +#DROP TABLE tstamp; +#DROP LOADER pyloader07; +#ROLLBACK; # 15:06:46 > # 15:06:46 > "Done." diff --git a/sql/backends/monet5/Tests/pyloader07.stable.out.Windows b/sql/backends/monet5/Tests/pyloader07.stable.out.Windows --- a/sql/backends/monet5/Tests/pyloader07.stable.out.Windows +++ b/sql/backends/monet5/Tests/pyloader07.stable.out.Windows @@ -75,6 +75,24 @@ Ready. #DROP TABLE pyloader07table; #DROP LOADER pyloader07; #ROLLBACK; +#START TRANSACTION; +#CREATE TABLE tstamp(d DATE, s TIME, t TIMESTAMP); +#CREATE LOADER pyloader07() LANGUAGE PYTHON { +#_emit.emit({'d': '2014-05-20', 's': '00:02:30', 't': '2014-05-20 00:02:30'}); +#_emit.emit({'d': ['2014-05-20'], 's': ['00:02:30'], 't': ['2014-05-20 00:02:30']}); +#}; +#COPY LOADER INTO tstamp FROM pyloader07(); +[ 2] +#SELECT * FROM tstamp; +% sys.tstamp, sys.tstamp, sys.tstamp # table_name +% d, s, t # name +% date,time, timestamp # type +% 10, 8, 26 # length +[ 2014-05-20, 00:02:30, 2014-05-20 00:02:30.00 ] +[ 2014-05-20, 00:02:30, 2014-05-20 00:02:30.00 ] +#DROP TABLE tstamp; +#DROP LOADER pyloader07; +#ROLLBACK; # 15:06:46 > # 15:06:46 > "Done." diff --git a/sql/backends/monet5/UDF/pyapi/convert_loops.h b/sql/backends/monet5/UDF/pyapi/convert_loops.h --- a/sql/backends/monet5/UDF/pyapi/convert_loops.h +++ b/sql/backends/monet5/UDF/pyapi/convert_loops.h @@ -282,6 +282,24 @@ } \ } + +static gdk_return +convert_and_append(BAT* b, const char* text, bit force) { + if (b->ttype == TYPE_str) { + return BUNappend(b, text, force); + } else if (text == str_nil) { + return BUNappend(b, BATatoms[b->ttype].atomNull, force); + } else { + void* element = NULL; + int len = 0; + + BATatoms[b->ttype].atomFromStr(text, &len, &element); + gdk_return ret = BUNappend(b, element, force); + GDKfree(element); + return ret; + } +} + // This #define is for converting a numeric numpy array into a string BAT. // 'conv' is a function that turns a numeric value of type 'mtpe' to a char* // array. @@ -291,7 +309,7 @@ snprintf(utf8_string, utf8string_minlength, fmt, \ *((mtpe *)&data[(index_offset * ret->count + iu) *\ ret->memory_size])); \ - if (BUNappend(bat, utf8_string, FALSE) != GDK_SUCCEED) { \ + if (convert_and_append(bat, u