summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am1
-rw-r--r--configure.in4
-rw-r--r--include/my_global.h8
-rw-r--r--mysql-test/r/distinct.result2
-rw-r--r--mysql-test/r/func_group.result4
-rw-r--r--mysql-test/r/innodb.result2
-rw-r--r--mysql-test/r/join.result30
-rw-r--r--mysql-test/r/order_by.result15
-rw-r--r--mysql-test/r/show_check.result56
-rw-r--r--mysql-test/t/func_group.test2
-rw-r--r--mysql-test/t/innodb.test2
-rw-r--r--mysql-test/t/join.test25
-rw-r--r--mysql-test/t/order_by.test3
-rw-r--r--mysql-test/t/show_check.test35
-rw-r--r--sql/filesort.cc5
-rw-r--r--sql/lex.h1
-rw-r--r--sql/mysql_priv.h8
-rw-r--r--sql/opt_range.cc5
-rw-r--r--sql/opt_range.h2
-rw-r--r--sql/slave.cc8
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_select.cc5
-rw-r--r--sql/sql_yacc.yy39
-rw-r--r--sql/table.cc31
24 files changed, 242 insertions, 53 deletions
diff --git a/Makefile.am b/Makefile.am
index dfdcfe0cabf..e69b336a2c0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -83,4 +83,3 @@ tags:
test:
cd mysql-test ; ./mysql-test-run
-
diff --git a/configure.in b/configure.in
index ed814ca18b1..d2469f1fffd 100644
--- a/configure.in
+++ b/configure.in
@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line!
-AM_INIT_AUTOMAKE(mysql, 4.0.11)
+AM_INIT_AUTOMAKE(mysql, 4.0.11-gamma)
AM_CONFIG_HEADER(config.h)
PROTOCOL_VERSION=10
@@ -702,7 +702,7 @@ AC_ARG_WITH(mysqld-user,
AC_SUBST(MYSQLD_USER)
# If we should allow LOAD DATA LOCAL
-AC_MSG_CHECKING(if we should should enable LOAD DATA LOCAL by default)
+AC_MSG_CHECKING(If we should should enable LOAD DATA LOCAL by default)
AC_ARG_ENABLE(local-infile,
[ --enable-local-infile Enable LOAD DATA LOCAL INFILE (default: disabled)],
[ ENABLED_LOCAL_INFILE=$enableval ],
diff --git a/include/my_global.h b/include/my_global.h
index a360947e42d..f98cc48ba20 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -764,6 +764,14 @@ typedef char bool; /* Ordinary boolean values 0 1 */
#define INT32(v) (int32) (v)
#define MYF(v) (myf) (v)
+#ifndef LL
+#ifdef HAVE_LONG_LONG
+#define LL(A) A ## LL
+#else
+#define LL(A) A ## L
+#endif
+#endif
+
/*
Defines to make it possible to prioritize register assignments. No
longer that important with modern compilers.
diff --git a/mysql-test/r/distinct.result b/mysql-test/r/distinct.result
index 020d6c6534f..5f4f7cced1e 100644
--- a/mysql-test/r/distinct.result
+++ b/mysql-test/r/distinct.result
@@ -77,7 +77,6 @@ NULL NULL
10 VMT
select id+0 as a,max(id),concat(facility) as b from t1 group by a order by b desc,a;
a max(id) b
-NULL NULL NULL
10 10 VMT
9 9 SRV
8 8 RV
@@ -90,6 +89,7 @@ NULL NULL NULL
1 1 /L
-1 -1
0 0
+NULL NULL NULL
select id >= 0 and id <= 5 as grp,count(*) from t1 group by grp;
grp count(*)
NULL 1
diff --git a/mysql-test/r/func_group.result b/mysql-test/r/func_group.result
index 8263df36105..b129beaac81 100644
--- a/mysql-test/r/func_group.result
+++ b/mysql-test/r/func_group.result
@@ -42,8 +42,8 @@ insert into t1 values (null,null,'');
select count(distinct a),count(distinct grp) from t1;
count(distinct a) count(distinct grp)
6 3
-select sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1;
-sum(a) count(a) avg(a) std(a) bit_or(a) bit_and(a) min(a) max(a) min(c) max(c)
+select sum(all a),count(all a),avg(all a),std(all a),bit_or(all a),bit_and(all a),min(all a),max(all a),min(all c),max(all c) from t1;
+sum(all a) count(all a) avg(all a) std(all a) bit_or(all a) bit_and(all a) min(all a) max(all a) min(all c) max(all c)
21 6 3.5000 1.7078 7 0 1 6 E
select grp, sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1 group by grp;
grp sum(a) count(a) avg(a) std(a) bit_or(a) bit_and(a) min(a) max(a) min(c) max(c)
diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result
index 9d50a6a86e9..828bd2bab83 100644
--- a/mysql-test/r/innodb.result
+++ b/mysql-test/r/innodb.result
@@ -290,7 +290,7 @@ select * from t1;
id val
drop table t1;
create table t1 (a integer) type=innodb;
-begin;
+start transaction;
rename table t1 to t2;
create table t1 (b integer) type=innodb;
insert into t1 values (1);
diff --git a/mysql-test/r/join.result b/mysql-test/r/join.result
index ff608825b9c..ddea0ac1a57 100644
--- a/mysql-test/r/join.result
+++ b/mysql-test/r/join.result
@@ -1,4 +1,34 @@
drop table if exists t1,t2,t3;
+CREATE TABLE t1 (S1 INT);
+CREATE TABLE t2 (S1 INT);
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (2);
+SELECT * FROM t1 JOIN t2;
+S1 S1
+1 2
+SELECT * FROM t1 INNER JOIN t2;
+S1 S1
+1 2
+SELECT * from t1 JOIN t2 USING (S1);
+S1 S1
+SELECT * FROM t1 INNER JOIN t2 USING (S1);
+S1 S1
+SELECT * from t1 CROSS JOIN t2;
+S1 S1
+1 2
+SELECT * from t1 LEFT JOIN t2 USING(S1);
+S1 S1
+1 NULL
+SELECT * from t1 LEFT JOIN t2 ON(t2.S1=2);
+S1 S1
+1 2
+SELECT * from t1 RIGHT JOIN t2 USING(S1);
+S1 S1
+NULL 2
+SELECT * from t1 RIGHT JOIN t2 ON(t1.S1=1);
+S1 S1
+1 2
+drop table t1,t2;
create table t1 (id int primary key);
create table t2 (id int);
insert into t1 values (75);
diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result
index 48773bfa916..9238d9eafcb 100644
--- a/mysql-test/r/order_by.result
+++ b/mysql-test/r/order_by.result
@@ -304,7 +304,7 @@ a b c
1 NULL b
explain select * from t1 where a >= 1 and a < 3 and b >0 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra
-t1 range a a 9 NULL 8 Using where; Using index; Using filesort
+t1 range a a 9 NULL 8 Using where; Using index
explain select * from t1 where a = 2 and b >0 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 5 Using where; Using index
@@ -320,7 +320,18 @@ table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 5 Using where; Using index
explain select * from t1 where a = 2 and b < 2 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra
-t1 range a a 9 NULL 2 Using where; Using index; Using filesort
+t1 range a a 9 NULL 2 Using where; Using index
+explain select * from t1 where a = 1 order by b desc;
+table type possible_keys key key_len ref rows Extra
+t1 ref a a 4 const 5 Using where; Using index
+select * from t1 where a = 1 order by b desc;
+a b c
+1 3 b
+1 1 b
+1 1 b
+1 1 NULL
+1 NULL b
+1 NULL NULL
alter table t1 modify b int not null, modify c varchar(10) not null;
explain select * from t1 order by a, b, c;
table type possible_keys key key_len ref rows Extra
diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result
index 2c32d766a38..fa2f381d905 100644
--- a/mysql-test/r/show_check.result
+++ b/mysql-test/r/show_check.result
@@ -156,6 +156,62 @@ f double(5,0) YES NULL
h float(3,2) YES NULL
i float(3,0) YES NULL
drop table t1;
+create table t1 (
+type_bool bool not null,
+type_tiny tinyint not null auto_increment primary key,
+type_short smallint(3),
+type_mediumint mediumint,
+type_bigint bigint,
+type_decimal decimal(5,2),
+type_numeric numeric(5,2),
+empty_char char(0),
+type_char char(2),
+type_varchar varchar(10),
+type_timestamp timestamp not null,
+type_date date not null,
+type_time time not null,
+type_datetime datetime not null,
+type_year year,
+type_enum enum ('red', 'green', 'blue'),
+type_set enum ('red', 'green', 'blue'),
+type_tinyblob tinyblob,
+type_blob blob,
+type_medium_blob mediumblob,
+type_long_blob longblob,
+index(type_short)
+) AVG_ROW_LENGTH=10 CHECKSUM=1 COMMENT="test" TYPE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=fixed CHARSET=latin1;
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `type_bool` tinyint(1) NOT NULL default '0',
+ `type_tiny` tinyint(4) NOT NULL auto_increment,
+ `type_short` smallint(3) default NULL,
+ `type_mediumint` mediumint(9) default NULL,
+ `type_bigint` bigint(20) default NULL,
+ `type_decimal` decimal(5,2) default NULL,
+ `type_numeric` decimal(5,2) default NULL,
+ `empty_char` char(0) default NULL,
+ `type_char` char(2) default NULL,
+ `type_varchar` varchar(10) default NULL,
+ `type_timestamp` timestamp(14) NOT NULL,
+ `type_date` date NOT NULL default '0000-00-00',
+ `type_time` time NOT NULL default '00:00:00',
+ `type_datetime` datetime NOT NULL default '0000-00-00 00:00:00',
+ `type_year` year(4) default NULL,
+ `type_enum` enum('red','green','blue') default NULL,
+ `type_set` enum('red','green','blue') default NULL,
+ `type_tinyblob` tinyblob,
+ `type_blob` blob,
+ `type_medium_blob` mediumblob,
+ `type_long_blob` longblob,
+ PRIMARY KEY (`type_tiny`),
+ KEY `type_short` (`type_short`)
+) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=100 AVG_ROW_LENGTH=10 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED COMMENT='test'
+insert into t1 (type_timestamp) values ("2003-02-07 10:00:01");
+select * from t1;
+type_bool type_tiny type_short type_mediumint type_bigint type_decimal type_numeric empty_char type_char type_varchar type_timestamp type_date type_time type_datetime type_year type_enum type_set type_tinyblob type_blob type_medium_blob type_long_blob
+0 1 NULL NULL NULL NULL NULL NULL NULL NULL 20030207100001 0000-00-00 00:00:00 0000-00-00 00:00:00 NULL NULL NULL NULL NULL NULL NULL
+drop table t1;
create table t1 (c decimal, d double, f float, r real);
show columns from t1;
Field Type Null Key Default Extra
diff --git a/mysql-test/t/func_group.test b/mysql-test/t/func_group.test
index 04a2ff68a92..1915c2172ad 100644
--- a/mysql-test/t/func_group.test
+++ b/mysql-test/t/func_group.test
@@ -21,7 +21,7 @@ select count(distinct a),count(distinct grp) from t1;
insert into t1 values (null,null,'');
select count(distinct a),count(distinct grp) from t1;
-select sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1;
+select sum(all a),count(all a),avg(all a),std(all a),bit_or(all a),bit_and(all a),min(all a),max(all a),min(all c),max(all c) from t1;
select grp, sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1 group by grp;
select grp, sum(a)+count(a)+avg(a)+std(a)+bit_or(a)+bit_and(a)+min(a)+max(a)+min(c)+max(c) as sum from t1 group by grp;
diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test
index eb5b0c9efd2..250b68a3845 100644
--- a/mysql-test/t/innodb.test
+++ b/mysql-test/t/innodb.test
@@ -167,7 +167,7 @@ drop table t1;
#
create table t1 (a integer) type=innodb;
-begin;
+start transaction;
rename table t1 to t2;
create table t1 (b integer) type=innodb;
insert into t1 values (1);
diff --git a/mysql-test/t/join.test b/mysql-test/t/join.test
index f58281af003..70980f656ab 100644
--- a/mysql-test/t/join.test
+++ b/mysql-test/t/join.test
@@ -1,7 +1,30 @@
#
+# Initialization
+drop table if exists t1,t2,t3;
+
+#
+# Test different join syntaxes
+#
+
+CREATE TABLE t1 (S1 INT);
+CREATE TABLE t2 (S1 INT);
+INSERT INTO t1 VALUES (1);
+INSERT INTO t2 VALUES (2);
+SELECT * FROM t1 JOIN t2;
+SELECT * FROM t1 INNER JOIN t2;
+SELECT * from t1 JOIN t2 USING (S1);
+SELECT * FROM t1 INNER JOIN t2 USING (S1);
+SELECT * from t1 CROSS JOIN t2;
+SELECT * from t1 LEFT JOIN t2 USING(S1);
+SELECT * from t1 LEFT JOIN t2 ON(t2.S1=2);
+SELECT * from t1 RIGHT JOIN t2 USING(S1);
+SELECT * from t1 RIGHT JOIN t2 ON(t1.S1=1);
+drop table t1,t2;
+
+#
# This failed for lia Perminov
#
-drop table if exists t1,t2,t3;
+
create table t1 (id int primary key);
create table t2 (id int);
diff --git a/mysql-test/t/order_by.test b/mysql-test/t/order_by.test
index 0ee6f901aae..8291a475d5e 100644
--- a/mysql-test/t/order_by.test
+++ b/mysql-test/t/order_by.test
@@ -227,7 +227,8 @@ explain select * from t1 where a = 2 and (b is null or b > 0) order by a
desc,b desc;
explain select * from t1 where a = 2 and b > 0 order by a desc,b desc;
explain select * from t1 where a = 2 and b < 2 order by a desc,b desc;
-
+explain select * from t1 where a = 1 order by b desc;
+select * from t1 where a = 1 order by b desc;
#
# Test things when we don't have NULL keys
#
diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test
index 5e10ebf23a3..ba6fa930e22 100644
--- a/mysql-test/t/show_check.test
+++ b/mysql-test/t/show_check.test
@@ -80,6 +80,41 @@ create table t1 (a decimal(9,2), b decimal (9,0), e double(9,2), f double(5,0),
show columns from t1;
drop table t1;
+#
+# Do a create table that tries to cover all types and options
+#
+create table t1 (
+type_bool bool not null,
+type_tiny tinyint not null auto_increment primary key,
+type_short smallint(3),
+type_mediumint mediumint,
+type_bigint bigint,
+type_decimal decimal(5,2),
+type_numeric numeric(5,2),
+empty_char char(0),
+type_char char(2),
+type_varchar varchar(10),
+type_timestamp timestamp not null,
+type_date date not null,
+type_time time not null,
+type_datetime datetime not null,
+type_year year,
+type_enum enum ('red', 'green', 'blue'),
+type_set enum ('red', 'green', 'blue'),
+type_tinyblob tinyblob,
+type_blob blob,
+type_medium_blob mediumblob,
+type_long_blob longblob,
+index(type_short)
+) AVG_ROW_LENGTH=10 CHECKSUM=1 COMMENT="test" TYPE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=fixed CHARSET=latin1;
+
+# Not tested above: RAID_# UNION INSERT_METHOD DATA DIRECTORY INDEX DIRECTORY
+show create table t1;
+insert into t1 (type_timestamp) values ("2003-02-07 10:00:01");
+select * from t1;
+drop table t1;
+
+
# Check auto conversions of types
create table t1 (c decimal, d double, f float, r real);
diff --git a/sql/filesort.cc b/sql/filesort.cc
index ad16c16db3e..2ac05ef0496 100644
--- a/sql/filesort.cc
+++ b/sql/filesort.cc
@@ -461,7 +461,10 @@ static void make_sortkey(register SORTPARAM *param,
{
if (field->is_null())
{
- bzero((char*) to,sort_field->length+1);
+ if (sort_field->reverse)
+ bfill(to,sort_field->length+1,(char) 255);
+ else
+ bzero((char*) to,sort_field->length+1);
to+= sort_field->length+1;
continue;
}
diff --git a/sql/lex.h b/sql/lex.h
index 6ebbcb44003..64ba98b5e35 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -260,6 +260,7 @@ static SYMBOL symbols[] = {
{ "NULL", SYM(NULL_SYM),0,0},
{ "NUMERIC", SYM(NUMERIC_SYM),0,0},
{ "OFFSET", SYM(OFFSET_SYM),0,0},
+ { "OLD_PASSWORD", SYM(PASSWORD),0,0},
{ "ON", SYM(ON),0,0},
{ "OPEN", SYM(OPEN_SYM),0,0},
{ "OPTIMIZE", SYM(OPTIMIZE),0,0},
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 2afc4a5754e..d9a4302ce0c 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -53,14 +53,6 @@ char* query_table_status(THD *thd,const char *db,const char *table_name);
#define PREV_BITS(type,A) ((type) (((type) 1 << (A)) -1))
#define all_bits_set(A,B) ((A) & (B) != (B))
-#ifndef LL
-#ifdef HAVE_LONG_LONG
-#define LL(A) A ## LL
-#else
-#define LL(A) A ## L
-#endif
-#endif
-
/***************************************************************************
Configuration parameters
****************************************************************************/
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index c607e71c01b..768344ab702 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -2555,8 +2555,7 @@ QUICK_SELECT_DESC::QUICK_SELECT_DESC(QUICK_SELECT *q, uint used_key_parts)
for (r = it++; r; r = it++)
{
rev_ranges.push_front(r);
- if (not_read_after_key && range_reads_after_key(r) ||
- test_if_null_range(r,used_key_parts))
+ if (not_read_after_key && range_reads_after_key(r))
{
it.rewind(); // Reset range
error = HA_ERR_UNSUPPORTED;
@@ -2717,6 +2716,7 @@ bool QUICK_SELECT_DESC::range_reads_after_key(QUICK_RANGE *range_arg)
/* True if we are reading over a key that may have a NULL value */
+#ifdef NOT_USED
bool QUICK_SELECT_DESC::test_if_null_range(QUICK_RANGE *range_arg,
uint used_key_parts)
{
@@ -2762,6 +2762,7 @@ bool QUICK_SELECT_DESC::test_if_null_range(QUICK_RANGE *range_arg,
return 1; // Covers null part
return 0;
}
+#endif
/*****************************************************************************
diff --git a/sql/opt_range.h b/sql/opt_range.h
index af977eb3093..6a6b5ae3810 100644
--- a/sql/opt_range.h
+++ b/sql/opt_range.h
@@ -100,7 +100,9 @@ public:
private:
int cmp_prev(QUICK_RANGE *range);
bool range_reads_after_key(QUICK_RANGE *range);
+#ifdef NOT_USED
bool test_if_null_range(QUICK_RANGE *range, uint used_key_parts);
+#endif
void reset(void) { next=0; rev_it.rewind(); }
List<QUICK_RANGE> rev_ranges;
List_iterator<QUICK_RANGE> rev_it;
diff --git a/sql/slave.cc b/sql/slave.cc
index 164b8ba458f..64d54be113e 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -1671,7 +1671,8 @@ int st_relay_log_info::wait_for_pos(THD* thd, String* log_name,
*/
ulong log_name_extension;
char log_name_tmp[FN_REFLEN]; //make a char[] from String
- char *end= strmake(log_name_tmp, log_name->ptr(), min(log_name->length(), FN_REFLEN-1));
+ char *end= strmake(log_name_tmp, log_name->ptr(), min(log_name->length(),
+ FN_REFLEN-1));
char *p= fn_ext(log_name_tmp);
char *p_end;
if (!*p || log_pos<0)
@@ -1756,15 +1757,14 @@ int st_relay_log_info::wait_for_pos(THD* thd, String* log_name,
error= -1;
break;
}
- else
- error=0;
+ error=0;
event_count++;
}
err:
pthread_mutex_unlock(&data_lock);
DBUG_PRINT("exit",("killed: %d abort: %d slave_running: %d \
-improper_arguments: %d timed_out: %d",
+improper_arguments: %d timed_out: %d",
(int) thd->killed,
(int) (init_abort_pos_wait != abort_pos_wait),
(int) mi->slave_running,
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 130f3ead5c7..6249c769015 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2252,8 +2252,6 @@ mysql_execute_command(void)
net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name);
break;
}
- if (lower_case_table_names)
- casedn_str(lex->name);
/*
If in a slave thread :
CREATE DATABASE DB was certainly not preceded by USE DB.
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index be5e5be7cb7..cf7f310bbd5 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -4555,6 +4555,11 @@ sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records)
{
if ((error=(*join_tab->next_select)(join,join_tab+1,0)) < 0)
return error;
+ /*
+ Test if this was a SELECT DISTINCT query on a table that
+ was not in the field list; In this case we can abort if
+ we found a row, as no new rows can be added to the result.
+ */
if (not_used_in_distinct && found_records != join->found_records)
return 0;
}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index d94118ebfc6..8be025d0423 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -579,7 +579,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
insert_values update delete truncate rename
show describe load alter optimize flush
reset purge begin commit rollback slave master_def master_defs
- repair restore backup analyze check
+ repair restore backup analyze check start
field_list field_list_item field_spec kill
select_item_list select_item values_list no_braces
limit_clause delete_limit_clause fields opt_values values
@@ -657,6 +657,7 @@ verb_clause:
| select
| set
| slave
+ | start
| show
| truncate
| handler
@@ -1328,6 +1329,11 @@ slave:
lex->type = 0;
};
+start:
+ START_SYM TRANSACTION_SYM { Lex->sql_command = SQLCOM_BEGIN;}
+ {}
+ ;
+
slave_thread_opts:
slave_thread_opt
| slave_thread_opts ',' slave_thread_opt;
@@ -1999,7 +2005,7 @@ sum_expr:
{ $$=new Item_sum_and($3); }
| BIT_OR '(' in_sum_expr ')'
{ $$=new Item_sum_or($3); }
- | COUNT_SYM '(' '*' ')'
+ | COUNT_SYM '(' opt_all '*' ')'
{ $$=new Item_sum_count(new Item_int((int32) 0L,1)); }
| COUNT_SYM '(' in_sum_expr ')'
{ $$=new Item_sum_count($3); }
@@ -2017,11 +2023,12 @@ sum_expr:
{ $$=new Item_sum_sum($3); };
in_sum_expr:
+ opt_all
{ Select->in_sum_expr++; }
expr
{
Select->in_sum_expr--;
- $$=$2;
+ $$=$3;
};
cast_type:
@@ -2092,19 +2099,22 @@ opt_pad:
join_table_list:
'(' join_table_list ')' { $$=$2; }
| join_table { $$=$1; }
+ | join_table_list ',' join_table_list { $$=$3; }
| join_table_list normal_join join_table_list { $$=$3; }
| join_table_list STRAIGHT_JOIN join_table_list
{ $$=$3 ; $$->straight=1; }
- | join_table_list INNER_SYM JOIN_SYM join_table_list ON expr
- { add_join_on($4,$6); $$=$4; }
- | join_table_list INNER_SYM JOIN_SYM join_table_list
+ | join_table_list normal_join join_table_list ON expr
+ { add_join_on($3,$5); $$=$3; }
+ | join_table_list normal_join join_table_list
+ USING
{
SELECT_LEX *sel=Select;
sel->db1=$1->db; sel->table1=$1->alias;
- sel->db2=$4->db; sel->table2=$4->alias;
+ sel->db2=$3->db; sel->table2=$3->alias;
}
- USING '(' using_list ')'
- { add_join_on($4,$8); $$=$4; }
+ '(' using_list ')'
+ { add_join_on($3,$7); $$=$3; }
+
| join_table_list LEFT opt_outer JOIN_SYM join_table_list ON expr
{ add_join_on($5,$7); $5->outer_join|=JOIN_TYPE_LEFT; $$=$5; }
| join_table_list LEFT opt_outer JOIN_SYM join_table_list
@@ -2133,9 +2143,10 @@ join_table_list:
{ add_join_natural($1,$4); $$=$4; };
normal_join:
- ',' {}
- | JOIN_SYM {}
- | CROSS JOIN_SYM {};
+ JOIN_SYM {}
+ | INNER_SYM JOIN_SYM {}
+ | CROSS JOIN_SYM {}
+ ;
join_table:
{
@@ -2232,6 +2243,10 @@ opt_table_alias:
| table_alias ident
{ $$= (LEX_STRING*) sql_memdup(&$2,sizeof(LEX_STRING)); };
+opt_all:
+ /* empty */
+ | ALL
+ ;
where_clause:
/* empty */ { Select->where= 0; }
diff --git a/sql/table.cc b/sql/table.cc
index 9eaea728007..1635c85eca8 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -95,11 +95,11 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
if (my_read(file,(byte*) head,64,MYF(MY_NABP))) goto err_not_open;
if (head[0] != (uchar) 254 || head[1] != 1 ||
- (head[2] != FRM_VER && head[2] > FRM_VER+2))
+ (head[2] != FRM_VER && head[2] != FRM_VER+1 && head[2] != FRM_VER+3))
goto err_not_open; /* purecov: inspected */
new_field_pack_flag=head[27];
new_frm_ver= (head[2] - FRM_VER);
- field_pack_length= new_frm_ver < 2 ? 11 : 15;
+ field_pack_length= new_frm_ver < 2 ? 11 : 17;
error=3;
if (!(pos=get_form_pos(file,head,(TYPELIB*) 0)))
@@ -154,7 +154,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
for (i=0 ; i < keys ; i++, keyinfo++)
{
- if (new_frm_ver == 2)
+ if (new_frm_ver == 3)
{
keyinfo->flags= (uint) uint2korr(strpos) ^ HA_NOSAME;
keyinfo->key_length= (uint) uint2korr(strpos+2);
@@ -343,28 +343,37 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
for (i=0 ; i < outparam->fields; i++, strpos+=field_pack_length, field_ptr++)
{
- uint pack_flag= uint2korr(strpos+6);
- uint interval_nr= (uint) strpos[10];
+ uint pack_flag, interval_nr, unireg_type, recpos, field_length;
enum_field_types field_type;
- if (new_frm_ver == 2)
+ if (new_frm_ver == 3)
{
/* new frm file in 4.1 */
- field_type=(enum_field_types) (uint) strpos[11];
+ field_length= uint2korr(strpos+3);
+ recpos= uint3korr(strpos+5);
+ pack_flag= uint2korr(strpos+8);
+ unireg_type= (uint) strpos[10];
+ interval_nr= (uint) strpos[12];
+ field_type= (enum_field_types) (uint) strpos[13];
}
else
{
/* old frm file */
+ field_length= (uint) strpos[3];
+ recpos= uint2korr(strpos+4),
+ pack_flag= uint2korr(strpos+6);
+ unireg_type= (uint) strpos[8];
+ interval_nr= (uint) strpos[10];
field_type= (enum_field_types) f_packtype(pack_flag);
}
*field_ptr=reg_field=
- make_field(record+uint2korr(strpos+4),
- (uint32) strpos[3], // field_length
+ make_field(record+recpos,
+ (uint32) field_length,
null_pos,null_bit,
pack_flag,
field_type,
- (Field::utype) MTYP_TYPENR((uint) strpos[8]),
+ (Field::utype) MTYP_TYPENR(unireg_type),
(interval_nr ?
outparam->intervals+interval_nr-1 :
(TYPELIB*) 0),
@@ -1215,7 +1224,7 @@ db_type get_table_type(const char *name)
error=my_read(file,(byte*) head,4,MYF(MY_NABP));
my_close(file,MYF(0));
if (error || head[0] != (uchar) 254 || head[1] != 1 ||
- (head[2] != FRM_VER && head[2] != FRM_VER+1))
+ (head[2] != FRM_VER && head[2] != FRM_VER+1 && head[2] != FRM_VER+3))
DBUG_RETURN(DB_TYPE_UNKNOWN);
DBUG_RETURN(ha_checktype((enum db_type) (uint) *(head+3)));
}