Changeset: 1decbe6e010b for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1decbe6e010b Modified Files: Branch: default Log Message:
merging diffs (truncated from 527 to 300 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 @@ -590,9 +590,6 @@ /* Define to 1 if you have the <time.h> header file. */ #define HAVE_TIME_H 1 -/* Define to 1 if you have the timezone and daylight variables. */ -#define HAVE_TIMEZONE 1 - /* Define to 1 if you have the `trunc' function. */ /* #undef HAVE_TRUNC */ diff --git a/clients/mapiclient/mclient.c b/clients/mapiclient/mclient.c --- a/clients/mapiclient/mclient.c +++ b/clients/mapiclient/mclient.c @@ -2491,19 +2491,19 @@ doFile(Mapi mid, const char *file, int u static void set_timezone(Mapi mid) { -#ifdef HAVE_TIMEZONE -#ifdef _MSC_VER -#define timezone _timezone -#endif char buf[128]; - struct tm *tm; - time_t t; + time_t t, lt, gt; + struct tm *tmp; long tzone; MapiHdl hdl; + /* figure out our current timezone */ t = time(NULL); - tm = localtime(&t); - tzone = timezone - 3600 * tm->tm_isdst; + tmp = gmtime(&t); + gt = mktime(tmp); + tmp = localtime(&t); + lt = mktime(tmp); + tzone = (long) (gt - lt); if (tzone < 0) snprintf(buf, sizeof(buf), "SET TIME ZONE INTERVAL '+%02ld:%02ld' HOUR TO MINUTE", @@ -2518,9 +2518,6 @@ set_timezone(Mapi mid) return; } mapi_close_handle(hdl); -#else - (void) mid; -#endif } static void usage(const char *prog, int xit) diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -58,19 +58,19 @@ static void set_timezone(Mapi mid) { -#ifdef HAVE_TIMEZONE -#ifdef _MSC_VER -#define timezone _timezone -#define daylight _daylight -#define tzset _tzset -#endif char buf[128]; + time_t t, lt, gt; + struct tm *tmp; long tzone; MapiHdl hdl; - /* timezone and daylight are POSIX-defined variables */ - tzset(); - tzone = timezone - 3600 * daylight; + /* figure out our current timezone */ + t = time(NULL); + tmp = gmtime(&t); + gt = mktime(tmp); + tmp = localtime(&t); + lt = mktime(tmp); + tzone = (long) (gt - lt); if (tzone < 0) snprintf(buf, sizeof(buf), "SET TIME ZONE INTERVAL '+%02ld:%02ld' HOUR TO MINUTE", @@ -81,9 +81,6 @@ set_timezone(Mapi mid) tzone / 3600, (tzone % 3600) / 60); if ((hdl = mapi_query(mid, buf)) != NULL) mapi_close_handle(hdl); -#else - (void) mid; -#endif } static void diff --git a/configure.ag b/configure.ag --- a/configure.ag +++ b/configure.ag @@ -2530,16 +2530,6 @@ AH_VERBATIM([__attribute__], #endif ]) -AC_MSG_CHECKING([if you have timezone and daylight variables]) -AC_COMPILE_IFELSE( - [AC_LANG_PROGRAM( - [[#include <time.h>]], - [[printf("%ld %d\n", timezone, daylight);]])], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_TIMEZONE], 1, - [Define to 1 if you have the timezone and daylight variables.]), - AC_MSG_RESULT([no])) - dnl checks for library functions case $host in *-darwin1[[01234]]*) diff --git a/sql/backends/monet5/UDF/Tests/udf-fuse.sql b/sql/backends/monet5/UDF/Tests/udf-fuse.sql --- a/sql/backends/monet5/UDF/Tests/udf-fuse.sql +++ b/sql/backends/monet5/UDF/Tests/udf-fuse.sql @@ -1,3 +1,5 @@ +set optimizer = 'sequential_pipe'; + explain select fuse(1,2); select fuse(1,2); diff --git a/sql/backends/monet5/UDF/Tests/udf-reverse.sql b/sql/backends/monet5/UDF/Tests/udf-reverse.sql --- a/sql/backends/monet5/UDF/Tests/udf-reverse.sql +++ b/sql/backends/monet5/UDF/Tests/udf-reverse.sql @@ -1,3 +1,5 @@ +set optimizer = 'sequential_pipe'; + explain select reverse('MonetDB'); select reverse('MonetDB'); diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -1197,10 +1197,49 @@ rel_subquery_optname(mvc *sql, sql_rel * return rel_table_optname(sql, sq, sn->name); } +sql_rel * +rel_with_query(mvc *sql, symbol *q ) +{ + dnode *d = q->data.lval->h; + symbol *select = d->next->data.sym; + sql_rel *rel; + + stack_push_frame(sql, "WITH"); + /* first handle all with's (ie inlined views) */ + for (d = d->data.lval->h; d; d = d->next) { + symbol *sym = d->data.sym; + dnode *dn = sym->data.lval->h; + char *name = qname_table(dn->data.lval); + sql_rel *nrel; + + if (frame_find_var(sql, name)) { + return sql_error(sql, 01, "Variable '%s' allready declared", name); + } + nrel = rel_semantic(sql, sym); + if (!nrel) { + stack_pop_frame(sql); + return NULL; + } + stack_push_rel_view(sql, name, nrel); + assert(is_project(nrel->op)); + if (is_project(nrel->op) && nrel->exps) { + node *ne = nrel->exps->h; + + for (; ne; ne = ne->next) + noninternexp_setname(sql->sa, ne->data, name, NULL ); + } + } + rel = rel_semantic(sql, select); + stack_pop_frame(sql); + return rel; +} + static sql_rel * query_exp_optname(mvc *sql, sql_rel *r, symbol *q) { switch (q->token) { + case SQL_WITH: + return rel_with_query(sql, q); case SQL_UNION: case SQL_EXCEPT: case SQL_INTERSECT: @@ -2691,11 +2730,13 @@ rel_logical_value_exp(mvc *sql, sql_rel } default: { sql_exp *re, *le = rel_value_exp(sql, rel, sc, f, ek); + sql_subtype bt; if (!le) return NULL; re = exp_atom_bool(sql->sa, 1); - if (rel_convert_types(sql, &le, &re, 1, type_equal) < 0) + sql_find_subtype(&bt, "boolean", 0, 0); + if ((le = rel_check_type(sql, &bt, le, type_equal)) == NULL) return NULL; return rel_binop_(sql, le, re, NULL, "=", 0); } diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h --- a/sql/server/rel_select.h +++ b/sql/server/rel_select.h @@ -81,5 +81,6 @@ extern char * rel_name( sql_rel *r ); extern sql_rel *rel_groupby(sql_allocator *sa, sql_rel *l, list *groupbyexps ); extern sql_exp *rel_groupby_add_aggr(mvc *sql, sql_rel *rel, sql_exp *e); extern sql_rel *rel_inplace_groupby(sql_rel *rel, sql_rel *l, list *groupbyexps, list *exps ); +extern sql_rel *rel_with_query(mvc *sql, symbol *q); #endif /*_REL_SELECT_H_*/ diff --git a/sql/server/rel_semantic.c b/sql/server/rel_semantic.c --- a/sql/server/rel_semantic.c +++ b/sql/server/rel_semantic.c @@ -222,40 +222,7 @@ rel_semantic(mvc *sql, symbol *s) return rel_updates(sql, s); case SQL_WITH: - { - dnode *d = s->data.lval->h; - symbol *select = d->next->data.sym; - sql_rel *rel = NULL; - - stack_push_frame(sql, "WITH"); - /* first handle all with's (ie inlined views) */ - for (d = d->data.lval->h; d; d = d->next) { - symbol *sym = d->data.sym; - dnode *dn = sym->data.lval->h; - char *name = qname_table(dn->data.lval); - sql_rel *nrel; - - if (frame_find_var(sql, name)) { - return sql_error(sql, 01, "Variable '%s' allready declared", name); - } - nrel = rel_semantic(sql, sym); - if (!nrel) { - stack_pop_frame(sql); - return NULL; - } - stack_push_rel_view(sql, name, nrel); - assert(is_project(nrel->op)); - if (is_project(nrel->op) && nrel->exps) { - node *ne = nrel->exps->h; - - for (; ne; ne = ne->next) - noninternexp_setname(sql->sa, ne->data, name, NULL ); - } - } - rel = rel_semantic(sql, select); - stack_pop_frame(sql); - return rel; - } + return rel_with_query(sql, s); case SQL_MULSTMT: { dnode *d; diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -106,6 +106,7 @@ int yydebug=1; set_statement sql sqlstmt + with_query schema opt_schema_default_char_set opt_path_specification @@ -2791,7 +2792,11 @@ join_spec: RECURSIVE and <search or cycle clause> are currently not supported */ -sql: + +sql: with_query + ; + +with_query: WITH with_list query_expression { dlist *l = L(); @@ -2799,7 +2804,7 @@ sql: append_symbol(l, $3); $$ = _symbol_create_list( SQL_WITH, l ); } - ; + ; with_list: with_list ',' with_list_element { $$ = append_symbol($1, $3); } @@ -3309,6 +3314,8 @@ subquery: '(' select_no_parens ')' { $$ = $2; } | '(' VALUES row_commalist ')' { $$ = _symbol_create_list( SQL_VALUES, $3); } + | '(' with_query ')' + { $$ = $2; } ; /* simple_scalar expressions */ diff --git a/sql/test/BugTracker-2012/Tests/All b/sql/test/BugTracker-2012/Tests/All _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list