Merge mysql.com:/home/dlenev/src/mysql-5.0-bg14836

into  mysql.com:/home/dlenev/src/mysql-5.1-merges


mysql-test/r/view.result:
  Auto merged
mysql-test/t/view.test:
  Auto merged
sql/sql_select.cc:
  Auto merged
sql/share/errmsg.txt:
  Auto merged
sql/sql_show.cc:
  Auto merged
storage/ndb/src/kernel/blocks/backup/Backup.cpp:
  Auto merged
storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp:
  Auto merged
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp:
  Auto merged
storage/ndb/tools/ndb_size.pl:
  Auto merged
mysql-test/r/information_schema.result:
  Manual merge.
mysql-test/t/information_schema.test:
  Manual merge.
sql/sql_trigger.cc:
  Manual merge.
This commit is contained in:
unknown 2005-12-24 20:13:51 +03:00
commit eff9369d10
15 changed files with 159 additions and 44 deletions

View File

@ -656,7 +656,11 @@ DoProcessReply(SSL& ssl, mySTL::auto_ptr<input_buffer> buffered)
{ {
ssl.getSocket().wait(); // wait for input if blocking ssl.getSocket().wait(); // wait for input if blocking
uint ready = ssl.getSocket().get_ready(); uint ready = ssl.getSocket().get_ready();
if (!ready) return buffered; if (!ready) {
// Nothing to receive after blocking wait => error
ssl.SetError(receive_error);
return buffered= null_buffer;
}
// add buffered data if its there // add buffered data if its there
uint buffSz = buffered.get() ? buffered.get()->get_size() : 0; uint buffSz = buffered.get() ? buffered.get()->get_size() : 0;

View File

@ -1059,6 +1059,24 @@ where table_name="v1";
table_type table_type
VIEW VIEW
drop view v1; drop view v1;
create temporary table t1(f1 int, index(f1));
show columns from t1;
Field Type Null Key Default Extra
f1 int(11) YES MUL NULL
describe t1;
Field Type Null Key Default Extra
f1 int(11) YES MUL NULL
show indexes from t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
t1 1 f1 1 f1 A NULL NULL NULL YES BTREE
drop table t1;
create table t1(f1 binary(32), f2 varbinary(64));
select character_maximum_length, character_octet_length
from information_schema.columns where table_name='t1';
character_maximum_length character_octet_length
32 32
64 64
drop table t1;
select * from information_schema.engines WHERE ENGINE="MyISAM"; select * from information_schema.engines WHERE ENGINE="MyISAM";
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
MyISAM ENABLED Default engine as of MySQL 3.23 with great performance NO NO NO MyISAM ENABLED Default engine as of MySQL 3.23 with great performance NO NO NO

View File

@ -780,3 +780,9 @@ end//
CALL p2(); CALL p2();
drop procedure p2; drop procedure p2;
drop table t1; drop table t1;
create trigger t1_bi before insert on test.t1 for each row set @a:=0;
ERROR 3D000: No database selected
create trigger test.t1_bi before insert on t1 for each row set @a:=0;
ERROR 3D000: No database selected
drop trigger t1_bi;
ERROR 3D000: No database selected

View File

@ -2456,3 +2456,19 @@ f1()
42 42
drop view v2,v1; drop view v2,v1;
drop function f1; drop function f1;
create table t1 (id numeric, warehouse_id numeric);
create view v1 as select id from t1;
create view v2 as
select t1.warehouse_id, v1.id as receipt_id
from t1, v1 where t1.id = v1.id;
insert into t1 (id, warehouse_id) values(3, 2);
insert into t1 (id, warehouse_id) values(4, 2);
insert into t1 (id, warehouse_id) values(5, 1);
select v2.receipt_id as alias1, v2.receipt_id as alias2 from v2
order by v2.receipt_id;
alias1 alias2
3 3
4 4
5 5
drop view v2, v1;
drop table t1;

View File

@ -749,6 +749,25 @@ select table_type from information_schema.tables
where table_name="v1"; where table_name="v1";
drop view v1; drop view v1;
#
# Bug #14387 SHOW COLUMNS doesn't work on temporary tables
# Bug #15224 SHOW INDEX from temporary table doesn't work
# Bug #12770 DESC cannot display the info. about temporary table
#
create temporary table t1(f1 int, index(f1));
show columns from t1;
describe t1;
show indexes from t1;
drop table t1;
#
# Bug#14271 I_S: columns has no size for (var)binary columns
#
create table t1(f1 binary(32), f2 varbinary(64));
select character_maximum_length, character_octet_length
from information_schema.columns where table_name='t1';
drop table t1;
# #
# Show engines # Show engines
# #

View File

@ -13,6 +13,8 @@ drop procedure if exists p1;
# Create additional connections used through test # Create additional connections used through test
connect (addconroot1, localhost, root,,); connect (addconroot1, localhost, root,,);
connect (addconroot2, localhost, root,,); connect (addconroot2, localhost, root,,);
# Connection without current database set
connect (addconwithoutdb, localhost, root,,*NO-ONE*);
connection default; connection default;
create table t1 (i int); create table t1 (i int);
@ -946,3 +948,16 @@ CALL p2();
drop procedure p2; drop procedure p2;
drop table t1; drop table t1;
#
# Test for bug #14863 "Triggers: crash if create and there is no current
# database". We should not crash and give proper error when database for
# trigger or its table is not specified and there is no current database.
#
connection addconwithoutdb;
--error ER_NO_DB_ERROR
create trigger t1_bi before insert on test.t1 for each row set @a:=0;
--error ER_NO_DB_ERROR
create trigger test.t1_bi before insert on t1 for each row set @a:=0;
--error ER_NO_DB_ERROR
drop trigger t1_bi;
connection default;

View File

@ -2323,3 +2323,22 @@ CREATE VIEW v2 AS SELECT f1();
select * from v2; select * from v2;
drop view v2,v1; drop view v2,v1;
drop function f1; drop function f1;
#
# Bug#14861: aliased column names are not preserved.
#
create table t1 (id numeric, warehouse_id numeric);
create view v1 as select id from t1;
create view v2 as
select t1.warehouse_id, v1.id as receipt_id
from t1, v1 where t1.id = v1.id;
insert into t1 (id, warehouse_id) values(3, 2);
insert into t1 (id, warehouse_id) values(4, 2);
insert into t1 (id, warehouse_id) values(5, 1);
select v2.receipt_id as alias1, v2.receipt_id as alias2 from v2
order by v2.receipt_id;
drop view v2, v1;
drop table t1;

View File

@ -5372,7 +5372,7 @@ ER_WSAS_FAILED
eng "WSAStartup Failed" eng "WSAStartup Failed"
ger "WSAStartup fehlgeschlagen" ger "WSAStartup fehlgeschlagen"
ER_DIFF_GROUPS_PROC ER_DIFF_GROUPS_PROC
eng "Can't handle procedures with differents groups yet" eng "Can't handle procedures with different groups yet"
ger "Kann Prozeduren mit unterschiedlichen Gruppen noch nicht verarbeiten" ger "Kann Prozeduren mit unterschiedlichen Gruppen noch nicht verarbeiten"
ER_NO_GROUP_FOR_PROC ER_NO_GROUP_FOR_PROC
eng "Select must have a group with this procedure" eng "Select must have a group with this procedure"

View File

@ -8218,7 +8218,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
uint convert_blob_length) uint convert_blob_length)
{ {
Item::Type orig_type= type; Item::Type orig_type= type;
Item *orig_item; Item *orig_item= 0;
if (type != Item::FIELD_ITEM && if (type != Item::FIELD_ITEM &&
item->real_item()->type() == Item::FIELD_ITEM && item->real_item()->type() == Item::FIELD_ITEM &&
@ -8271,7 +8271,9 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
} }
else else
result= create_tmp_field_from_field(thd, (*from_field= field->field), result= create_tmp_field_from_field(thd, (*from_field= field->field),
item->name, table, orig_item ? orig_item->name :
item->name,
table,
modify_item ? field : modify_item ? field :
NULL, NULL,
convert_blob_length); convert_blob_length);

View File

@ -2260,6 +2260,13 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
bool res; bool res;
lex->all_selects_list= lsel; lex->all_selects_list= lsel;
/*
Restore thd->temporary_tables to be able to process
temporary tables(only for 'show index' & 'show columns').
This should be changed when processing of temporary tables for
I_S tables will be done.
*/
thd->temporary_tables= open_tables_state_backup.temporary_tables;
res= open_normal_and_derived_tables(thd, show_table_list, res= open_normal_and_derived_tables(thd, show_table_list,
MYSQL_LOCK_IGNORE_FLUSH); MYSQL_LOCK_IGNORE_FLUSH);
/* /*
@ -2279,6 +2286,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
show_table_list->view_db.str : show_table_list->view_db.str :
show_table_list->db), show_table_list->db),
show_table_list->alias)); show_table_list->alias));
thd->temporary_tables= 0;
close_thread_tables(thd); close_thread_tables(thd);
show_table_list->table= 0; show_table_list->table= 0;
goto err; goto err;
@ -2799,7 +2807,9 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
table->field[6]->store((const char*) pos, table->field[6]->store((const char*) pos,
strlen((const char*) pos), cs); strlen((const char*) pos), cs);
is_blob= (field->type() == FIELD_TYPE_BLOB); is_blob= (field->type() == FIELD_TYPE_BLOB);
if (field->has_charset() || is_blob) if (field->has_charset() || is_blob ||
field->real_type() == MYSQL_TYPE_VARCHAR || // For varbinary type
field->real_type() == MYSQL_TYPE_STRING) // For binary type
{ {
longlong char_max_len= is_blob ? longlong char_max_len= is_blob ?
(longlong) field->max_length() / field->charset()->mbminlen : (longlong) field->max_length() / field->charset()->mbminlen :

View File

@ -78,10 +78,6 @@ const char * const trigname_file_ext= ".TRN";
static File_option trigname_file_parameters[]= static File_option trigname_file_parameters[]=
{ {
{ {
/*
FIXME: Length specified for "trigger_table" key is erroneous, problem
caused by this are reported as BUG#14090 and should be fixed ASAP.
*/
{(char *) STRING_WITH_LEN("trigger_table")}, {(char *) STRING_WITH_LEN("trigger_table")},
offsetof(struct st_trigname, trigger_table), offsetof(struct st_trigname, trigger_table),
FILE_OPTIONS_ESTRING FILE_OPTIONS_ESTRING
@ -155,6 +151,17 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
But do we want this ? But do we want this ?
*/ */
/*
Note that once we will have check for TRIGGER privilege in place we won't
need second part of condition below, since check_access() function also
checks that db is specified.
*/
if (!thd->lex->spname->m_db.length || create && !tables->db_length)
{
my_error(ER_NO_DB_ERROR, MYF(0));
DBUG_RETURN(TRUE);
}
if (!create && if (!create &&
!(tables= add_table_for_trigger(thd, thd->lex->spname))) !(tables= add_table_for_trigger(thd, thd->lex->spname)))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
@ -285,6 +292,9 @@ end:
definer. The caller is responsible to provide memory for definer. The caller is responsible to provide memory for
storing LEX_STRING object. storing LEX_STRING object.
NOTE
Assumes that trigger name is fully qualified.
RETURN VALUE RETURN VALUE
False - success False - success
True - error True - error
@ -308,8 +318,7 @@ bool Table_triggers_list::create_trigger(THD *thd, TABLE_LIST *tables,
/* Trigger must be in the same schema as target table. */ /* Trigger must be in the same schema as target table. */
if (my_strcasecmp(table_alias_charset, table->s->db.str, if (my_strcasecmp(table_alias_charset, table->s->db.str,
lex->spname->m_db.str ? lex->spname->m_db.str : lex->spname->m_db.str))
thd->db))
{ {
my_error(ER_TRG_IN_WRONG_SCHEMA, MYF(0)); my_error(ER_TRG_IN_WRONG_SCHEMA, MYF(0));
return 1; return 1;
@ -1010,7 +1019,6 @@ bool Table_triggers_list::get_trigger_info(THD *thd, trg_event_type event,
static TABLE_LIST *add_table_for_trigger(THD *thd, sp_name *trig) static TABLE_LIST *add_table_for_trigger(THD *thd, sp_name *trig)
{ {
const char *db= !trig->m_db.str ? thd->db : trig->m_db.str;
LEX *lex= thd->lex; LEX *lex= thd->lex;
char path_buff[FN_REFLEN]; char path_buff[FN_REFLEN];
LEX_STRING path; LEX_STRING path;
@ -1018,7 +1026,7 @@ static TABLE_LIST *add_table_for_trigger(THD *thd, sp_name *trig)
struct st_trigname trigname; struct st_trigname trigname;
DBUG_ENTER("add_table_for_trigger"); DBUG_ENTER("add_table_for_trigger");
strxnmov(path_buff, FN_REFLEN-1, mysql_data_home, "/", db, "/", strxnmov(path_buff, FN_REFLEN-1, mysql_data_home, "/", trig->m_db.str, "/",
trig->m_name.str, trigname_file_ext, NullS); trig->m_name.str, trigname_file_ext, NullS);
path.length= unpack_filename(path_buff, path_buff); path.length= unpack_filename(path_buff, path_buff);
path.str= path_buff; path.str= path_buff;
@ -1047,7 +1055,7 @@ static TABLE_LIST *add_table_for_trigger(THD *thd, sp_name *trig)
/* We need to reset statement table list to be PS/SP friendly. */ /* We need to reset statement table list to be PS/SP friendly. */
lex->query_tables= 0; lex->query_tables= 0;
lex->query_tables_last= &lex->query_tables; lex->query_tables_last= &lex->query_tables;
DBUG_RETURN(sp_add_to_query_tables(thd, lex, db, DBUG_RETURN(sp_add_to_query_tables(thd, lex, trig->m_db.str,
trigname.trigger_table.str, TL_WRITE)); trigname.trigger_table.str, TL_WRITE));
} }

View File

@ -3883,7 +3883,7 @@ Backup::checkFile(Signal* signal, BackupFilePtr filePtr)
req->userReference = reference(); req->userReference = reference();
req->varIndex = 0; req->varIndex = 0;
req->offset = tmp - c_startOfPages; req->offset = tmp - c_startOfPages;
req->size = sz; // Avrunda uppot req->size = sz; // Round up
sendSignal(NDBFS_REF, GSN_FSAPPENDREQ, signal, sendSignal(NDBFS_REF, GSN_FSAPPENDREQ, signal,
FsAppendReq::SignalLength, JBA); FsAppendReq::SignalLength, JBA);

View File

@ -11188,7 +11188,11 @@ void Dbdih::initCommonData()
cnoReplicas = 1; cnoReplicas = 1;
ndb_mgm_get_int_parameter(p, CFG_DB_NO_REPLICAS, &cnoReplicas); ndb_mgm_get_int_parameter(p, CFG_DB_NO_REPLICAS, &cnoReplicas);
cnoReplicas = cnoReplicas > 4 ? 4 : cnoReplicas; if (cnoReplicas > 4)
{
progError(__LINE__, NDBD_EXIT_INVALID_CONFIG,
"Only up to four replicas are supported. Check NoOfReplicas.");
}
cgcpDelay = 2000; cgcpDelay = 2000;
ndb_mgm_get_int_parameter(p, CFG_DB_GCP_INTERVAL, &cgcpDelay); ndb_mgm_get_int_parameter(p, CFG_DB_GCP_INTERVAL, &cgcpDelay);
@ -11778,14 +11782,14 @@ void Dbdih::execCHECKNODEGROUPSREQ(Signal* signal)
break; break;
case CheckNodeGroups::GetNodeGroupMembers: { case CheckNodeGroups::GetNodeGroupMembers: {
ok = true; ok = true;
Uint32 ownNodeGoup = Uint32 ownNodeGroup =
Sysfile::getNodeGroup(sd->nodeId, SYSFILE->nodeGroups); Sysfile::getNodeGroup(sd->nodeId, SYSFILE->nodeGroups);
sd->output = ownNodeGoup; sd->output = ownNodeGroup;
sd->mask.clear(); sd->mask.clear();
NodeGroupRecordPtr ngPtr; NodeGroupRecordPtr ngPtr;
ngPtr.i = ownNodeGoup; ngPtr.i = ownNodeGroup;
ptrAss(ngPtr, nodeGroupRecord); ptrAss(ngPtr, nodeGroupRecord);
for (Uint32 j = 0; j < ngPtr.p->nodeCount; j++) { for (Uint32 j = 0; j < ngPtr.p->nodeCount; j++) {
jam(); jam();
@ -11793,7 +11797,7 @@ void Dbdih::execCHECKNODEGROUPSREQ(Signal* signal)
} }
#if 0 #if 0
for (int i = 0; i < MAX_NDB_NODES; i++) { for (int i = 0; i < MAX_NDB_NODES; i++) {
if (ownNodeGoup == if (ownNodeGroup ==
Sysfile::getNodeGroup(i, SYSFILE->nodeGroups)) { Sysfile::getNodeGroup(i, SYSFILE->nodeGroups)) {
sd->mask.set(i); sd->mask.set(i);
} }

View File

@ -17687,60 +17687,54 @@ void
Dblqh::execCREATE_TRIG_REQ(Signal* signal) Dblqh::execCREATE_TRIG_REQ(Signal* signal)
{ {
jamEntry(); jamEntry();
NodeId myNodeId = getOwnNodeId();
BlockReference tupref = calcTupBlockRef(myNodeId);
sendSignal(tupref, GSN_CREATE_TRIG_REQ, signal, CreateTrigReq::SignalLength, JBB); sendSignal(DBTUP_REF, GSN_CREATE_TRIG_REQ, signal,
CreateTrigReq::SignalLength, JBB);
} }
void void
Dblqh::execCREATE_TRIG_CONF(Signal* signal) Dblqh::execCREATE_TRIG_CONF(Signal* signal)
{ {
jamEntry(); jamEntry();
NodeId myNodeId = getOwnNodeId();
BlockReference dictref = calcDictBlockRef(myNodeId);
sendSignal(dictref, GSN_CREATE_TRIG_CONF, signal, CreateTrigConf::SignalLength, JBB); sendSignal(DBDICT_REF, GSN_CREATE_TRIG_CONF, signal,
CreateTrigConf::SignalLength, JBB);
} }
void void
Dblqh::execCREATE_TRIG_REF(Signal* signal) Dblqh::execCREATE_TRIG_REF(Signal* signal)
{ {
jamEntry(); jamEntry();
NodeId myNodeId = getOwnNodeId();
BlockReference dictref = calcDictBlockRef(myNodeId);
sendSignal(dictref, GSN_CREATE_TRIG_REF, signal, CreateTrigRef::SignalLength, JBB); sendSignal(DBDICT_REF, GSN_CREATE_TRIG_REF, signal,
CreateTrigRef::SignalLength, JBB);
} }
void void
Dblqh::execDROP_TRIG_REQ(Signal* signal) Dblqh::execDROP_TRIG_REQ(Signal* signal)
{ {
jamEntry(); jamEntry();
NodeId myNodeId = getOwnNodeId();
BlockReference tupref = calcTupBlockRef(myNodeId);
sendSignal(tupref, GSN_DROP_TRIG_REQ, signal, DropTrigReq::SignalLength, JBB); sendSignal(DBTUP_REF, GSN_DROP_TRIG_REQ, signal,
DropTrigReq::SignalLength, JBB);
} }
void void
Dblqh::execDROP_TRIG_CONF(Signal* signal) Dblqh::execDROP_TRIG_CONF(Signal* signal)
{ {
jamEntry(); jamEntry();
NodeId myNodeId = getOwnNodeId();
BlockReference dictref = calcDictBlockRef(myNodeId);
sendSignal(dictref, GSN_DROP_TRIG_CONF, signal, DropTrigConf::SignalLength, JBB); sendSignal(DBDICT_REF, GSN_DROP_TRIG_CONF, signal,
DropTrigConf::SignalLength, JBB);
} }
void void
Dblqh::execDROP_TRIG_REF(Signal* signal) Dblqh::execDROP_TRIG_REF(Signal* signal)
{ {
jamEntry(); jamEntry();
NodeId myNodeId = getOwnNodeId();
BlockReference dictref = calcDictBlockRef(myNodeId);
sendSignal(dictref, GSN_DROP_TRIG_REF, signal, DropTrigRef::SignalLength, JBB); sendSignal(DBDICT_REF, GSN_DROP_TRIG_REF, signal,
DropTrigRef::SignalLength, JBB);
} }
Uint32 Dblqh::calcPageCheckSum(LogPageRecordPtr logP){ Uint32 Dblqh::calcPageCheckSum(LogPageRecordPtr logP){

View File

@ -146,9 +146,9 @@ foreach(@{$tables})
elsif($type =~ /varchar/ || $type =~ /varbinary/) elsif($type =~ /varchar/ || $type =~ /varbinary/)
{ {
my $fixed= 1+$size; my $fixed= 1+$size;
my @dynamic=$dbh->selectrow_array("select avg(length(" my @dynamic=$dbh->selectrow_array("select avg(length(`"
.$dbh->quote($name) .$name.
.")) from `".$table.'`'); ."`)) from `".$table.'`');
$dynamic[0]=0 if !$dynamic[0]; $dynamic[0]=0 if !$dynamic[0];
@realsize= ($fixed,$fixed,ceil($dynamic[0])); @realsize= ($fixed,$fixed,ceil($dynamic[0]));
} }