List:Maria Storage Engine« Previous MessageNext Message »
From:Michael Widenius Date:January 9 2009 4:11am
Subject:bzr commit into MySQL/Maria:mysql-maria branch (monty:2717) Bug#41760
Bug#41962
View as plain text  
#At bzr+ssh://bk-internal.mysql.com/bzrroot/server/mysql-maria/

 2717 Michael Widenius	2009-01-09
      Fixed bugs from my latest patch found by pushbuild:
      Bug #41962 Maria: view-related test failures (insert, view, maria, trigger tests)
      Added error handling for wrong update of view.
      See Bug #41760 Inserting into multiple-table views is not working
modified:
  mysql-test/r/delayed.result
  mysql-test/suite/maria/r/maria.result
  mysql-test/suite/maria/t/maria.test
  mysql-test/t/delayed.test
  sql/sql_base.cc
  sql/sql_insert.cc
  storage/maria/ma_blockrec.c

per-file messages:
  mysql-test/r/delayed.result
    Fixed test as we are now testing values before fields.
    Added new tests to test all error combinations
  mysql-test/suite/maria/r/maria.result
    Added error handling for not supported update of view.
  mysql-test/suite/maria/t/maria.test
    Added error handling for not supported update of view.
  mysql-test/t/delayed.test
    Fixed test as we are now testing values before fields.
    Added new tests to test all error combinations
  sql/sql_base.cc
    Fixed warning from valgrind
  sql/sql_insert.cc
    Don't test from which table values are in case of INSERT ... SELECT
    Run fix_fields() in values before we do it on fields.
    This is needed becasue check_view_single_update() are accessing values.
  storage/maria/ma_blockrec.c
    Don't call pagecache_delete_pages() if no pages to delete.
    This fixes a DBUG_ASSERT() error in maria_test_recovery
=== modified file 'mysql-test/r/delayed.result'
--- a/mysql-test/r/delayed.result	2007-12-13 12:10:57 +0000
+++ b/mysql-test/r/delayed.result	2009-01-09 04:11:37 +0000
@@ -251,8 +251,12 @@ HEX(a)
 1
 DROP TABLE t1;
 CREATE TABLE t1 (a INT);
-INSERT DELAYED INTO t1 SET b= b();
+INSERT DELAYED INTO t1 SET a= b();
+ERROR 42000: FUNCTION test.b does not exist
+INSERT DELAYED INTO t1 SET b= 1;
 ERROR 42S22: Unknown column 'b' in 'field list'
+INSERT DELAYED INTO t1 SET b= b();
+ERROR 42000: FUNCTION test.b does not exist
 DROP TABLE t1;
 End of 5.0 tests
 DROP TABLE IF EXISTS t1,t2;

=== modified file 'mysql-test/suite/maria/r/maria.result'
--- a/mysql-test/suite/maria/r/maria.result	2008-12-27 02:05:16 +0000
+++ b/mysql-test/suite/maria/r/maria.result	2009-01-09 04:11:37 +0000
@@ -2568,7 +2568,9 @@ create table t2 (f3 int, f4 int) engine=
 create view v1 as select * from t1, t2 where f1= f3;
 insert into t1 values (1,11), (2,22);
 insert into v1 (f1) values (3) on duplicate key update f1= f3 + 10;
+ERROR HY000: Can not modify more than one base table through a join view 'test.v1'
 insert into v1 (f1) values (3) on duplicate key update f1= f3 + 10;
+ERROR HY000: Can not modify more than one base table through a join view 'test.v1'
 drop table t1,t2;
 drop view v1;
 CREATE TABLE t1 (id int, c varchar(10)) engine=maria;

=== modified file 'mysql-test/suite/maria/t/maria.test'
--- a/mysql-test/suite/maria/t/maria.test	2008-12-27 02:05:16 +0000
+++ b/mysql-test/suite/maria/t/maria.test	2009-01-09 04:11:37 +0000
@@ -1820,7 +1820,9 @@ create table t1 (f1 int unique, f2 int) 
 create table t2 (f3 int, f4 int) engine=maria;
 create view v1 as select * from t1, t2 where f1= f3;
 insert into t1 values (1,11), (2,22);
+--error 1393
 insert into v1 (f1) values (3) on duplicate key update f1= f3 + 10;
+--error 1393
 insert into v1 (f1) values (3) on duplicate key update f1= f3 + 10;
 drop table t1,t2;
 drop view v1;

=== modified file 'mysql-test/t/delayed.test'
--- a/mysql-test/t/delayed.test	2007-12-16 15:03:44 +0000
+++ b/mysql-test/t/delayed.test	2009-01-09 04:11:37 +0000
@@ -256,7 +256,11 @@ DROP TABLE t1;
 # Bug #32676: insert delayed crash with wrong column and function specified
 #
 CREATE TABLE t1 (a INT);
---error  ER_BAD_FIELD_ERROR
+--error ER_SP_DOES_NOT_EXIST
+INSERT DELAYED INTO t1 SET a= b();
+--error  ER_BAD_FIELD_ERROR 
+INSERT DELAYED INTO t1 SET b= 1;
+--error ER_SP_DOES_NOT_EXIST
 INSERT DELAYED INTO t1 SET b= b();
 DROP TABLE t1;
 

=== modified file 'sql/sql_base.cc'
--- a/sql/sql_base.cc	2008-12-23 12:02:54 +0000
+++ b/sql/sql_base.cc	2009-01-09 04:11:37 +0000
@@ -7342,7 +7342,10 @@ int setup_wild(THD *thd, TABLE_LIST *tab
     /* make * substituting permanent */
     SELECT_LEX *select_lex= thd->lex->current_select;
     select_lex->with_wild= 0;
-    select_lex->item_list= fields;
+#ifdef HAVE_purify
+    if (&select_lex->item_list != &fields)      // Avoid warning
+#endif
+      select_lex->item_list= fields;
 
     thd->restore_active_arena(arena, &backup);
   }

=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc	2008-12-27 02:05:16 +0000
+++ b/sql/sql_insert.cc	2009-01-09 04:11:37 +0000
@@ -88,6 +88,7 @@ static bool check_view_insertability(THD
   SYNOPSIS
     check_view_single_update()
     fields            The insert/update fields to be checked.
+    values            Values to use for update
     view              The view for insert.
     map     [in/out]  The insert table map.
 
@@ -107,7 +108,7 @@ static bool check_view_insertability(THD
     1   Error
 */
 
-bool check_view_single_update(List<Item> &fields, List<Item> &values,
+bool check_view_single_update(List<Item> &fields, List<Item> *values,
                               TABLE_LIST *view, table_map *map)
 {
   /* it is join view => we need to find the table for update */
@@ -119,10 +120,15 @@ bool check_view_single_update(List<Item>
   while ((item= it++))
     tables|= item->used_tables();
 
-  it.init(values);
-  while ((item= it++))
-    tables|= item->used_tables();
+  if (values)
+  {
+    it.init(*values);
+    while ((item= it++))
+      tables|= item->used_tables();
+  }
 
+  /* Convert to real table bits */
+  tables&= ~PSEUDO_TABLE_BITS;
   /* Check found map against provided map */
   if (*map)
   {
@@ -156,6 +162,10 @@ error:
     fields                      The insert fields.
     values                      The insert values.
     check_unique                If duplicate values should be rejected.
+    fields_and_values_from_different_maps
+				Set to 1 if fields and values are using
+                                different table maps, like on select ... insert
+    map                         Store here table map for used fields
 
   NOTE
     Clears TIMESTAMP_AUTO_SET_ON_INSERT from table->timestamp_field_type
@@ -169,7 +179,9 @@ error:
 
 static int check_insert_fields(THD *thd, TABLE_LIST *table_list,
                                List<Item> &fields, List<Item> &values,
-                               bool check_unique, table_map *map)
+                               bool check_unique,
+                               bool fields_and_values_from_different_maps,
+                               table_map *map)
 {
   TABLE *table= table_list->table;
 
@@ -242,7 +254,10 @@ static int check_insert_fields(THD *thd,
 
     if (table_list->effective_algorithm == VIEW_ALGORITHM_MERGE)
     {
-      if (check_view_single_update(fields, values, table_list, map))
+      if (check_view_single_update(fields, 
+                                   fields_and_values_from_different_maps ?
+                                   (List<Item>*) 0 : &values,
+                                   table_list, map))
         return -1;
       table= table_list->table;
     }
@@ -325,8 +340,8 @@ static int check_update_fields(THD *thd,
     return -1;
 
   if (insert_table_list->effective_algorithm == VIEW_ALGORITHM_MERGE &&
-      check_view_single_update(update_fields, update_values, insert_table_list,
-                               map))
+      check_view_single_update(update_fields, &update_values,
+                               insert_table_list, map))
     return -1;
 
   if (table->timestamp_field)
@@ -1234,9 +1249,9 @@ bool mysql_prepare_insert(THD *thd, TABL
     table_list->next_local= 0;
     context->resolve_in_table_list_only(table_list);
 
-    res= check_insert_fields(thd, context->table_list, fields, *values,
-                             !insert_into_view, &map) ||
-      setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0);
+    res= (setup_fields(thd, 0, *values, MARK_COLUMNS_READ, 0, 0) ||
+          check_insert_fields(thd, context->table_list, fields, *values,
+                              !insert_into_view, 0, &map));
 
     if (!res && check_fields)
     {
@@ -1249,6 +1264,9 @@ bool mysql_prepare_insert(THD *thd, TABL
       thd->abort_on_warning= saved_abort_on_warning;
     }
 
+    if (!res)
+      res= setup_fields(thd, 0, update_values, MARK_COLUMNS_READ, 0, 0);
+
     if (!res && duplic == DUP_UPDATE)
     {
       select_lex->no_wrap_view_item= TRUE;
@@ -1259,9 +1277,6 @@ bool mysql_prepare_insert(THD *thd, TABL
 
     /* Restore the current context. */
     ctx_state.restore_state(context, table_list);
-
-    if (!res)
-      res= setup_fields(thd, 0, update_values, MARK_COLUMNS_READ, 0, 0);
   }
 
   if (res)
@@ -2890,10 +2905,9 @@ select_insert::prepare(List<Item> &value
     we are fixing fields from insert list.
   */
   lex->current_select= &lex->select_lex;
-  res= check_insert_fields(thd, table_list, *fields, values,
-                           !insert_into_view, &map) ||
-       setup_fields(thd, 0, values, MARK_COLUMNS_READ, 0, 0);
-
+  res= (setup_fields(thd, 0, values, MARK_COLUMNS_READ, 0, 0) ||
+        check_insert_fields(thd, table_list, *fields, values,
+                            !insert_into_view, 1, &map));
   if (!res && fields->elements)
   {
     bool saved_abort_on_warning= thd->abort_on_warning;

=== modified file 'storage/maria/ma_blockrec.c'
--- a/storage/maria/ma_blockrec.c	2008-12-27 02:05:16 +0000
+++ b/storage/maria/ma_blockrec.c	2009-01-09 04:11:37 +0000
@@ -2422,7 +2422,8 @@ static my_bool free_full_page_range(MARI
     */
     delete_count--;
   }
-  if (pagecache_delete_pages(share->pagecache, &info->dfile,
+  if (delete_count &&
+      pagecache_delete_pages(share->pagecache, &info->dfile,
                              page, delete_count, PAGECACHE_LOCK_WRITE, 0))
     res= 1;
 

Thread
bzr commit into MySQL/Maria:mysql-maria branch (monty:2717) Bug#41760Bug#41962Michael Widenius9 Jan