diff options
author | unknown <bell@sanja.is.com.ua> | 2005-01-05 16:48:23 +0200 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2005-01-05 16:48:23 +0200 |
commit | 47dc78e6a3bb6554504da0869705c2155d7b772d (patch) | |
tree | 2d4c17ce2b2688d209f1864bea4459a6021d896a | |
parent | 4fd1524c0a0e3fed746a8f2af743cafbb12abfd4 (diff) | |
download | mariadb-git-47dc78e6a3bb6554504da0869705c2155d7b772d.tar.gz |
fixed views with PS protocol
mysql-test/r/view.result:
query cache part moved to separate test
mysql-test/t/view.test:
query cache part moved to separate test
sql/item_func.cc:
fixed for safety
sql/sql_base.cc:
do not use real table call with view
fixed wrapping * substitured items
fixed fix_fields call parameter (refference)
sql/sql_yacc.yy:
added initialisation of SELECT in commands which can use subqueries
sql/table.cc:
fised fix_fields call parameter
sql/table.h:
new view specific method
-rw-r--r-- | mysql-test/r/view.result | 101 | ||||
-rw-r--r-- | mysql-test/r/view_query_cache.result | 101 | ||||
-rw-r--r-- | mysql-test/t/view.test | 57 | ||||
-rw-r--r-- | mysql-test/t/view_query_cache.test | 58 | ||||
-rw-r--r-- | sql/item_func.cc | 2 | ||||
-rw-r--r-- | sql/sql_base.cc | 19 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 5 | ||||
-rw-r--r-- | sql/table.cc | 9 | ||||
-rw-r--r-- | sql/table.h | 1 |
9 files changed, 182 insertions, 171 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index d31575eb38e..c4391781e9c 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -363,107 +363,6 @@ v4 CREATE ALGORITHM=TEMPTABLE VIEW `mysqltest`.`v4` AS select (`mysqltest`.`t2`. revoke all privileges on mysqltest.* from mysqltest_1@localhost; delete from mysql.user where user='mysqltest_1'; drop database mysqltest; -set GLOBAL query_cache_size=1355776; -flush status; -create table t1 (a int, b int); -create view v1 (c,d) as select sql_no_cache a,b from t1; -create view v2 (c,d) as select a+rand(),b from t1; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -show status like "Qcache_inserts"; -Variable_name Value -Qcache_inserts 0 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 0 -select * from v1; -c d -select * from v2; -c d -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -show status like "Qcache_inserts"; -Variable_name Value -Qcache_inserts 0 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 0 -select * from v1; -c d -select * from v2; -c d -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -show status like "Qcache_inserts"; -Variable_name Value -Qcache_inserts 0 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 0 -drop view v1,v2; -set query_cache_type=demand; -flush status; -create view v1 (c,d) as select sql_cache a,b from t1; -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 0 -show status like "Qcache_inserts"; -Variable_name Value -Qcache_inserts 0 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 0 -select * from v1; -c d -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -show status like "Qcache_inserts"; -Variable_name Value -Qcache_inserts 1 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 0 -select * from t1; -a b -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -show status like "Qcache_inserts"; -Variable_name Value -Qcache_inserts 1 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 0 -select * from v1; -c d -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -show status like "Qcache_inserts"; -Variable_name Value -Qcache_inserts 1 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 1 -select * from t1; -a b -show status like "Qcache_queries_in_cache"; -Variable_name Value -Qcache_queries_in_cache 1 -show status like "Qcache_inserts"; -Variable_name Value -Qcache_inserts 1 -show status like "Qcache_hits"; -Variable_name Value -Qcache_hits 1 -drop view v1; -set query_cache_type=default; -drop table t1; -set GLOBAL query_cache_size=default; create table t1 (a int); insert into t1 values (1), (2), (3), (1), (2), (3); create view v1 as select distinct a from t1; diff --git a/mysql-test/r/view_query_cache.result b/mysql-test/r/view_query_cache.result new file mode 100644 index 00000000000..f46f0f609cd --- /dev/null +++ b/mysql-test/r/view_query_cache.result @@ -0,0 +1,101 @@ +set GLOBAL query_cache_size=1355776; +flush status; +create table t1 (a int, b int); +create view v1 (c,d) as select sql_no_cache a,b from t1; +create view v2 (c,d) as select a+rand(),b from t1; +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 0 +show status like "Qcache_inserts"; +Variable_name Value +Qcache_inserts 0 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +select * from v1; +c d +select * from v2; +c d +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 0 +show status like "Qcache_inserts"; +Variable_name Value +Qcache_inserts 0 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +select * from v1; +c d +select * from v2; +c d +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 0 +show status like "Qcache_inserts"; +Variable_name Value +Qcache_inserts 0 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +drop view v1,v2; +set query_cache_type=demand; +flush status; +create view v1 (c,d) as select sql_cache a,b from t1; +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 0 +show status like "Qcache_inserts"; +Variable_name Value +Qcache_inserts 0 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +select * from v1; +c d +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 1 +show status like "Qcache_inserts"; +Variable_name Value +Qcache_inserts 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +select * from t1; +a b +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 1 +show status like "Qcache_inserts"; +Variable_name Value +Qcache_inserts 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 0 +select * from v1; +c d +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 1 +show status like "Qcache_inserts"; +Variable_name Value +Qcache_inserts 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 1 +select * from t1; +a b +show status like "Qcache_queries_in_cache"; +Variable_name Value +Qcache_queries_in_cache 1 +show status like "Qcache_inserts"; +Variable_name Value +Qcache_inserts 1 +show status like "Qcache_hits"; +Variable_name Value +Qcache_hits 1 +drop view v1; +set query_cache_type=default; +drop table t1; +set GLOBAL query_cache_size=default; diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 2aabbe20657..77f0f65323e 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -329,63 +329,6 @@ delete from mysql.user where user='mysqltest_1'; drop database mysqltest; # -# QUERY CACHE options for VIEWs -# -set GLOBAL query_cache_size=1355776; -flush status; -create table t1 (a int, b int); - -# queries with following views should not be in query cache -create view v1 (c,d) as select sql_no_cache a,b from t1; -create view v2 (c,d) as select a+rand(),b from t1; -show status like "Qcache_queries_in_cache"; -show status like "Qcache_inserts"; -show status like "Qcache_hits"; -select * from v1; -select * from v2; -show status like "Qcache_queries_in_cache"; -show status like "Qcache_inserts"; -show status like "Qcache_hits"; -select * from v1; -select * from v2; -show status like "Qcache_queries_in_cache"; -show status like "Qcache_inserts"; -show status like "Qcache_hits"; - -drop view v1,v2; - -# SQL_CACHE option -set query_cache_type=demand; -flush status; -# query with view will be cached, but direct acess to table will not -create view v1 (c,d) as select sql_cache a,b from t1; -show status like "Qcache_queries_in_cache"; -show status like "Qcache_inserts"; -show status like "Qcache_hits"; -select * from v1; -show status like "Qcache_queries_in_cache"; -show status like "Qcache_inserts"; -show status like "Qcache_hits"; -select * from t1; -show status like "Qcache_queries_in_cache"; -show status like "Qcache_inserts"; -show status like "Qcache_hits"; -select * from v1; -show status like "Qcache_queries_in_cache"; -show status like "Qcache_inserts"; -show status like "Qcache_hits"; -select * from t1; -show status like "Qcache_queries_in_cache"; -show status like "Qcache_inserts"; -show status like "Qcache_hits"; -drop view v1; -set query_cache_type=default; - -drop table t1; -set GLOBAL query_cache_size=default; - - -# # DISTINCT option for VIEW # create table t1 (a int); diff --git a/mysql-test/t/view_query_cache.test b/mysql-test/t/view_query_cache.test new file mode 100644 index 00000000000..dd9c8006915 --- /dev/null +++ b/mysql-test/t/view_query_cache.test @@ -0,0 +1,58 @@ +-- source include/have_query_cache.inc +# +# QUERY CACHE options for VIEWs +# +set GLOBAL query_cache_size=1355776; +flush status; +create table t1 (a int, b int); + +# queries with following views should not be in query cache +create view v1 (c,d) as select sql_no_cache a,b from t1; +create view v2 (c,d) as select a+rand(),b from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; +select * from v1; +select * from v2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; +select * from v1; +select * from v2; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; + +drop view v1,v2; + +# SQL_CACHE option +set query_cache_type=demand; +flush status; +# query with view will be cached, but direct acess to table will not +create view v1 (c,d) as select sql_cache a,b from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; +select * from v1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; +select * from v1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; +select * from t1; +show status like "Qcache_queries_in_cache"; +show status like "Qcache_inserts"; +show status like "Qcache_hits"; +drop view v1; +set query_cache_type=default; + +drop table t1; +set GLOBAL query_cache_size=default; + + diff --git a/sql/item_func.cc b/sql/item_func.cc index 69ddd21f913..b07ff3f5bc2 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -194,8 +194,8 @@ bool Item_func::agg_arg_charsets(DTCollation &coll, } if ((*arg)->type() == FIELD_ITEM) ((Item_field *)(*arg))->no_const_subst= 1; - conv->fix_fields(thd, 0, &conv); *arg= conv; + conv->fix_fields(thd, 0, arg); } if (arena) thd->restore_backup_item_arena(arena, &backup); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index a620ce2f10f..bbe2f44f46b 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2262,7 +2262,7 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables, field makes some prepared query ambiguous and so erroneous, but we accept this trade off. */ - if (item->cached_table->table) + if (item->cached_table->table && !item->cached_table->view) { found= find_field_in_real_table(thd, item->cached_table->table, name, length, @@ -3047,15 +3047,19 @@ insert_fields(THD *thd, TABLE_LIST *tables, const char *db_name, ¬_used_field_index, TRUE)) { Item *item= iterator->item(thd); + if (view && !thd->lex->current_select->no_wrap_view_item) + { + /* + as far as we have view, then item point to view_iter, so we + can use it directly for this view specific operation + */ + item= new Item_ref(view_iter.item_ptr(), tables->view_name.str, + field_name); + } if (!found++) (void) it->replace(item); // Replace '*' else it->after(item); - if (view && !thd->lex->current_select->no_wrap_view_item) - { - item= new Item_ref(it->ref(), tables->view_name.str, - field_name); - } #ifndef NO_EMBEDDED_ACCESS_CHECKS if (any_privileges) { @@ -3328,7 +3332,8 @@ int setup_conds(THD *thd, TABLE_LIST *tables, TABLE_LIST *leaves, COND **conds) thd->restore_backup_item_arena(arena, &backup); if (embedded->on_expr && !embedded->on_expr->fixed) { - if (embedded->on_expr->fix_fields(thd, tables, &table->on_expr)) + if (embedded->on_expr->fix_fields(thd, tables, + &embedded->on_expr)) goto err_no_arena; } } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 289b96dff51..fa23502ea93 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -5577,6 +5577,7 @@ insert: LEX *lex= Lex; lex->sql_command= SQLCOM_INSERT; lex->duplicates= DUP_ERROR; + mysql_init_select(lex); /* for subselects */ lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ; lex->select_lex.resolve_mode= SELECT_LEX::INSERT_MODE; @@ -5596,6 +5597,7 @@ replace: LEX *lex=Lex; lex->sql_command = SQLCOM_REPLACE; lex->duplicates= DUP_REPLACE; + mysql_init_select(lex); lex->select_lex.resolve_mode= SELECT_LEX::INSERT_MODE; } replace_lock_option insert2 @@ -5796,6 +5798,7 @@ delete: { LEX *lex= Lex; lex->sql_command= SQLCOM_DELETE; + mysql_init_select(lex); lex->lock_option= lex->thd->update_lock_default; lex->ignore= 0; lex->select_lex.init_order(); @@ -7124,6 +7127,7 @@ set: { LEX *lex=Lex; lex->sql_command= SQLCOM_SET_OPTION; + mysql_init_select(lex); lex->option_type=OPT_SESSION; lex->var_list.empty(); lex->one_shot_set= 0; @@ -7190,7 +7194,6 @@ option_value: } else lex->var_list.push_back(new set_var_user(new Item_func_set_user_var($2,$4))); - } | internal_variable_name equal set_expr_or_default { diff --git a/sql/table.cc b/sql/table.cc index 12862d21ac0..3873682b6cd 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1702,6 +1702,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, if (field_translation) { + DBUG_PRINT("info", ("there are already translation table")); /* prevent look up in SELECTs tree */ thd->lex->current_select= &thd->lex->select_lex; thd->lex->select_lex.no_wrap_view_item= 1; @@ -1727,7 +1728,7 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, if (where && !where->fixed && where->fix_fields(thd, ancestor, &where)) goto err; if (check_option && !check_option->fixed && - check_option->fix_fields(thd, ancestor, &where)) + check_option->fix_fields(thd, ancestor, &check_option)) goto err; restore_want_privilege(); @@ -1767,11 +1768,11 @@ bool st_table_list::setup_ancestor(THD *thd, Item **conds, { /* save original name of view column */ char *name= item->name; - if (!item->fixed && item->fix_fields(thd, ancestor, &item)) + transl[i].item= item; + if (!item->fixed && item->fix_fields(thd, ancestor, &transl[i].item)) goto err; /* set new item get in fix fields and original column name */ - transl[i].name= name; - transl[i++].item= item; + transl[i++].name= name; } field_translation= transl; /* TODO: sort this list? Use hash for big number of fields */ diff --git a/sql/table.h b/sql/table.h index 391b4908f96..60a5796791a 100644 --- a/sql/table.h +++ b/sql/table.h @@ -428,6 +428,7 @@ public: bool end_of_fields() { return ptr == array_end; } const char *name(); Item *item(THD *thd) { return ptr->item; } + Item **item_ptr() {return &ptr->item; } Field *field() { return 0; } }; |