summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authormonty@mashka.mysql.fi <>2003-02-07 15:06:23 +0200
committermonty@mashka.mysql.fi <>2003-02-07 15:06:23 +0200
commitf68914addb4a59927cbc47c8d3a2431b5b180770 (patch)
tree5cace589571553163ae26ddaaf6402dfe33ea6ac /sql
parentbd8c8522dc7d38dccd0785ed4d3d225ac7fee9e6 (diff)
parent5ce55f27f82f96eabe8a416dd5285934a17c8590 (diff)
downloadmariadb-git-f68914addb4a59927cbc47c8d3a2431b5b180770.tar.gz
Merge work:/my/mysql-4.0 into mashka.mysql.fi:/home/my/mysql-4.0
Diffstat (limited to 'sql')
-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
10 files changed, 66 insertions, 40 deletions
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)));
}