Changeset: da05cadf53c5 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=da05cadf53c5 Modified Files: sql/server/rel_optimizer.c Branch: DVframework Log Message:
pmv: no need for enumeration and outer join if point query. diffs (191 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -71,7 +71,7 @@ int enumerate_pkey_space(str** ret, sel_ int* enumerate_and_insert_into_temp_table(mvc *sql, sel_predicate** sps, int num_PERPAD); str SQLstatementIntern(Client c, str *expr, str nme, int execute, bit output); str VAL2str(ValRecord* valp); -void find_out_pkey_space_for_unavailable_required_derived_metadata(mvc* sql, list* list_of_PERPAD, int* is_pkey_to_be_enumerated, int num_pkeys_to_be_enumerated); +int find_out_pkey_space_for_unavailable_required_derived_metadata(mvc* sql, list* list_of_PERPAD, int* is_pkey_to_be_enumerated, int num_pkeys_to_be_enumerated); void compute_and_insert_unavailable_required_derived_metadata(mvc* sql, sel_predicate** sps, int num_PERPAD, int* is_pkey_to_be_enumerated, int num_pkeys_to_be_enumerated); str* get_pkey_bound_to_dataview(str schema_name, str dmdt_name); str form_pkey_select_str(sel_predicate** sps, int num_PERPAD, str* pkey_bound_to_dataview, str* select_str_per_pkey); @@ -1175,6 +1175,9 @@ int* enumerate_and_insert_into_temp_tabl is_pkey_to_be_enumerated[i] = 0; } + if(num_pkeys_to_be_enumerated == 0) + return is_pkey_to_be_enumerated; + s = "CREATE TEMP TABLE %s ("; j = 0; temp_column_name = temp_column_name_start; @@ -1323,38 +1326,43 @@ str VAL2str(ValRecord* valp) * INSERT INTO tt_res SELECT * FROM (SELECT * FROM tt LEFT OUTER JOIN (SELECT d_st FROM days WHERE d_st >= '2013-01-08' AND d_st <= '2013-01-22') AS dd ON tt.d = dd.d_st) AS ee WHERE ee.d_st IS NULL; */ -void find_out_pkey_space_for_unavailable_required_derived_metadata(mvc* sql, list* list_of_PERPAD, int* is_pkey_to_be_enumerated, int num_pkeys_to_be_enumerated) +int find_out_pkey_space_for_unavailable_required_derived_metadata(mvc* sql, list* list_of_PERPAD, int* is_pkey_to_be_enumerated, int num_pkeys_to_be_enumerated) { /* Form the sub-query. That has the PERPAD, but like in the original query */ int i,j; node *n = NULL; int num_sp; - str s, table_name, buf2, q, schema_name, r, s2; + str s, table_name, buf2, q, schema_name, r, s2, dq; char temp_column_name; Client cntxt; if(list_of_PERPAD == NULL || is_pkey_to_be_enumerated == NULL) - return; + return 1; num_sp = list_length(list_of_PERPAD); - s = "SELECT "; - - for (n = list_of_PERPAD->h, i = 0, j = 0; n; n = n->next, i++) + if(num_pkeys_to_be_enumerated == 0) // point query + s = "SELECT COUNT(*) INTO is_there"; + else { - sel_predicate *sp = n->data; + s = "SELECT "; - if(is_pkey_to_be_enumerated[i]) + for (n = list_of_PERPAD->h, i = 0, j = 0; n; n = n->next, i++) { - str buf = (str)GDKmalloc(num_sp*64*sizeof(char)); - j++; - if(j == num_pkeys_to_be_enumerated) - sprintf(buf, "%s %s", s, sp->column->base.name); - else - sprintf(buf, "%s %s,", s, sp->column->base.name); - s = GDKstrdup(buf); - GDKfree(buf); + sel_predicate *sp = n->data; + + if(is_pkey_to_be_enumerated[i]) + { + str buf = (str)GDKmalloc(num_sp*64*sizeof(char)); + j++; + if(j == num_pkeys_to_be_enumerated) + sprintf(buf, "%s %s", s, sp->column->base.name); + else + sprintf(buf, "%s %s,", s, sp->column->base.name); + s = GDKstrdup(buf); + GDKfree(buf); + } } } @@ -1430,8 +1438,53 @@ void find_out_pkey_space_for_unavailable GDKfree(buf); } + if(num_pkeys_to_be_enumerated == 0) + { + str buf = (str)GDKmalloc(num_sp*128*sizeof(char)); + sprintf(buf, "%s;\n", s); + s = GDKstrdup(buf); + GDKfree(buf); + } + printf("subquery: %s\n", s); + cntxt = MCgetClient(sql->clientid); + + if(num_pkeys_to_be_enumerated == 0) + { + ValRecord *v; + v = stack_get_var(sql, "is_there"); + + if(v == NULL) + { + dq = "DECLARE is_there INTEGER;\n"; + + if(SQLstatementIntern(cntxt,&dq,"pmv.declare_count_var",TRUE,FALSE)!= MAL_SUCCEED) + {/* insert into query not succeeded, what to do */ + printf("***query didnt work: %s\n", dq); + return 1; + } + } + + if(SQLstatementIntern(cntxt,&s,"pmv.point_query_check",TRUE,FALSE)!= MAL_SUCCEED) + {/* insert into query not succeeded, what to do */ + printf("***query didnt work: %s\n", s); + return 1; + } + + v = stack_get_var(sql, "is_there"); + + GDKfree(s); + + if(v->val.ival > 0) + return 0; + else if(v->val.ival == 0) + return 1; + + printf("*** point_query_check went wrong!!\n"); + return 1; + } + /* form the query */ q = "INSERT INTO %s SELECT "; @@ -1513,23 +1566,22 @@ void find_out_pkey_space_for_unavailable printf("query: %s\n", q); - cntxt = MCgetClient(sql->clientid); - if(SQLstatementIntern(cntxt,&q,"pmv.left_outer_join",TRUE,FALSE)!= MAL_SUCCEED) {/* insert into query not succeeded, what to do */ printf("***query didnt work: %s\n", q); - return; + return 1; } if(mvc_commit(sql, 0, NULL) < 0) {/* committing failed */ // throw(MAL,"pmv.create_temp_table", "committing failed\n"); printf("***commit didnt work: %s\n", q); - return; + return 1; } GDKfree(s); GDKfree(q); + return 1; } str* get_pkey_bound_to_dataview(str schema_name, str dmdt_name) @@ -6951,7 +7003,7 @@ void prepare_pmv(mvc* sql, sql_rel* ret) node* n = NULL; list* list_PERPAD = NULL; sel_predicate** sps = NULL; - int num_PERPAD = 0, i; + int num_PERPAD = 0, i, is_further_derivation_needed = 0; int num_pkeys_to_be_enumerated = 0; int* is_pkey_to_be_enumerated; discovered_table_pkeys = list_create(NULL); @@ -6982,13 +7034,15 @@ void prepare_pmv(mvc* sql, sql_rel* ret) } /* find out the required mEtadata to be Derived -- the unavailables */ - find_out_pkey_space_for_unavailable_required_derived_metadata(sql, list_PERPAD, is_pkey_to_be_enumerated, num_pkeys_to_be_enumerated); + is_further_derivation_needed = find_out_pkey_space_for_unavailable_required_derived_metadata(sql, list_PERPAD, is_pkey_to_be_enumerated, num_pkeys_to_be_enumerated); /* derive the unavailables and insert into DMdT */ - compute_and_insert_unavailable_required_derived_metadata(sql, sps, num_PERPAD, is_pkey_to_be_enumerated, num_pkeys_to_be_enumerated); + if(is_further_derivation_needed) + compute_and_insert_unavailable_required_derived_metadata(sql, sps, num_PERPAD, is_pkey_to_be_enumerated, num_pkeys_to_be_enumerated); /* remove temp tables */ - clean_up_temps(sql); + if(is_further_derivation_needed) + clean_up_temps(sql); } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list