Commit be565cfb authored by unknown's avatar unknown

Merge work:/my/mysql-4.1 into mashka.mysql.fi:/home/my/mysql-4.1


BitKeeper/etc/logging_ok:
  auto-union
sql/mysql_priv.h:
  Auto merged
sql/sql_base.cc:
  Auto merged
sql/sql_lex.cc:
  Auto merged
sql/sql_parse.cc:
  Auto merged
sql/sql_select.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
parents 8f7a2b27 392ba757
...@@ -56,6 +56,7 @@ paul@teton.kitebird.com ...@@ -56,6 +56,7 @@ paul@teton.kitebird.com
peter@linux.local peter@linux.local
peter@mysql.com peter@mysql.com
ram@gw.udmsearch.izhnet.ru ram@gw.udmsearch.izhnet.ru
ram@mysql.r18.ru
ram@ram.(none) ram@ram.(none)
root@x3.internalnet root@x3.internalnet
salle@geopard.(none) salle@geopard.(none)
......
...@@ -85,15 +85,24 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, ...@@ -85,15 +85,24 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys));
for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++) for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++)
{ {
uint nsegs= keydef[i].keysegs; keyinfo->seg= keyseg;
memcpy(keyseg, keydef[i].seg,
(size_t) (sizeof(keyseg[0]) * keydef[i].keysegs));
keyseg+= keydef[i].keysegs;
if (keydef[i].algorithm == HA_KEY_ALG_BTREE) if (keydef[i].algorithm == HA_KEY_ALG_BTREE)
{ {
/* additional HA_KEYTYPE_END keyseg */
keyseg->type= HA_KEYTYPE_END;
keyseg->length= sizeof(byte*);
keyseg->flag= 0;
keyseg->null_bit= 0;
keyseg++;
init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*), init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*),
(qsort_cmp2)keys_compare, 1, NULL, NULL); (qsort_cmp2)keys_compare, 1, NULL, NULL);
keyinfo->delete_key= hp_rb_delete_key; keyinfo->delete_key= hp_rb_delete_key;
keyinfo->write_key= hp_rb_write_key; keyinfo->write_key= hp_rb_write_key;
nsegs++;
} }
else else
{ {
...@@ -102,12 +111,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, ...@@ -102,12 +111,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
keyinfo->delete_key= hp_delete_key; keyinfo->delete_key= hp_delete_key;
keyinfo->write_key= hp_write_key; keyinfo->write_key= hp_write_key;
} }
keyinfo->seg= keyseg;
memcpy(keyseg, keydef[i].seg,
(size_t) (sizeof(keyseg[0]) * nsegs));
keyseg+= nsegs;
} }
share->min_records= min_records; share->min_records= min_records;
share->max_records= max_records; share->max_records= max_records;
share->data_length= share->index_length= 0; share->data_length= share->index_length= 0;
......
...@@ -447,7 +447,7 @@ typedef struct st_mysql_stmt ...@@ -447,7 +447,7 @@ typedef struct st_mysql_stmt
unsigned long param_count; /* parameters count */ unsigned long param_count; /* parameters count */
unsigned long field_count; /* fields count */ unsigned long field_count; /* fields count */
unsigned long long_length; /* long buffer alloced length */ unsigned long long_length; /* long buffer alloced length */
ulong stmt_id; /* Id for prepared statement */ unsigned long stmt_id; /* Id for prepared statement */
uint last_errno; /* error code */ uint last_errno; /* error code */
enum MY_STMT_STATE state; /* statement state */ enum MY_STMT_STATE state; /* statement state */
char last_error[MYSQL_ERRMSG_SIZE]; /* error message */ char last_error[MYSQL_ERRMSG_SIZE]; /* error message */
...@@ -506,7 +506,7 @@ int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB); ...@@ -506,7 +506,7 @@ int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB);
my_bool my_bool
simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg, simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
ulong length, my_bool skip_check); unsigned long length, my_bool skip_check);
unsigned long net_safe_read(MYSQL* mysql); unsigned long net_safe_read(MYSQL* mysql);
#ifdef __cplusplus #ifdef __cplusplus
......
...@@ -246,11 +246,7 @@ int ha_heap::create(const char *name, TABLE *table, ...@@ -246,11 +246,7 @@ int ha_heap::create(const char *name, TABLE *table,
int error; int error;
for (key= parts= 0; key < table->keys; key++) for (key= parts= 0; key < table->keys; key++)
{
parts+= table->key_info[key].key_parts; parts+= table->key_info[key].key_parts;
if (table->key_info[key].algorithm == HA_KEY_ALG_BTREE)
parts++; /* additional HA_KEYTYPE_END keyseg */
}
if (!(keydef= (HP_KEYDEF*) my_malloc(table->keys * sizeof(HP_KEYDEF) + if (!(keydef= (HP_KEYDEF*) my_malloc(table->keys * sizeof(HP_KEYDEF) +
parts * sizeof(HA_KEYSEG), parts * sizeof(HA_KEYSEG),
...@@ -301,15 +297,6 @@ int ha_heap::create(const char *name, TABLE *table, ...@@ -301,15 +297,6 @@ int ha_heap::create(const char *name, TABLE *table,
seg->null_pos= 0; seg->null_pos= 0;
} }
} }
if (pos->algorithm == HA_KEY_ALG_BTREE)
{
/* additional HA_KEYTYPE_END keyseg */
seg->type= HA_KEYTYPE_END;
seg->length= sizeof(byte*);
seg->flag= 0;
seg->null_bit= 0;
seg++;
}
} }
mem_per_row+= MY_ALIGN(table->reclength + 1, sizeof(char*)); mem_per_row+= MY_ALIGN(table->reclength + 1, sizeof(char*));
max_rows = (ulong) (current_thd->variables.max_heap_table_size / max_rows = (ulong) (current_thd->variables.max_heap_table_size /
......
...@@ -432,7 +432,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -432,7 +432,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
if (!field) // If field is not checked if (!field) // If field is not checked
{ {
Field *tmp; Field *tmp;
if (!(tmp=find_field_in_tables(thd,this,tables))) if (!(tmp=find_field_in_tables(thd, this, tables, 0)))
{ {
/* /*
We can't find table field in table list of current select, We can't find table field in table list of current select,
...@@ -448,9 +448,14 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -448,9 +448,14 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
sl && !tmp; sl && !tmp;
sl= sl->outer_select()) sl= sl->outer_select())
tmp=find_field_in_tables(thd, this, tmp=find_field_in_tables(thd, this,
(TABLE_LIST*)(last= sl)->table_list.first); (TABLE_LIST*)(last= sl)->table_list.first,
0);
if (!tmp) if (!tmp)
return 1; {
// Call to produce appropriate error message
find_field_in_tables(thd, this, tables, 1);
return -1;
}
else else
{ {
depended_from= last; depended_from= last;
...@@ -463,7 +468,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -463,7 +468,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
s= s->outer_select()) s= s->outer_select())
if( !s->depended ) if( !s->depended )
{ {
s->depended= 1; //Select is depended of outer select s->depended= 1;
//Tables will be reopened many times //Tables will be reopened many times
for (TABLE_LIST *tbl= for (TABLE_LIST *tbl=
(TABLE_LIST*)s->table_list.first; (TABLE_LIST*)s->table_list.first;
...@@ -780,7 +785,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) ...@@ -780,7 +785,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
{ {
if (!ref) if (!ref)
{ {
if (!(ref= find_item_in_list(this,thd->lex.select->item_list))) if (!(ref= find_item_in_list(this, thd->lex.select->item_list, 0)))
{ {
/* /*
We can't find table field in table list of current select, We can't find table field in table list of current select,
...@@ -795,9 +800,13 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) ...@@ -795,9 +800,13 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
for (SELECT_LEX *sl= thd->lex.select->outer_select(); for (SELECT_LEX *sl= thd->lex.select->outer_select();
sl && !ref; sl && !ref;
sl= sl->outer_select()) sl= sl->outer_select())
ref= find_item_in_list(this, (last= sl)->item_list); ref= find_item_in_list(this, (last= sl)->item_list, 0);
if (!ref) if (!ref)
{
// Call to report error
find_item_in_list(this, thd->lex.select->item_list, 1);
return 1; return 1;
}
else else
{ {
depended_from= last; depended_from= last;
......
...@@ -451,7 +451,8 @@ bool wait_for_tables(THD *thd); ...@@ -451,7 +451,8 @@ bool wait_for_tables(THD *thd);
bool table_is_used(TABLE *table, bool wait_for_name_lock); bool table_is_used(TABLE *table, bool wait_for_name_lock);
bool drop_locked_tables(THD *thd,const char *db, const char *table_name); bool drop_locked_tables(THD *thd,const char *db, const char *table_name);
void abort_locked_tables(THD *thd,const char *db, const char *table_name); void abort_locked_tables(THD *thd,const char *db, const char *table_name);
Field *find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables); Field *find_field_in_tables(THD *thd, Item_field *item, TABLE_LIST *tables,
bool report_error);
Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length,
bool check_grant,bool allow_rowid); bool check_grant,bool allow_rowid);
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
...@@ -539,7 +540,7 @@ TABLE *unlink_open_table(THD *thd,TABLE *list,TABLE *find); ...@@ -539,7 +540,7 @@ TABLE *unlink_open_table(THD *thd,TABLE *list,TABLE *find);
SQL_SELECT *make_select(TABLE *head, table_map const_tables, SQL_SELECT *make_select(TABLE *head, table_map const_tables,
table_map read_tables, COND *conds, int *error); table_map read_tables, COND *conds, int *error);
Item ** find_item_in_list(Item *item,List<Item> &items); Item ** find_item_in_list(Item *item, List<Item> &items, bool report_error);
bool insert_fields(THD *thd,TABLE_LIST *tables, bool insert_fields(THD *thd,TABLE_LIST *tables,
const char *db_name, const char *table_name, const char *db_name, const char *table_name,
List_iterator<Item> *it); List_iterator<Item> *it);
......
...@@ -1783,7 +1783,8 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, ...@@ -1783,7 +1783,8 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length,
Field * Field *
find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables,
bool report_error)
{ {
Field *found=0; Field *found=0;
const char *db=item->db_name; const char *db=item->db_name;
...@@ -1820,7 +1821,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) ...@@ -1820,7 +1821,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables)
} }
if (found) if (found)
return found; return found;
if (!found_table) if (!found_table && report_error)
{ {
char buff[NAME_LEN*2+1]; char buff[NAME_LEN*2+1];
if (db) if (db)
...@@ -1832,6 +1833,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) ...@@ -1832,6 +1833,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables)
thd->where); thd->where);
} }
else else
if (report_error)
my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0),
item->full_name(),thd->where); item->full_name(),thd->where);
return (Field*) 0; return (Field*) 0;
...@@ -1848,7 +1850,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) ...@@ -1848,7 +1850,7 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables)
return (Field*) 0; return (Field*) 0;
if (found) if (found)
{ {
if (!thd->where) // Returns first found if (!report_error) // Returns first found
break; break;
my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0),
name,thd->where); name,thd->where);
...@@ -1859,13 +1861,14 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables) ...@@ -1859,13 +1861,14 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables)
} }
if (found) if (found)
return found; return found;
my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR), if (report_error)
MYF(0),item->full_name(),thd->where); my_printf_error(ER_BAD_FIELD_ERROR, ER(ER_BAD_FIELD_ERROR),
MYF(0), item->full_name(), thd->where);
return (Field*) 0; return (Field*) 0;
} }
Item ** Item **
find_item_in_list(Item *find,List<Item> &items) find_item_in_list(Item *find, List<Item> &items, bool report_error)
{ {
List_iterator<Item> li(items); List_iterator<Item> li(items);
Item **found=0,*item; Item **found=0,*item;
...@@ -1890,7 +1893,7 @@ find_item_in_list(Item *find,List<Item> &items) ...@@ -1890,7 +1893,7 @@ find_item_in_list(Item *find,List<Item> &items)
{ {
if ((*found)->eq(item,0)) if ((*found)->eq(item,0))
continue; // Same field twice (Access?) continue; // Same field twice (Access?)
if (current_thd->where) if (report_error)
my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0),
find->full_name(), current_thd->where); find->full_name(), current_thd->where);
return (Item**) 0; return (Item**) 0;
...@@ -1913,7 +1916,7 @@ find_item_in_list(Item *find,List<Item> &items) ...@@ -1913,7 +1916,7 @@ find_item_in_list(Item *find,List<Item> &items)
break; break;
} }
} }
if (!found && current_thd->where) if (!found && report_error)
my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0),
find->full_name(),current_thd->where); find->full_name(),current_thd->where);
return found; return found;
......
...@@ -142,11 +142,11 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) ...@@ -142,11 +142,11 @@ LEX *lex_start(THD *thd, uchar *buf,uint length)
lex->next_state=STATE_START; lex->next_state=STATE_START;
lex->end_of_query=(lex->ptr=buf)+length; lex->end_of_query=(lex->ptr=buf)+length;
lex->yylineno = 1; lex->yylineno = 1;
lex->select->create_refs=lex->in_comment=0; lex->select_lex.create_refs=lex->in_comment=0;
lex->length=0; lex->length=0;
lex->select->in_sum_expr=0; lex->select_lex.in_sum_expr=0;
lex->select->expr_list.empty(); lex->select_lex.expr_list.empty();
lex->select->ftfunc_list.empty(); lex->select_lex.ftfunc_list.empty();
lex->convert_set=(lex->thd=thd)->variables.convert_set; lex->convert_set=(lex->thd=thd)->variables.convert_set;
lex->yacc_yyss=lex->yacc_yyvs=0; lex->yacc_yyss=lex->yacc_yyvs=0;
lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE);
...@@ -158,7 +158,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) ...@@ -158,7 +158,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length)
void lex_end(LEX *lex) void lex_end(LEX *lex)
{ {
lex->select->expr_list.delete_elements(); // If error when parsing sql-varargs lex->select_lex.expr_list.delete_elements(); // If error when parsing sql-varargs
x_free(lex->yacc_yyss); x_free(lex->yacc_yyss);
x_free(lex->yacc_yyvs); x_free(lex->yacc_yyvs);
} }
......
...@@ -1287,7 +1287,7 @@ mysql_execute_command(THD *thd) ...@@ -1287,7 +1287,7 @@ mysql_execute_command(THD *thd)
int res= 0; int res= 0;
LEX *lex= &thd->lex; LEX *lex= &thd->lex;
TABLE_LIST *tables= (TABLE_LIST*) lex->select_lex.table_list.first; TABLE_LIST *tables= (TABLE_LIST*) lex->select_lex.table_list.first;
SELECT_LEX *select_lex= lex->select; SELECT_LEX *select_lex= &lex->select_lex;
SELECT_LEX_UNIT *unit= &lex->unit; SELECT_LEX_UNIT *unit= &lex->unit;
DBUG_ENTER("mysql_execute_command"); DBUG_ENTER("mysql_execute_command");
......
...@@ -6498,9 +6498,7 @@ find_order_in_list(THD *thd,TABLE_LIST *tables,ORDER *order,List<Item> &fields, ...@@ -6498,9 +6498,7 @@ find_order_in_list(THD *thd,TABLE_LIST *tables,ORDER *order,List<Item> &fields,
return 0; return 0;
} }
const char *save_where=thd->where; const char *save_where=thd->where;
thd->where=0; // No error if not found Item **item=find_item_in_list(*order->item, fields, 0);
Item **item=find_item_in_list(*order->item,fields);
thd->where=save_where;
if (item) if (item)
{ {
order->item=item; // use it order->item=item; // use it
...@@ -6598,17 +6596,15 @@ setup_new_fields(THD *thd,TABLE_LIST *tables,List<Item> &fields, ...@@ -6598,17 +6596,15 @@ setup_new_fields(THD *thd,TABLE_LIST *tables,List<Item> &fields,
DBUG_ENTER("setup_new_fields"); DBUG_ENTER("setup_new_fields");
thd->set_query_id=1; // Not really needed, but... thd->set_query_id=1; // Not really needed, but...
thd->where=0; // Don't give error
for (; new_field ; new_field=new_field->next) for (; new_field ; new_field=new_field->next)
{ {
if ((item=find_item_in_list(*new_field->item,fields))) if ((item= find_item_in_list(*new_field->item, fields, 0)))
new_field->item=item; /* Change to shared Item */ new_field->item=item; /* Change to shared Item */
else else
{ {
thd->where="procedure list"; thd->where="procedure list";
if ((*new_field->item)->fix_fields(thd, tables, new_field->item)) if ((*new_field->item)->fix_fields(thd, tables, new_field->item))
DBUG_RETURN(1); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */
thd->where=0;
all_fields.push_front(*new_field->item); all_fields.push_front(*new_field->item);
new_field->item=all_fields.head_ref(); new_field->item=all_fields.head_ref();
} }
...@@ -7400,7 +7396,8 @@ static void describe_info(JOIN *join, const char *info) ...@@ -7400,7 +7396,8 @@ static void describe_info(JOIN *join, const char *info)
{ {
THD *thd= join->thd; THD *thd= join->thd;
if (thd->lex.select->next_select()) /* If in UNION */ /* If lex.select belong to UNION */
if (thd->lex.select->master_unit()->first_select()->next_select())
{ {
select_describe(join,FALSE,FALSE,FALSE,info); select_describe(join,FALSE,FALSE,FALSE,info);
return; return;
......
...@@ -2432,7 +2432,8 @@ order_clause: ...@@ -2432,7 +2432,8 @@ order_clause:
net_printf(lex->thd, ER_WRONG_USAGE, "UPDATE", "ORDER BY"); net_printf(lex->thd, ER_WRONG_USAGE, "UPDATE", "ORDER BY");
YYABORT; YYABORT;
} }
if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) if (lex->select->linkage != GLOBAL_OPTIONS_TYPE &&
lex->select->olap != UNSPECIFIED_OLAP_TYPE)
{ {
net_printf(lex->thd, ER_WRONG_USAGE, net_printf(lex->thd, ER_WRONG_USAGE,
"CUBE/ROLLUP", "CUBE/ROLLUP",
...@@ -2458,7 +2459,8 @@ limit_clause: ...@@ -2458,7 +2459,8 @@ limit_clause:
| LIMIT ULONG_NUM | LIMIT ULONG_NUM
{ {
LEX *lex=Lex; LEX *lex=Lex;
if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) if (lex->select->linkage != GLOBAL_OPTIONS_TYPE &&
lex->select->olap != UNSPECIFIED_OLAP_TYPE)
{ {
net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP",
"LIMIT"); "LIMIT");
...@@ -2471,7 +2473,8 @@ limit_clause: ...@@ -2471,7 +2473,8 @@ limit_clause:
| LIMIT ULONG_NUM ',' ULONG_NUM | LIMIT ULONG_NUM ',' ULONG_NUM
{ {
LEX *lex=Lex; LEX *lex=Lex;
if (lex->select->olap != UNSPECIFIED_OLAP_TYPE) if (lex->select->linkage != GLOBAL_OPTIONS_TYPE &&
lex->select->olap != UNSPECIFIED_OLAP_TYPE)
{ {
net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP", net_printf(lex->thd, ER_WRONG_USAGE, "CUBE/ROLLUP",
"LIMIT"); "LIMIT");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment