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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list