summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Widenius <monty@askmonty.org>2012-04-04 01:00:23 +0300
committerMichael Widenius <monty@askmonty.org>2012-04-04 01:00:23 +0300
commitdaf29d2a7aae6b92bd10d98819f564749b07720a (patch)
tree48610814f428a224a0e4959f2e7b3fe5e548a244
parent2149a42928f961112e65944e4b0d7639416e6f50 (diff)
parent24a67aa81699a914d169fc783893c4fb54aa8388 (diff)
downloadmariadb-git-daf29d2a7aae6b92bd10d98819f564749b07720a.tar.gz
Merge with 5.2
-rw-r--r--mysql-test/r/csv.result13
-rw-r--r--mysql-test/r/partition_innodb.result14
-rw-r--r--mysql-test/t/csv.test15
-rw-r--r--sql/sql_select.cc28
-rw-r--r--storage/csv/ha_tina.cc28
-rw-r--r--storage/csv/ha_tina.h3
6 files changed, 69 insertions, 32 deletions
diff --git a/mysql-test/r/csv.result b/mysql-test/r/csv.result
index 4c3529fb227..76a8bc06f6d 100644
--- a/mysql-test/r/csv.result
+++ b/mysql-test/r/csv.result
@@ -5415,4 +5415,17 @@ foo
DROP TABLE t1;
+CREATE TABLE t1 ( b TEXT NOT NULL ) ENGINE=MYISAM;
+INSERT INTO t1 VALUES ('x'),('y');
+CREATE TABLE t2 ( a VARCHAR(1) NOT NULL ) ENGINE=CSV;
+INSERT INTO t2 VALUES ('r'),('t');
+SELECT * FROM t2 ORDER BY a;
+a
+r
+t
+SELECT * FROM t1 LEFT JOIN t2 ON ( b = a );
+b a
+x NULL
+y NULL
+drop table t1,t2;
End of 5.1 tests
diff --git a/mysql-test/r/partition_innodb.result b/mysql-test/r/partition_innodb.result
index 5fcb0e796b1..1afffd3a037 100644
--- a/mysql-test/r/partition_innodb.result
+++ b/mysql-test/r/partition_innodb.result
@@ -48,13 +48,13 @@ insert INTO t1 VALUES (110);
ERROR HY000: Table has no partition for value 110
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a > 90;
id select_type table partitions type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 0 Using where
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a >= 90;
id select_type table partitions type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 0 Using where
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a = 90;
id select_type table partitions type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 0 Using where
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a = 89;
id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p90 ALL NULL NULL NULL NULL 3 Using where
@@ -63,16 +63,16 @@ id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p90 ALL NULL NULL NULL NULL 3 Using where
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a > 89;
id select_type table partitions type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 0 Using where
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a = 100;
id select_type table partitions type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 0 Using where
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a >= 100;
id select_type table partitions type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 0 Using where
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a > 100;
id select_type table partitions type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 ALL NULL NULL NULL NULL 0 Using where
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
DROP TABLE t1;
#
# Bug#50104: Partitioned table with just 1 partion works with fk
diff --git a/mysql-test/t/csv.test b/mysql-test/t/csv.test
index fd08f7c5a40..974b6a65c39 100644
--- a/mysql-test/t/csv.test
+++ b/mysql-test/t/csv.test
@@ -1820,5 +1820,20 @@ INSERT INTO t1 VALUES(-1);
SELECT * FROM t1;
DROP TABLE t1;
+#
+# Bug#970528
+# Server crashes in my_strnncollsp_simple on LEFT JOIN with CSV table,
+# TEXT field
+#
+
+CREATE TABLE t1 ( b TEXT NOT NULL ) ENGINE=MYISAM;
+INSERT INTO t1 VALUES ('x'),('y');
+
+CREATE TABLE t2 ( a VARCHAR(1) NOT NULL ) ENGINE=CSV;
+INSERT INTO t2 VALUES ('r'),('t');
+
+SELECT * FROM t2 ORDER BY a;
+SELECT * FROM t1 LEFT JOIN t2 ON ( b = a );
+drop table t1,t2;
--echo End of 5.1 tests
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 506c7387a32..d2e91a87e9e 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -3091,6 +3091,13 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
table_vector[i]=s->table=table=tables->table;
table->pos_in_table_list= tables;
error= tables->fetch_number_of_rows();
+
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ const bool no_partitions_used= table->no_partitions_used;
+#else
+ const bool no_partitions_used= FALSE;
+#endif
+
DBUG_EXECUTE_IF("bug11747970_raise_error",
{
if (!error)
@@ -3122,13 +3129,10 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
if (*s->on_expr_ref)
{
/* s is the only inner table of an outer join */
-#ifdef WITH_PARTITION_STORAGE_ENGINE
if (!table->is_filled_at_execution() &&
- (!table->file->stats.records || table->no_partitions_used) && !embedding)
-#else
- if (!table->is_filled_at_execution() &&
- !table->file->stats.records && !embedding)
-#endif
+ ((!table->file->stats.records &&
+ (table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT)) ||
+ no_partitions_used) && !embedding)
{ // Empty table
s->dependent= 0; // Ignore LEFT JOIN depend.
no_rows_const_tables |= table->map;
@@ -3168,16 +3172,12 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
if (inside_an_outer_join)
continue;
}
-#ifdef WITH_PARTITION_STORAGE_ENGINE
- const bool no_partitions_used= table->no_partitions_used;
-#else
- const bool no_partitions_used= FALSE;
-#endif
- if (!table->is_filled_at_execution() &&
- (table->s->system || table->file->stats.records <= 1 ||
+ if (!table->is_filled_at_execution() &&
+ (table->s->system ||
+ (table->file->stats.records <= 1 &&
+ (table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT)) ||
no_partitions_used) &&
!s->dependent &&
- (table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT) &&
!table->fulltext_searched && !join->no_const_tables)
{
set_position(join,const_count++,s,(KEYUSE*) 0);
diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc
index f1b081be8d4..26d6e16b9d4 100644
--- a/storage/csv/ha_tina.cc
+++ b/storage/csv/ha_tina.cc
@@ -854,6 +854,7 @@ int ha_tina::open(const char *name, int mode, uint open_options)
*/
thr_lock_data_init(&share->lock, &lock, (void*) this);
ref_length= sizeof(my_off_t);
+ init_alloc_root(&blobroot, BLOB_MEMROOT_ALLOC_SIZE, 0);
share->lock.get_status= tina_get_status;
share->lock.update_status= tina_update_status;
@@ -871,6 +872,7 @@ int ha_tina::close(void)
{
int rc= 0;
DBUG_ENTER("ha_tina::close");
+ free_root(&blobroot, MYF(0));
rc= my_close(data_file, MYF(0));
DBUG_RETURN(free_share(share) || rc);
}
@@ -1086,11 +1088,9 @@ int ha_tina::rnd_init(bool scan)
current_position= next_position= 0;
stats.records= 0;
- records_is_known= 0;
+ records_is_known= found_end_of_file= 0;
chain_ptr= chain;
- init_alloc_root(&blobroot, BLOB_MEMROOT_ALLOC_SIZE, 0);
-
DBUG_RETURN(0);
}
@@ -1122,10 +1122,16 @@ int ha_tina::rnd_next(uchar *buf)
/* don't scan an empty file */
if (!local_saved_data_file_length)
+ {
+ found_end_of_file= 1;
DBUG_RETURN(HA_ERR_END_OF_FILE);
-
+ }
if ((rc= find_current_row(buf)))
+ {
+ DBUG_PRINT("warning", ("got error %d while reading file", rc));
+ found_end_of_file= (rc == HA_ERR_END_OF_FILE);
DBUG_RETURN(rc);
+ }
stats.records++;
DBUG_RETURN(0);
@@ -1220,8 +1226,7 @@ int ha_tina::rnd_end()
my_off_t file_buffer_start= 0;
DBUG_ENTER("ha_tina::rnd_end");
- free_root(&blobroot, MYF(0));
- records_is_known= 1;
+ records_is_known= found_end_of_file;
if ((chain_ptr - chain) > 0)
{
@@ -1394,8 +1399,6 @@ int ha_tina::repair(THD* thd, HA_CHECK_OPT* check_opt)
/* set current position to the beginning of the file */
current_position= next_position= 0;
- init_alloc_root(&blobroot, BLOB_MEMROOT_ALLOC_SIZE, 0);
-
/* Read the file row-by-row. If everything is ok, repair is not needed. */
while (!(rc= find_current_row(buf)))
{
@@ -1603,8 +1606,6 @@ int ha_tina::check(THD* thd, HA_CHECK_OPT* check_opt)
/* set current position to the beginning of the file */
current_position= next_position= 0;
- init_alloc_root(&blobroot, BLOB_MEMROOT_ALLOC_SIZE, 0);
-
/* Read the file row-by-row. If everything is ok, repair is not needed. */
while (!(rc= find_current_row(buf)))
{
@@ -1628,6 +1629,13 @@ int ha_tina::check(THD* thd, HA_CHECK_OPT* check_opt)
}
+int ha_tina::reset(void)
+{
+ free_root(&blobroot, MYF(0));
+ return 0;
+}
+
+
bool ha_tina::check_if_incompatible_data(HA_CREATE_INFO *info,
uint table_changes)
{
diff --git a/storage/csv/ha_tina.h b/storage/csv/ha_tina.h
index 54860ecb3fb..a124ea77f3c 100644
--- a/storage/csv/ha_tina.h
+++ b/storage/csv/ha_tina.h
@@ -84,7 +84,7 @@ class ha_tina: public handler
uchar chain_alloced;
uint32 chain_size;
uint local_data_file_version; /* Saved version of the data file used */
- bool records_is_known;
+ bool records_is_known, found_end_of_file;
MEM_ROOT blobroot;
private:
@@ -156,6 +156,7 @@ public:
bool auto_repair() const { return 1; }
void position(const uchar *record);
int info(uint);
+ int reset();
int extra(enum ha_extra_function operation);
int delete_all_rows(void);
int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info);