summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2005-01-05 16:48:23 +0200
committerunknown <bell@sanja.is.com.ua>2005-01-05 16:48:23 +0200
commit47dc78e6a3bb6554504da0869705c2155d7b772d (patch)
tree2d4c17ce2b2688d209f1864bea4459a6021d896a
parent4fd1524c0a0e3fed746a8f2af743cafbb12abfd4 (diff)
downloadmariadb-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.result101
-rw-r--r--mysql-test/r/view_query_cache.result101
-rw-r--r--mysql-test/t/view.test57
-rw-r--r--mysql-test/t/view_query_cache.test58
-rw-r--r--sql/item_func.cc2
-rw-r--r--sql/sql_base.cc19
-rw-r--r--sql/sql_yacc.yy5
-rw-r--r--sql/table.cc9
-rw-r--r--sql/table.h1
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,
&not_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; }
};