summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2003-02-06 16:55:59 +0200
committerunknown <monty@mashka.mysql.fi>2003-02-06 16:55:59 +0200
commitdacf7f8fe51ce27e0a63cf486fccb6a748c5dbec (patch)
treeaf5a612629ae80e6237cf2b6ffc48017d60acef3
parentdfbd628cd7ec0d3dbe86ee8e4f820d78f10b8ad0 (diff)
downloadmariadb-git-dacf7f8fe51ce27e0a63cf486fccb6a748c5dbec.tar.gz
Added START TRANSACTION syntax
Added ALL as parameter option for all group functions. Make join handling uniform. This allows us to use ',', JOIN and INNER JOIN the same way. Sort NULL last if DESC is used (ANSI SQL 99 requirement) include/my_global.h: Moved LL from mysql_priv (as this is also in config-win.h) mysql-test/r/distinct.result: Updated results mysql-test/r/func_group.result: Updated results mysql-test/r/innodb.result: Updated results mysql-test/r/join.result: Updated results mysql-test/r/order_by.result: Updated results mysql-test/t/func_group.test: Added test for SUM(ALL ...) mysql-test/t/innodb.test: Added test for START TRANSACTION mysql-test/t/join.test: Test different join syntaxes mysql-test/t/order_by.test: Added new test of NULL ordering. sql/filesort.cc: Sort NULL last if DESC is used sql/lex.h: Added OLD_PASSWORD() as synonym for PASSWORD. sql/mysql_priv.h: Removed LL() sql/opt_range.cc: Sort NULL last if DESC is used sql/opt_range.h: Sort NULL last if DESC is used sql/slave.cc: Indentation changes sql/sql_parse.cc: After merge fix sql/sql_select.cc: Added comment sql/sql_yacc.yy: Added START TRANSACTION syntax Added ALL as parameter option for all group functions. Make join handling uniform.
-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/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--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
19 files changed, 129 insertions, 39 deletions
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/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/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; }