Commit 12b4fb15 authored by tulin@dl145c.mysql.com's avatar tulin@dl145c.mysql.com

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0

into dl145c.mysql.com:/home/ndbdev/tomas/mysql-5.1
parents 7b7ec966 3c814444
...@@ -55,6 +55,9 @@ case "$cpu_family--$model_name" in ...@@ -55,6 +55,9 @@ case "$cpu_family--$model_name" in
*Pentium*III*CPU*) *Pentium*III*CPU*)
cpu_flag="pentium3"; cpu_flag="pentium3";
;; ;;
*Pentium*M*pro*)
cpu_flag="pentium-m";
;;
*Athlon*64*) *Athlon*64*)
cpu_flag="athlon64"; cpu_flag="athlon64";
cpu_flag_old="athlon"; cpu_flag_old="athlon";
......
...@@ -279,6 +279,7 @@ tonu@x3.internalnet ...@@ -279,6 +279,7 @@ tonu@x3.internalnet
tsmith@build.mysql.com tsmith@build.mysql.com
tulin@build.mysql.com tulin@build.mysql.com
tulin@dl145b.mysql.com tulin@dl145b.mysql.com
tulin@dl145c.mysql.com
tulin@mysql.com tulin@mysql.com
ulli@morbus.(none) ulli@morbus.(none)
venu@hundin.mysql.fi venu@hundin.mysql.fi
......
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 ...@@ -158,9 +158,6 @@ a
select * from t2; select * from t2;
a a
3 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'; 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 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 mysqltest1 foo4 PROCEDURE foo4 SQL CONTAINS_SQL YES INVOKER begin
...@@ -197,9 +194,6 @@ a ...@@ -197,9 +194,6 @@ a
select * from t1; select * from t1;
a a
21 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; select * from t2;
a a
23 23
...@@ -230,6 +224,35 @@ db name type specific_name language sql_data_access is_deterministic security_ty ...@@ -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 mysqltest1 fn1 FUNCTION fn1 SQL CONTAINS_SQL YES DEFINER int(11) begin
return unix_timestamp(); return unix_timestamp();
end @ # # 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 function fn1;
drop database mysqltest1; drop database mysqltest1;
drop user "zedjzlcsjhd"@127.0.0.1; drop user "zedjzlcsjhd"@127.0.0.1;
...@@ -863,3 +863,16 @@ select 0.190287977636363637 + 0.040372670 * 0 - 0; ...@@ -863,3 +863,16 @@ select 0.190287977636363637 + 0.040372670 * 0 - 0;
select -0.123 * 0; select -0.123 * 0;
-0.123 * 0 -0.123 * 0
0.000 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;
-- 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; ...@@ -437,6 +437,7 @@ explain select * from t1 where a='aaa' collate latin1_german1_ci;
drop table t1; drop table t1;
# Test for BUG#9348 "result for WHERE A AND (B OR C) differs from WHERE a AND (C OR B)" # 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 ( CREATE TABLE t1 (
`CLIENT` char(3) character set latin1 collate latin1_bin NOT NULL default '000', `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 '', `ARG1` char(3) character set latin1 collate latin1_bin NOT NULL default '',
...@@ -445,6 +446,7 @@ CREATE TABLE t1 ( ...@@ -445,6 +446,7 @@ CREATE TABLE t1 (
`FUNCTINT` int(11) NOT NULL default '0', `FUNCTINT` int(11) NOT NULL default '0',
KEY `VERI_CLNT~2` (`ARG1`) KEY `VERI_CLNT~2` (`ARG1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1; ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--enable_warnings
INSERT INTO t1 VALUES ('000',' 0',' 0','Text 001',0), ('000',' 0',' 1','Text 002',0), 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), ('000',' 1',' 2','Text 003',0), ('000',' 2',' 3','Text 004',0),
......
...@@ -157,7 +157,6 @@ select * from t2; ...@@ -157,7 +157,6 @@ select * from t2;
sync_slave_with_master; sync_slave_with_master;
select * from t1; select * from t1;
select * from t2; 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 # Test of DROP PROCEDURE
...@@ -194,7 +193,6 @@ select * from t1; ...@@ -194,7 +193,6 @@ select * from t1;
select * from t2; select * from t2;
sync_slave_with_master; sync_slave_with_master;
select * from t1; 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; select * from t2;
connection master; connection master;
...@@ -225,6 +223,40 @@ select * from t1; ...@@ -225,6 +223,40 @@ select * from t1;
--replace_column 13 # 14 # --replace_column 13 # 14 #
select * from mysql.proc where db='mysqltest1'; 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 # Clean up
connection master; connection master;
......
...@@ -892,3 +892,17 @@ select 0.190287977636363637 + 0.040372670 * 0 - 0; ...@@ -892,3 +892,17 @@ select 0.190287977636363637 + 0.040372670 * 0 - 0;
# Bug #9527 # Bug #9527
# #
select -0.123 * 0; 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 @@ ...@@ -18,7 +18,6 @@
/* This file defines all string functions */ /* This file defines all string functions */
#ifdef USE_PRAGMA_INTERFACE #ifdef USE_PRAGMA_INTERFACE
#error PRAGMA
#pragma interface /* gcc class implementation */ #pragma interface /* gcc class implementation */
#endif #endif
......
...@@ -1779,32 +1779,77 @@ enum enum_schema_tables get_schema_table_idx(ST_SCHEMA_TABLE *schema_table) ...@@ -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 SYNOPSIS
schema_db_add() make_db_list()
thd thread handler thd thread handler
files list of db names files list of db names
wild wild string 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 with_i_schema returns 1 if we added 'IS' name to list
otherwise returns 0 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 RETURN
1 error 1 error
0 success 0 success
*/ */
int schema_db_add(THD *thd, List<char> *files, int make_db_list(THD *thd, List<char> *files,
const char *wild, bool *with_i_schema) INDEX_FIELD_VALUES *idx_field_vals,
bool *with_i_schema, bool is_wild_value)
{ {
LEX *lex= thd->lex;
*with_i_schema= 0; *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))) This part of code is only for SHOW DATABASES command.
return 1; 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) ...@@ -1882,14 +1927,9 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
if (schema_table_idx == SCH_TABLES) if (schema_table_idx == SCH_TABLES)
lock_type= TL_READ; 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, if (make_db_list(thd, &bases, &idx_field_vals,
idx_field_vals.db_value, 1)) &with_i_schema, 0))
goto err; goto err;
partial_cond= make_cond_for_info_schema(cond, tables); partial_cond= make_cond_for_info_schema(cond, tables);
...@@ -2025,13 +2065,10 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond) ...@@ -2025,13 +2065,10 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond)
TABLE *table= tables->table; TABLE *table= tables->table;
DBUG_ENTER("fill_schema_shemata"); DBUG_ENTER("fill_schema_shemata");
get_index_field_values(thd->lex, &idx_field_vals); if (make_db_list(thd, &files, &idx_field_vals,
/* information schema name always is first in list */ &with_i_schema, 1))
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))
DBUG_RETURN(1); DBUG_RETURN(1);
List_iterator_fast<char> it(files); List_iterator_fast<char> it(files);
while ((file_name=it++)) while ((file_name=it++))
{ {
......
...@@ -98,6 +98,21 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) ...@@ -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)) if (wait_if_global_read_lock(thd, 0, 0))
DBUG_RETURN(TRUE); 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)); VOID(pthread_mutex_lock(&LOCK_open));
result= (create ? result= (create ?
table->triggers->create_trigger(thd, tables): table->triggers->create_trigger(thd, tables):
...@@ -109,7 +124,16 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) ...@@ -109,7 +124,16 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
start_waiting_global_read_lock(thd); start_waiting_global_read_lock(thd);
if (!result) 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); DBUG_RETURN(result);
} }
......
...@@ -52,7 +52,15 @@ class Table_triggers_list: public Sql_alloc ...@@ -52,7 +52,15 @@ class Table_triggers_list: public Sql_alloc
FIXME: We should juggle with security context here (because trigger FIXME: We should juggle with security context here (because trigger
should be invoked with creator rights). 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); res= bodies[event][time_type]->execute_function(thd, 0, 0, 0);
reenable_binlog(thd);
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
thd->net.no_send_ok= nsok; thd->net.no_send_ok= nsok;
......
...@@ -443,6 +443,7 @@ Dbtup::commitRecord(Signal* signal, ...@@ -443,6 +443,7 @@ Dbtup::commitRecord(Signal* signal,
saveAttributeMask.bitOR(befOpPtr.p->changeMask); saveAttributeMask.bitOR(befOpPtr.p->changeMask);
befOpPtr.p->changeMask.clear(); befOpPtr.p->changeMask.clear();
befOpPtr.p->changeMask.bitOR(attributeMask); befOpPtr.p->changeMask.bitOR(attributeMask);
befOpPtr.p->gci = regOperPtr->gci;
operPtr.p = befOpPtr.p; operPtr.p = befOpPtr.p;
checkDetachedTriggers(signal, checkDetachedTriggers(signal,
...@@ -480,6 +481,7 @@ Dbtup::commitRecord(Signal* signal, ...@@ -480,6 +481,7 @@ Dbtup::commitRecord(Signal* signal,
befOpPtr.p->pageOffset = befOpPtr.p->pageOffsetC; befOpPtr.p->pageOffset = befOpPtr.p->pageOffsetC;
befOpPtr.p->fragPageId = befOpPtr.p->fragPageIdC; befOpPtr.p->fragPageId = befOpPtr.p->fragPageIdC;
befOpPtr.p->pageIndex = befOpPtr.p->pageIndexC; befOpPtr.p->pageIndex = befOpPtr.p->pageIndexC;
befOpPtr.p->gci = regOperPtr->gci;
operPtr.p = befOpPtr.p; operPtr.p = befOpPtr.p;
checkDetachedTriggers(signal, checkDetachedTriggers(signal,
......
...@@ -463,7 +463,8 @@ ClusterMgr::reportNodeFailed(NodeId nodeId){ ...@@ -463,7 +463,8 @@ ClusterMgr::reportNodeFailed(NodeId nodeId){
} }
theNode.nfCompleteRep = false; theNode.nfCompleteRep = false;
if(noOfAliveNodes == 0){ if(noOfAliveNodes == 0)
{
NFCompleteRep rep; NFCompleteRep rep;
for(Uint32 i = 1; i<MAX_NODES; i++){ for(Uint32 i = 1; i<MAX_NODES; i++){
if(theNodes[i].defined && theNodes[i].nfCompleteRep == false){ if(theNodes[i].defined && theNodes[i].nfCompleteRep == false){
......
...@@ -1162,6 +1162,8 @@ int decimal2bin(decimal_t *from, char *to, int precision, int frac) ...@@ -1162,6 +1162,8 @@ int decimal2bin(decimal_t *from, char *to, int precision, int frac)
isize0=intg0*sizeof(dec1)+dig2bytes[intg0x], isize0=intg0*sizeof(dec1)+dig2bytes[intg0x],
fsize0=frac0*sizeof(dec1)+dig2bytes[frac0x], fsize0=frac0*sizeof(dec1)+dig2bytes[frac0x],
fsize1=frac1*sizeof(dec1)+dig2bytes[frac1x]; fsize1=frac1*sizeof(dec1)+dig2bytes[frac1x];
const int orig_isize0= isize0;
const int orig_fsize0= fsize0;
char *orig_to= to; char *orig_to= to;
buf1= remove_leading_zeroes(from, &from_intg); buf1= remove_leading_zeroes(from, &from_intg);
...@@ -1252,10 +1254,15 @@ int decimal2bin(decimal_t *from, char *to, int precision, int frac) ...@@ -1252,10 +1254,15 @@ int decimal2bin(decimal_t *from, char *to, int precision, int frac)
} }
if (fsize0 > fsize1) if (fsize0 > fsize1)
{ {
while (fsize0-- > fsize1) char *to_end= orig_to + orig_fsize0 + orig_isize0;
while (fsize0-- > fsize1 && to < to_end)
*to++=(uchar)mask; *to++=(uchar)mask;
} }
orig_to[0]^= 0x80; 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; return error;
} }
......
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