Re: [Monetdb-developers] MonetDB: default - Merge with default branch.
oop, sorry, message should have been "Merge with Apr2012 branch." Stefan On Sat, Mar 17, 2012 at 03:20:38PM +0100, Stefan Manegold wrote:
Changeset: 498e01451664 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=498e01451664 Modified Files: clients/mapiclient/mclient.c monetdb5/mal/mal_resolve.c sql/backends/monet5/UDF/udf.c sql/backends/monet5/UDF/udf.h sql/test/bugs/Tests/crash_order_by.stable.out tools/merovingian/daemon/controlrunner.c tools/merovingian/daemon/merovingian.c Branch: default Log Message:
Merge with default branch.
diffs (truncated from 413 to 300 lines):
diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -654,7 +654,9 @@ CSVrenderer(MapiHdl hdl) s = mapi_fetch_field(hdl, i); if (s == NULL) s = nullstring == default_nullstring ? "" : nullstring; - if (strchr(s, *sep) != NULL || strchr(s, '\n') != NULL || strchr(s, '"') != NULL) { + if (strchr(s, *sep) != NULL || + strchr(s, '\n') != NULL || + strchr(s, '"') != NULL) { mnstr_printf(toConsole, "%s\"", i == 0 ? "" : sep); while (*s) { @@ -675,8 +677,6 @@ CSVrenderer(MapiHdl hdl) mnstr_write(toConsole, "\"\"", 1, 2); break; default: - if (*s == *sep) - mnstr_write(toConsole, "\\", 1, 1); mnstr_write(toConsole, s, 1, 1); break; } diff --git a/monetdb5/mal/mal_resolve.c b/monetdb5/mal/mal_resolve.c --- a/monetdb5/mal/mal_resolve.c +++ b/monetdb5/mal/mal_resolve.c @@ -68,7 +68,7 @@ * These examples give little room to achieve our prime objective, i.e. * a fast and early type resolution scheme. Any non-polymorphic function * can be type checked and marked type-safe upon completion. - * Type checking polymorphic functions are post-poned until a concrete + * Type checking polymorphic functions are postponed until a concrete * type instance is known. It leads to a clone, which can be type checked * and is entered into the symbol table. * The type resolution status is marked in each instruction. diff --git a/sql/backends/monet5/UDF/udf.c b/sql/backends/monet5/UDF/udf.c --- a/sql/backends/monet5/UDF/udf.c +++ b/sql/backends/monet5/UDF/udf.c @@ -3,26 +3,26 @@ * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.monetdb.org/Legal/MonetDBLicense - * + * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. - * + * * The Original Code is the MonetDB Database System. - * + * * The Initial Developer of the Original Code is CWI. * Portions created by CWI are Copyright (C) 1997-July 2008 CWI. * Copyright August 2008-2012 MonetDB B.V. * All Rights Reserved. -*/ - + */
#include "monetdb_config.h" #include "udf.h"
/* Reverse a string */ -str UDFreverse ( str *ret , str *arg ) +str +UDFreverse(str *ret, str *arg) { size_t len = 0; str src = NULL, dst = NULL; @@ -37,7 +37,8 @@ str UDFreverse ( str *ret , str *arg ) if (src == NULL || strcmp(src, str_nil) == 0) { *ret = GDKstrdup(str_nil); if (*ret == NULL) - throw(MAL, "udf.reverse", "failed to create copy of str_nil"); + throw(MAL, "udf.reverse", + "failed to create copy of str_nil");
return MAL_SUCCEED; } @@ -46,7 +47,8 @@ str UDFreverse ( str *ret , str *arg ) len = strlen(src); *ret = dst = GDKmalloc(len + 1); if (dst == NULL) - throw(MAL, "udf.reverse", "failed to allocate string of length " SZFMT, len+1); + throw(MAL, "udf.reverse", + "failed to allocate string of length " SZFMT, len + 1);
/* copy characters from src to dst in reverse order */ dst[len] = 0; @@ -62,7 +64,8 @@ str UDFreverse ( str *ret , str *arg ) * Generic "type-oblivious" version, * using generic "type-oblivious" BAT access interface. */ -str UDFBATreverse ( bat *ret , bat *bid ) +str +UDFBATreverse(bat *ret, bat *bid) { BATiter li; BAT *bn = NULL, *left = NULL; @@ -78,7 +81,8 @@ str UDFBATreverse ( bat *ret , bat *bid /* check tail type */ if (left->ttype != TYPE_str) { BBPreleaseref(left->batCacheid); - throw(MAL, "batudf.reverse", "tail-type of input BAT must be TYPE_str"); + throw(MAL, "batudf.reverse", + "tail-type of input BAT must be TYPE_str"); }
/* allocate result BAT */ @@ -98,6 +102,7 @@ str UDFBATreverse ( bat *ret , bat *bid /* the core of the algorithm, expensive due to malloc/frees */ BATloop(left, p, q) { str tr = NULL, err = NULL; + /* get original head & tail value */ ptr h = BUNhead(li, p); str t = (str) BUNtail(li, p); @@ -106,7 +111,8 @@ str UDFBATreverse ( bat *ret , bat *bid err = UDFreverse(&tr, &t); if (err != MAL_SUCCEED) { /* error -> bail out */ - BATaccessEnd(left, USE_HEAD | USE_TAIL, MMAP_SEQUENTIAL); + BATaccessEnd(left, USE_HEAD | USE_TAIL, + MMAP_SEQUENTIAL); BBPreleaseref(left->batCacheid); BBPreleaseref(*ret); return err; @@ -116,7 +122,7 @@ str UDFBATreverse ( bat *ret , bat *bid assert(tr != NULL);
/* insert original head and reversed tail in result BAT */ - /* BUNins() takes care of all necessary admininstration */ + /* BUNins() takes care of all necessary administration */ BUNins(bn, h, tr, FALSE);
/* free memory allocated in UDFreverse() */ @@ -155,9 +161,9 @@ str UDFfuse_##in##_##out ( out *ret , in return MAL_SUCCEED; \ }
-UDFfuse_scalar_impl(bte,unsigned char ,sht, 8) -UDFfuse_scalar_impl(sht,unsigned short,int,16) -UDFfuse_scalar_impl(int,unsigned int ,lng,32) +UDFfuse_scalar_impl(bte, unsigned char, sht, 8) +UDFfuse_scalar_impl(sht, unsigned short, int, 16) +UDFfuse_scalar_impl(int, unsigned int, lng, 32)
/* BAT fuse */ @@ -165,8 +171,8 @@ UDFfuse_scalar_impl(int,unsigned int ,l * Type-expanded optimized version, * accessing value arrays directly. */ -str -UDFBATfuse ( bat *ires , bat *ione , bat *itwo) + str +UDFBATfuse(bat *ires, bat *ione, bat *itwo) { BAT *bres = NULL, *bone = NULL, *btwo = NULL; bit two_tail_sorted_unsigned = FALSE; @@ -185,89 +191,102 @@ UDFBATfuse ( bat *ires , bat *ione , bat }
/* check for dense & aligned heads */ - if (!BAThdense(bone) || !BAThdense(btwo) || BATcount(bone) != BATcount(btwo) || bone->hseqbase != btwo->hseqbase) { + if (!BAThdense(bone) || + !BAThdense(btwo) || + BATcount(bone) != BATcount(btwo) || + bone->hseqbase != btwo->hseqbase) { BBPreleaseref(bone->batCacheid); BBPreleaseref(btwo->batCacheid); - throw(MAL, "batudf.fuse", "heads of input BATs must be aligned"); + throw(MAL, "batudf.fuse", + "heads of input BATs must be aligned"); }
/* check tail types */ if (bone->ttype != btwo->ttype) { BBPreleaseref(bone->batCacheid); BBPreleaseref(btwo->batCacheid); - throw(MAL, "batudf.fuse", "tails of input BATs must be identical"); + throw(MAL, "batudf.fuse", + "tails of input BATs must be identical"); }
/* advice on sequential scan */ BATaccessBegin(bone, USE_TAIL, MMAP_SEQUENTIAL); BATaccessBegin(btwo, USE_TAIL, MMAP_SEQUENTIAL);
-#define UDFBATfuse_TYPE(in,uin,out,shift) \ -{ /* type-specific core algorithm */ \ - in *one = NULL, *two = NULL; \ - out *res = NULL; \ - BUN i, n = BATcount(bone); \ - \ - /* allocate result BAT */ \ - bres = BATnew(TYPE_void, TYPE_##out, n); \ - if (bres == NULL) { \ - BBPreleaseref(bone->batCacheid); \ - BBPreleaseref(btwo->batCacheid); \ - throw(MAL, "batudf.fuse", MAL_MALLOC_FAIL); \ - } \ - \ - /* get direct access to the tail arrays */ \ - one = (in *) Tloc(bone, BUNfirst(bone)); \ - two = (in *) Tloc(btwo, BUNfirst(btwo)); \ - res = (out*) Tloc(bres, BUNfirst(bres)); \ - \ - /* is tail of right/second BAT sorted, also when cast to unsigned type, */ \ - /* i.e., are the values either all >= 0 or all < 0? */ \ - two_tail_sorted_unsigned = BATtordered(btwo)&1 && ( two[0] >= 0 || two[n-1] < 0 ); \ - \ - /* iterate over all values/tuples and do the work */ \ - for (i = 0; i < n; i++) \ - if (one[i] == in##_nil || two[i] == in##_nil) \ - /* NULL/nil in => NULL/nil out */ \ - res[i] = out##_nil; \ - else \ - /* do the work; watch out for sign bits */ \ - res[i] = ( ((out)((uin)one[i])) << shift ) | ((uin)two[i]); \ - \ - /* set number of tuples in result BAT */ \ - BATsetcount(bres, n); \ -} +#define UDFBATfuse_TYPE(in,uin,out,shift) \ +do { /* type-specific core algorithm */ \ + in *one = NULL, *two = NULL; \ + out *res = NULL; \ + BUN i, n = BATcount(bone); \ + \ + /* allocate result BAT */ \ + bres = BATnew(TYPE_void, TYPE_##out, n); \ + if (bres == NULL) { \ + BBPreleaseref(bone->batCacheid); \ + BBPreleaseref(btwo->batCacheid); \ + throw(MAL, "batudf.fuse", MAL_MALLOC_FAIL); \ + } \ + \ + /* get direct access to the tail arrays */ \ + one = (in *) Tloc(bone, BUNfirst(bone)); \ + two = (in *) Tloc(btwo, BUNfirst(btwo)); \ + res = (out*) Tloc(bres, BUNfirst(bres)); \ + \ + /* is tail of right/second BAT sorted, also when cast to \ + * unsigned type, */ \ + /* i.e., are the values either all >= 0 or all < 0? */ \ + two_tail_sorted_unsigned = BATtordered(btwo) & 1 && \ + (two[0] >= 0 || two[n - 1] < 0); \ + \ + /* iterate over all values/tuples and do the work */ \ + for (i = 0; i < n; i++) \ + if (one[i] == in##_nil || two[i] == in##_nil) \ + /* NULL/nil in => NULL/nil out */ \ + res[i] = out##_nil; \ + else \ + /* do the work; watch out for sign bits */ \ + res[i] = ((out) (uin) one[i] << shift) | (uin) two[i]; \ + \ + /* set number of tuples in result BAT */ \ + BATsetcount(bres, n); \ +} while (0)
/* type expansion for core algorithm */ switch (bone->ttype) { case TYPE_bte: - UDFBATfuse_TYPE(bte,unsigned char ,sht, 8) + UDFBATfuse_TYPE(bte, unsigned char, sht, 8); break; + case TYPE_sht: - UDFBATfuse_TYPE(sht,unsigned short,int,16) + UDFBATfuse_TYPE(sht, unsigned short, int, 16); break; + case TYPE_int: - UDFBATfuse_TYPE(int,unsigned int ,lng,32) + UDFBATfuse_TYPE(int, unsigned int, lng, 32); break; + default: - throw(MAL, "batudf.fuse", "tails of input BATs must be one of {bte, sht, int}"); + throw(MAL, "batudf.fuse", + "tails of input BATs must be one of {bte, sht, int}"); }
BATaccessEnd(bone, USE_TAIL, MMAP_SEQUENTIAL); BATaccessEnd(btwo, USE_TAIL, MMAP_SEQUENTIAL);
/* set result properties */ - bres->hdense = TRUE; /* result head is dense */ + bres->hdense = TRUE; /* result head is dense */ BATseqbase(bres, bone->hseqbase); /* result head has same seqbase as input */ - bres->hsorted = GDK_SORTED; /* result head is sorted */ - BATkey(bone, TRUE); /* result head is key (unique) */ + bres->hsorted = GDK_SORTED; /* result head is sorted */ + BATkey(bres, TRUE); /* result head is key (unique) */
- /* Result tail is sorted, if the left/first input tail is sorted and key (unique), _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list
-- | Stefan.Manegold @ CWI.nl | DB Architectures (INS1) | | http://CWI.nl/~manegold/ | Science Park 123 (L321) | | Tel.: +31 (0)20 592-4212 | 1098 XG Amsterdam (NL) |
participants (1)
-
Stefan Manegold