Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0
into dl145c.mysql.com:/home/ndbdev/tomas/mysql-5.1 storage/ndb/src/cw/cpcd/Process.cpp: Auto merged storage/ndb/src/kernel/blocks/dbtc/Dbtc.hpp: Auto merged storage/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp: Auto merged storage/ndb/src/kernel/blocks/dbtup/DbtupCommit.cpp: Auto merged storage/ndb/src/kernel/error/ErrorReporter.cpp: Auto merged storage/ndb/src/mgmapi/mgmapi.cpp: Auto merged storage/ndb/src/ndbapi/ClusterMgr.cpp: Auto merged storage/ndb/src/ndbapi/NdbIndexOperation.cpp: Auto merged storage/ndb/src/ndbapi/ndberror.c: Auto merged storage/ndb/test/ndbapi/testNodeRestart.cpp: Auto merged storage/ndb/test/run-test/Makefile.am: Auto merged storage/ndb/test/src/NDBT_ResultRow.cpp: Auto merged BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
This commit is contained in:
commit
0de78e66c2
@ -55,6 +55,9 @@ case "$cpu_family--$model_name" in
|
||||
*Pentium*III*CPU*)
|
||||
cpu_flag="pentium3";
|
||||
;;
|
||||
*Pentium*M*pro*)
|
||||
cpu_flag="pentium-m";
|
||||
;;
|
||||
*Athlon*64*)
|
||||
cpu_flag="athlon64";
|
||||
cpu_flag_old="athlon";
|
||||
|
@ -279,6 +279,7 @@ tonu@x3.internalnet
|
||||
tsmith@build.mysql.com
|
||||
tulin@build.mysql.com
|
||||
tulin@dl145b.mysql.com
|
||||
tulin@dl145c.mysql.com
|
||||
tulin@mysql.com
|
||||
ulli@morbus.(none)
|
||||
venu@hundin.mysql.fi
|
||||
|
28
mysql-test/r/information_schema_db.result
Normal file
28
mysql-test/r/information_schema_db.result
Normal file
@ -0,0 +1,28 @@
|
||||
use INFORMATION_SCHEMA;
|
||||
show tables;
|
||||
Tables_in_INFORMATION_SCHEMA
|
||||
SCHEMATA
|
||||
TABLES
|
||||
COLUMNS
|
||||
CHARACTER_SETS
|
||||
COLLATIONS
|
||||
COLLATION_CHARACTER_SET_APPLICABILITY
|
||||
ROUTINES
|
||||
STATISTICS
|
||||
VIEWS
|
||||
USER_PRIVILEGES
|
||||
SCHEMA_PRIVILEGES
|
||||
TABLE_PRIVILEGES
|
||||
COLUMN_PRIVILEGES
|
||||
TABLE_CONSTRAINTS
|
||||
KEY_COLUMN_USAGE
|
||||
show tables from INFORMATION_SCHEMA like 'T%';
|
||||
Tables_in_INFORMATION_SCHEMA (T%)
|
||||
TABLES
|
||||
TABLE_PRIVILEGES
|
||||
TABLE_CONSTRAINTS
|
||||
create database `inf%`;
|
||||
use `inf%`;
|
||||
show tables;
|
||||
Tables_in_inf%
|
||||
drop database `inf%`;
|
@ -158,9 +158,6 @@ a
|
||||
select * from t2;
|
||||
a
|
||||
3
|
||||
select if(compte<>3,"this is broken but documented","this unexpectedly works?") from (select count(*) as compte from t2) as aggreg;
|
||||
if(compte<>3,"this is broken but documented","this unexpectedly works?")
|
||||
this is broken but documented
|
||||
select * from mysql.proc where name="foo4" and db='mysqltest1';
|
||||
db name type specific_name language sql_data_access is_deterministic security_type param_list returns body definer created modified sql_mode comment
|
||||
mysqltest1 foo4 PROCEDURE foo4 SQL CONTAINS_SQL YES INVOKER begin
|
||||
@ -197,9 +194,6 @@ a
|
||||
select * from t1;
|
||||
a
|
||||
21
|
||||
select if(compte<>1,"this is broken but documented","this unexpectedly works?") from (select count(*) as compte from t1 where a=20) as aggreg;
|
||||
if(compte<>1,"this is broken but documented","this unexpectedly works?")
|
||||
this is broken but documented
|
||||
select * from t2;
|
||||
a
|
||||
23
|
||||
@ -230,6 +224,35 @@ db name type specific_name language sql_data_access is_deterministic security_ty
|
||||
mysqltest1 fn1 FUNCTION fn1 SQL CONTAINS_SQL YES DEFINER int(11) begin
|
||||
return unix_timestamp();
|
||||
end @ # #
|
||||
create trigger trg before insert on t1 for each row set new.a= 10;
|
||||
ERROR 42000: Access denied; you need the SUPER privilege for this operation
|
||||
flush logs;
|
||||
delete from t1;
|
||||
create trigger trg before insert on t1 for each row set new.a= 10;
|
||||
insert into t1 values (1);
|
||||
select * from t1;
|
||||
a
|
||||
10
|
||||
select * from t1;
|
||||
a
|
||||
10
|
||||
delete from t1;
|
||||
drop trigger t1.trg;
|
||||
insert into t1 values (1);
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
show binlog events in 'master-bin.000002' from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; delete from t1
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; create trigger trg before insert on t1 for each row set new.a= 10
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; insert into t1 values (1)
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; delete from t1
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; drop trigger t1.trg
|
||||
master-bin.000002 # Query 1 # use `mysqltest1`; insert into t1 values (1)
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
drop function fn1;
|
||||
drop database mysqltest1;
|
||||
drop user "zedjzlcsjhd"@127.0.0.1;
|
||||
|
@ -863,3 +863,16 @@ select 0.190287977636363637 + 0.040372670 * 0 - 0;
|
||||
select -0.123 * 0;
|
||||
-0.123 * 0
|
||||
0.000
|
||||
CREATE TABLE t1 (f1 DECIMAL (12,9), f2 DECIMAL(2,2));
|
||||
INSERT INTO t1 VALUES (10.5, 0);
|
||||
UPDATE t1 SET f1 = 4.5;
|
||||
SELECT * FROM t1;
|
||||
f1 f2
|
||||
4.500000000 0.00
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (f1 DECIMAL (64,20), f2 DECIMAL(2,2));
|
||||
INSERT INTO t1 VALUES (9999999999999999999999999999999999, 0);
|
||||
SELECT * FROM t1;
|
||||
f1 f2
|
||||
9999999999999999999999999999999999.00000000000000000000 0.00
|
||||
DROP TABLE t1;
|
||||
|
9
mysql-test/t/information_schema_db.test
Normal file
9
mysql-test/t/information_schema_db.test
Normal file
@ -0,0 +1,9 @@
|
||||
-- source include/testdb_only.inc
|
||||
|
||||
use INFORMATION_SCHEMA;
|
||||
show tables;
|
||||
show tables from INFORMATION_SCHEMA like 'T%';
|
||||
create database `inf%`;
|
||||
use `inf%`;
|
||||
show tables;
|
||||
drop database `inf%`;
|
@ -437,6 +437,7 @@ explain select * from t1 where a='aaa' collate latin1_german1_ci;
|
||||
drop table t1;
|
||||
|
||||
# Test for BUG#9348 "result for WHERE A AND (B OR C) differs from WHERE a AND (C OR B)"
|
||||
--disable_warnings
|
||||
CREATE TABLE t1 (
|
||||
`CLIENT` char(3) character set latin1 collate latin1_bin NOT NULL default '000',
|
||||
`ARG1` char(3) character set latin1 collate latin1_bin NOT NULL default '',
|
||||
@ -445,6 +446,7 @@ CREATE TABLE t1 (
|
||||
`FUNCTINT` int(11) NOT NULL default '0',
|
||||
KEY `VERI_CLNT~2` (`ARG1`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||
--enable_warnings
|
||||
|
||||
INSERT INTO t1 VALUES ('000',' 0',' 0','Text 001',0), ('000',' 0',' 1','Text 002',0),
|
||||
('000',' 1',' 2','Text 003',0), ('000',' 2',' 3','Text 004',0),
|
||||
|
@ -157,7 +157,6 @@ select * from t2;
|
||||
sync_slave_with_master;
|
||||
select * from t1;
|
||||
select * from t2;
|
||||
select if(compte<>3,"this is broken but documented","this unexpectedly works?") from (select count(*) as compte from t2) as aggreg;
|
||||
|
||||
# Test of DROP PROCEDURE
|
||||
|
||||
@ -194,7 +193,6 @@ select * from t1;
|
||||
select * from t2;
|
||||
sync_slave_with_master;
|
||||
select * from t1;
|
||||
select if(compte<>1,"this is broken but documented","this unexpectedly works?") from (select count(*) as compte from t1 where a=20) as aggreg;
|
||||
select * from t2;
|
||||
|
||||
connection master;
|
||||
@ -225,6 +223,40 @@ select * from t1;
|
||||
--replace_column 13 # 14 #
|
||||
select * from mysql.proc where db='mysqltest1';
|
||||
|
||||
# And now triggers
|
||||
|
||||
connection con1;
|
||||
--error 1227;
|
||||
create trigger trg before insert on t1 for each row set new.a= 10;
|
||||
|
||||
connection master;
|
||||
# fn1() above uses timestamps, so in !ps-protocol, the timezone will be
|
||||
# binlogged, but in --ps-protocol it will not be (BUG#9359) so
|
||||
# the binlog offsets get shifted which spoils SHOW BINLOG EVENTS.
|
||||
# To be immune, we take a new binlog.
|
||||
flush logs;
|
||||
delete from t1;
|
||||
# TODO: when triggers can contain an update, test that this update
|
||||
# does not go into binlog.
|
||||
# I'm not setting user vars in the trigger, because replication of user vars
|
||||
# would take care of propagating the user var's value to slave, so even if
|
||||
# the trigger was not executed on slave it would not be discovered.
|
||||
create trigger trg before insert on t1 for each row set new.a= 10;
|
||||
insert into t1 values (1);
|
||||
select * from t1;
|
||||
sync_slave_with_master;
|
||||
select * from t1;
|
||||
|
||||
connection master;
|
||||
delete from t1;
|
||||
drop trigger t1.trg;
|
||||
insert into t1 values (1);
|
||||
select * from t1;
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events in 'master-bin.000002' from 98;
|
||||
sync_slave_with_master;
|
||||
select * from t1;
|
||||
|
||||
|
||||
# Clean up
|
||||
connection master;
|
||||
|
@ -892,3 +892,17 @@ select 0.190287977636363637 + 0.040372670 * 0 - 0;
|
||||
# Bug #9527
|
||||
#
|
||||
select -0.123 * 0;
|
||||
|
||||
#
|
||||
# Bug #10232
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (f1 DECIMAL (12,9), f2 DECIMAL(2,2));
|
||||
INSERT INTO t1 VALUES (10.5, 0);
|
||||
UPDATE t1 SET f1 = 4.5;
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (f1 DECIMAL (64,20), f2 DECIMAL(2,2));
|
||||
INSERT INTO t1 VALUES (9999999999999999999999999999999999, 0);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
@ -18,7 +18,6 @@
|
||||
/* This file defines all string functions */
|
||||
|
||||
#ifdef USE_PRAGMA_INTERFACE
|
||||
#error PRAGMA
|
||||
#pragma interface /* gcc class implementation */
|
||||
#endif
|
||||
|
||||
|
@ -1779,32 +1779,77 @@ enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table)
|
||||
|
||||
|
||||
/*
|
||||
Add 'information_schema' name to db_names list
|
||||
Create db names list. Information schema name always is first in list
|
||||
|
||||
SYNOPSIS
|
||||
schema_db_add()
|
||||
make_db_list()
|
||||
thd thread handler
|
||||
files list of db names
|
||||
wild wild string
|
||||
idx_field_vals idx_field_vals->db_name contains db name or
|
||||
wild string
|
||||
with_i_schema returns 1 if we added 'IS' name to list
|
||||
otherwise returns 0
|
||||
is_wild_value if value is 1 then idx_field_vals->db_name is
|
||||
wild string otherwise it's db name;
|
||||
|
||||
RETURN
|
||||
1 error
|
||||
0 success
|
||||
*/
|
||||
|
||||
int schema_db_add(THD *thd, List<char> *files,
|
||||
const char *wild, bool *with_i_schema)
|
||||
int make_db_list(THD *thd, List<char> *files,
|
||||
INDEX_FIELD_VALUES *idx_field_vals,
|
||||
bool *with_i_schema, bool is_wild_value)
|
||||
{
|
||||
LEX *lex= thd->lex;
|
||||
*with_i_schema= 0;
|
||||
if (!wild || !wild_compare(information_schema_name.str, wild, 0))
|
||||
get_index_field_values(lex, idx_field_vals);
|
||||
if (is_wild_value)
|
||||
{
|
||||
*with_i_schema= 1;
|
||||
if (files->push_back(thd->strdup(information_schema_name.str)))
|
||||
return 1;
|
||||
/*
|
||||
This part of code is only for SHOW DATABASES command.
|
||||
idx_field_vals->db_value can be 0 when we don't use
|
||||
LIKE clause (see also get_index_field_values() function)
|
||||
*/
|
||||
if (!idx_field_vals->db_value ||
|
||||
!wild_case_compare(system_charset_info,
|
||||
information_schema_name.str,
|
||||
idx_field_vals->db_value))
|
||||
{
|
||||
*with_i_schema= 1;
|
||||
if (files->push_back(thd->strdup(information_schema_name.str)))
|
||||
return 1;
|
||||
}
|
||||
return mysql_find_files(thd, files, NullS, mysql_data_home,
|
||||
idx_field_vals->db_value, 1);
|
||||
}
|
||||
return 0;
|
||||
|
||||
/*
|
||||
This part of code is for SHOW TABLES, SHOW TABLE STATUS commands.
|
||||
idx_field_vals->db_value can't be 0 (see get_index_field_values()
|
||||
function). lex->orig_sql_command can be not equal to SQLCOM_END
|
||||
only in case of executing of SHOW commands.
|
||||
*/
|
||||
if (lex->orig_sql_command != SQLCOM_END)
|
||||
{
|
||||
if (!my_strcasecmp(system_charset_info, information_schema_name.str,
|
||||
idx_field_vals->db_value))
|
||||
{
|
||||
*with_i_schema= 1;
|
||||
return files->push_back(thd->strdup(information_schema_name.str));
|
||||
}
|
||||
return files->push_back(thd->strdup(idx_field_vals->db_value));
|
||||
}
|
||||
|
||||
/*
|
||||
Create list of existing databases. It is used in case
|
||||
of select from information schema table
|
||||
*/
|
||||
if (files->push_back(thd->strdup(information_schema_name.str)))
|
||||
return 1;
|
||||
*with_i_schema= 1;
|
||||
return mysql_find_files(thd, files, NullS, mysql_data_home, NullS, 1);
|
||||
}
|
||||
|
||||
|
||||
@ -1882,14 +1927,9 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
|
||||
if (schema_table_idx == SCH_TABLES)
|
||||
lock_type= TL_READ;
|
||||
get_index_field_values(lex, &idx_field_vals);
|
||||
|
||||
/* information schema name always is first in list */
|
||||
if (schema_db_add(thd, &bases, idx_field_vals.db_value, &with_i_schema))
|
||||
goto err;
|
||||
|
||||
if (mysql_find_files(thd, &bases, NullS, mysql_data_home,
|
||||
idx_field_vals.db_value, 1))
|
||||
if (make_db_list(thd, &bases, &idx_field_vals,
|
||||
&with_i_schema, 0))
|
||||
goto err;
|
||||
|
||||
partial_cond= make_cond_for_info_schema(cond, tables);
|
||||
@ -2025,13 +2065,10 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
TABLE *table= tables->table;
|
||||
DBUG_ENTER("fill_schema_shemata");
|
||||
|
||||
get_index_field_values(thd->lex, &idx_field_vals);
|
||||
/* information schema name always is first in list */
|
||||
if (schema_db_add(thd, &files, idx_field_vals.db_value, &with_i_schema))
|
||||
DBUG_RETURN(1);
|
||||
if (mysql_find_files(thd, &files, NullS, mysql_data_home,
|
||||
idx_field_vals.db_value, 1))
|
||||
if (make_db_list(thd, &files, &idx_field_vals,
|
||||
&with_i_schema, 1))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
List_iterator_fast<char> it(files);
|
||||
while ((file_name=it++))
|
||||
{
|
||||
|
@ -98,6 +98,21 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
|
||||
if (wait_if_global_read_lock(thd, 0, 0))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
/*
|
||||
There is no DETERMINISTIC clause for triggers, so can't check it.
|
||||
But a trigger can in theory be used to do nasty things (if it supported
|
||||
DROP for example) so we do the check for privileges. For now there is
|
||||
already a stronger test above (see start of the function); but when this
|
||||
stronger test will be removed, the test below will hold.
|
||||
*/
|
||||
if (!trust_routine_creators && mysql_bin_log.is_open() &&
|
||||
!(thd->master_access & SUPER_ACL))
|
||||
{
|
||||
my_message(ER_BINLOG_CREATE_ROUTINE_NEED_SUPER,
|
||||
ER(ER_BINLOG_CREATE_ROUTINE_NEED_SUPER), MYF(0));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
VOID(pthread_mutex_lock(&LOCK_open));
|
||||
result= (create ?
|
||||
table->triggers->create_trigger(thd, tables):
|
||||
@ -109,7 +124,16 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
|
||||
start_waiting_global_read_lock(thd);
|
||||
|
||||
if (!result)
|
||||
send_ok(thd);
|
||||
{
|
||||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
thd->clear_error();
|
||||
/* Such a statement can always go directly to binlog, no trans cache */
|
||||
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
|
||||
mysql_bin_log.write(&qinfo);
|
||||
}
|
||||
send_ok(thd);
|
||||
}
|
||||
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
|
@ -52,7 +52,15 @@ public:
|
||||
FIXME: We should juggle with security context here (because trigger
|
||||
should be invoked with creator rights).
|
||||
*/
|
||||
/*
|
||||
We disable binlogging, as in SP/functions, even though currently
|
||||
triggers can't do updates. When triggers can do updates, someone
|
||||
should add such a trigger to rpl_sp.test to verify that the update
|
||||
does NOT go into binlog.
|
||||
*/
|
||||
tmp_disable_binlog(thd);
|
||||
res= bodies[event][time_type]->execute_function(thd, 0, 0, 0);
|
||||
reenable_binlog(thd);
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
thd->net.no_send_ok= nsok;
|
||||
|
@ -443,6 +443,7 @@ Dbtup::commitRecord(Signal* signal,
|
||||
saveAttributeMask.bitOR(befOpPtr.p->changeMask);
|
||||
befOpPtr.p->changeMask.clear();
|
||||
befOpPtr.p->changeMask.bitOR(attributeMask);
|
||||
befOpPtr.p->gci = regOperPtr->gci;
|
||||
|
||||
operPtr.p = befOpPtr.p;
|
||||
checkDetachedTriggers(signal,
|
||||
@ -480,6 +481,7 @@ Dbtup::commitRecord(Signal* signal,
|
||||
befOpPtr.p->pageOffset = befOpPtr.p->pageOffsetC;
|
||||
befOpPtr.p->fragPageId = befOpPtr.p->fragPageIdC;
|
||||
befOpPtr.p->pageIndex = befOpPtr.p->pageIndexC;
|
||||
befOpPtr.p->gci = regOperPtr->gci;
|
||||
|
||||
operPtr.p = befOpPtr.p;
|
||||
checkDetachedTriggers(signal,
|
||||
|
@ -463,7 +463,8 @@ ClusterMgr::reportNodeFailed(NodeId nodeId){
|
||||
}
|
||||
|
||||
theNode.nfCompleteRep = false;
|
||||
if(noOfAliveNodes == 0){
|
||||
if(noOfAliveNodes == 0)
|
||||
{
|
||||
NFCompleteRep rep;
|
||||
for(Uint32 i = 1; i<MAX_NODES; i++){
|
||||
if(theNodes[i].defined && theNodes[i].nfCompleteRep == false){
|
||||
|
@ -1162,6 +1162,8 @@ int decimal2bin(decimal_t *from, char *to, int precision, int frac)
|
||||
isize0=intg0*sizeof(dec1)+dig2bytes[intg0x],
|
||||
fsize0=frac0*sizeof(dec1)+dig2bytes[frac0x],
|
||||
fsize1=frac1*sizeof(dec1)+dig2bytes[frac1x];
|
||||
const int orig_isize0= isize0;
|
||||
const int orig_fsize0= fsize0;
|
||||
char *orig_to= to;
|
||||
|
||||
buf1= remove_leading_zeroes(from, &from_intg);
|
||||
@ -1252,10 +1254,15 @@ int decimal2bin(decimal_t *from, char *to, int precision, int frac)
|
||||
}
|
||||
if (fsize0 > fsize1)
|
||||
{
|
||||
while (fsize0-- > fsize1)
|
||||
char *to_end= orig_to + orig_fsize0 + orig_isize0;
|
||||
|
||||
while (fsize0-- > fsize1 && to < to_end)
|
||||
*to++=(uchar)mask;
|
||||
}
|
||||
orig_to[0]^= 0x80;
|
||||
|
||||
/* Check that we have written the whole decimal and nothing more */
|
||||
DBUG_ASSERT(to == orig_to + orig_fsize0 + orig_isize0);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user