Commit 4ec76c1d authored by unknown's avatar unknown

Merge work:/my/mysql into tik.mysql.fi:/home/my/mysql


BitKeeper/etc/logging_ok:
  auto-union
parents 250bb75a fd433598
monty@tik.mysql.fi
sasha@mysql.sashanet.com sasha@mysql.sashanet.com
...@@ -13469,7 +13469,7 @@ to restart @code{mysqld} with @code{--skip-grant-tables} to run ...@@ -13469,7 +13469,7 @@ to restart @code{mysqld} with @code{--skip-grant-tables} to run
* COMMIT:: @code{BEGIN/COMMIT/ROLLBACK} syntax * COMMIT:: @code{BEGIN/COMMIT/ROLLBACK} syntax
* LOCK TABLES:: @code{LOCK TABLES/UNLOCK TABLES} syntax * LOCK TABLES:: @code{LOCK TABLES/UNLOCK TABLES} syntax
* SET OPTION:: @code{SET OPTION} syntax * SET OPTION:: @code{SET OPTION} syntax
* SET TRANSACTION:: * SET TRANSACTION:: @code{SET TRANSACTION} syntax
* GRANT:: @code{GRANT} and @code{REVOKE} syntax * GRANT:: @code{GRANT} and @code{REVOKE} syntax
* CREATE INDEX:: @code{CREATE INDEX} syntax * CREATE INDEX:: @code{CREATE INDEX} syntax
* DROP INDEX:: @code{DROP INDEX} syntax * DROP INDEX:: @code{DROP INDEX} syntax
...@@ -18499,7 +18499,8 @@ row length = 1 ...@@ -18499,7 +18499,8 @@ row length = 1
+ (number of variable-length columns) + (number of variable-length columns)
@end example @end example
@item The @code{table_options} and @code{SELECT} options are only @item
The @code{table_options} and @code{SELECT} options are only
implemented in @strong{MySQL} Version 3.23 and above. implemented in @strong{MySQL} Version 3.23 and above.
The different table types are: The different table types are:
...@@ -18577,6 +18578,10 @@ mysql> CREATE TABLE test (a int not null auto_increment, ...@@ -18577,6 +18578,10 @@ mysql> CREATE TABLE test (a int not null auto_increment,
This will create a @code{MyISAM} table with 3 columns. Note that the This will create a @code{MyISAM} table with 3 columns. Note that the
table will automatically be deleted if any errors occur while copying table will automatically be deleted if any errors occur while copying
data into the table. data into the table.
To ensure that the update log/binary log can be used to re-create the
original tables, @strong{MySQL} will not allow concurrent inserts during
@code{CREATE TABLE .... SELECT}.
@item @item
The @code{RAID_TYPE} option will help you to break the 2G/4G limit for The @code{RAID_TYPE} option will help you to break the 2G/4G limit for
the MyISAM data file (not the index file) on the MyISAM data file (not the index file) on
...@@ -19913,6 +19918,11 @@ sub-select clauses, the situation could easily be very confusing!) ...@@ -19913,6 +19918,11 @@ sub-select clauses, the situation could easily be very confusing!)
@item @item
You can use the C API function @code{mysql_info()} to get information about You can use the C API function @code{mysql_info()} to get information about
the query. @xref{INSERT}. the query. @xref{INSERT}.
@item
To ensure that the update log/binary log can be used to re-create the
original tables, @strong{MySQL} will not allow concurrent inserts during
@code{INSERT .... SELECT}.
@end itemize @end itemize
You can of course also use @code{REPLACE} instead of @code{INSERT} to You can of course also use @code{REPLACE} instead of @code{INSERT} to
...@@ -23861,8 +23871,8 @@ The @code{GEMINI} table type is developed and supported by NuSphere Corporation ...@@ -23861,8 +23871,8 @@ The @code{GEMINI} table type is developed and supported by NuSphere Corporation
(@uref{http://www.nusphere.com}). It features row-level locking, transaction (@uref{http://www.nusphere.com}). It features row-level locking, transaction
support (@code{COMMIT} and @code{ROLLBACK}), and automatic crash recovery. support (@code{COMMIT} and @code{ROLLBACK}), and automatic crash recovery.
@code{GEMINI} tables will be included in the @strong{MySQL} 3.23.35 source @code{GEMINI} tables will be included in some future @strong{MySQL} 3.23.X
distribution. source distribution.
@node GEMINI start, GEMINI features, GEMINI overview, GEMINI @node GEMINI start, GEMINI features, GEMINI overview, GEMINI
@subsection GEMINI startup options @subsection GEMINI startup options
...@@ -41228,7 +41238,7 @@ are supported if the server and tables support them. It is ...@@ -41228,7 +41238,7 @@ are supported if the server and tables support them. It is
thread-safe, and contains a compatibility module for older code thread-safe, and contains a compatibility module for older code
written for the no-longer-maintained MySQLmodule interface. written for the no-longer-maintained MySQLmodule interface.
@item @uref{http://www.mysql.com/Downloads/Contrib/mysql_mex_11.tar.gz, mysql_mex_1_11.tar.gz} @item @uref{http://www.mysql.com/Downloads/Contrib/mysql_mex_12.tar.gz, mysql_mex_1_12.tar.gz}
An interface program for the Matlab program by MathWorks. The interface An interface program for the Matlab program by MathWorks. The interface
is done by Kimmo Uutela and John Fisher (not by Mathworks). is done by Kimmo Uutela and John Fisher (not by Mathworks).
Check @uref{http://boojum.hut.fi/~kuutela/mysqlmex.html,mysqlmex.html} Check @uref{http://boojum.hut.fi/~kuutela/mysqlmex.html,mysqlmex.html}
...@@ -42331,7 +42341,7 @@ users uses this code as the rest of the code and because of this we are ...@@ -42331,7 +42341,7 @@ users uses this code as the rest of the code and because of this we are
not yet 100 % confident in this code. not yet 100 % confident in this code.
@menu @menu
* News-3.23.36:: * News-3.23.36:: Changes in release 3.23.36
* News-3.23.35:: Changes in release 3.23.35 * News-3.23.35:: Changes in release 3.23.35
* News-3.23.34a:: Changes in release 3.23.34a * News-3.23.34a:: Changes in release 3.23.34a
* News-3.23.34:: Changes in release 3.23.34 * News-3.23.34:: Changes in release 3.23.34
...@@ -42377,6 +42387,17 @@ not yet 100 % confident in this code. ...@@ -42377,6 +42387,17 @@ not yet 100 % confident in this code.
Added @code{SET TRANSACTION ISOLATION LEVEL ...} Added @code{SET TRANSACTION ISOLATION LEVEL ...}
@item @item
Added @code{SELECT ... FOR UPDATE}. Added @code{SELECT ... FOR UPDATE}.
@item
Fixed bug where affected rows where not returned when @code{MySQL} was compiled
without transaction support.
@item
Fixed a bug in @code{UPDATE} where keys weren't always used to find the
rows to be updated.
@item
Fixed a bug in @code{CONCAT_WS()} where it returned wrong results.
@item
Changed @code{CREATE ... INSERT} and @code{INSERT ... SELECT} to not
allow concurrent inserts as this could make the binary log hard to repeat.
@end itemize @end itemize
@node News-3.23.35, News-3.23.34a, News-3.23.36, News-3.23.x @node News-3.23.35, News-3.23.34a, News-3.23.36, News-3.23.x
...@@ -34,6 +34,14 @@ concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*') ...@@ -34,6 +34,14 @@ concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*')
:my:sql: :my:sql:
TRIM("foo" FROM "foo") TRIM("foo" FROM "foook") TRIM("foo" FROM "okfoo") TRIM("foo" FROM "foo") TRIM("foo" FROM "foook") TRIM("foo" FROM "okfoo")
ok ok ok ok
concat_ws(', ','monty','was here','again')
monty, was here, again
concat_ws(NULL,'a') concat_ws(',',NULL,'')
NULL
concat_ws(',','',NULL,'a')
a
CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"')
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es') insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es')
this is a test this is a test
replace('aaaa','a','b') replace('aaaa','aa','b') replace('aaaa','a','bb') replace('aaaa','','b') replace('bbbb','a','c') replace('aaaa','a','b') replace('aaaa','aa','b') replace('aaaa','a','bb') replace('aaaa','','b') replace('bbbb','a','c')
...@@ -96,3 +104,9 @@ domain ...@@ -96,3 +104,9 @@ domain
hello.de hello.de
domain domain
test.de test.de
CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter), '"')
"Link";"1";"1";"1";"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"2001-02-28 08:40:16";"20010228084016";"0";"4"
CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"')
"Link";"1";"1";"1";"0";"4"
CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter)
Link";"1";"1";"1";"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"2001-02-28 08:40:16";"20010228084016";"0";"4
...@@ -37,3 +37,5 @@ a ...@@ -37,3 +37,5 @@ a
146 146
place_id shows place_id shows
1 1 1 1
status
1
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
# ----------- # -----------
# Testing string functions # Testing string functions
drop table if exists t1;
select 'hello',"'hello'",'""hello""','''h''e''l''l''o''',"hel""lo",'hel\'lo'; select 'hello',"'hello'",'""hello""','''h''e''l''l''o''',"hel""lo",'hel\'lo';
select 'hello' 'monty'; select 'hello' 'monty';
select length('\n\t\r\b\0\_\%\\'); select length('\n\t\r\b\0\_\%\\');
...@@ -24,6 +26,11 @@ select concat(':',trim(BOTH 'ab' FROM 'ababmyabab'),':',trim(BOTH '*' FROM '***s ...@@ -24,6 +26,11 @@ select concat(':',trim(BOTH 'ab' FROM 'ababmyabab'),':',trim(BOTH '*' FROM '***s
select concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*'),':'); select concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*'),':');
select TRIM("foo" FROM "foo"), TRIM("foo" FROM "foook"), TRIM("foo" FROM "okfoo"); select TRIM("foo" FROM "foo"), TRIM("foo" FROM "foook"), TRIM("foo" FROM "okfoo");
select concat_ws(', ','monty','was here','again');
select concat_ws(NULL,'a'),concat_ws(',',NULL,'');
select concat_ws(',','',NULL,'a');
SELECT CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"');
select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es'); select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es');
select replace('aaaa','a','b'),replace('aaaa','aa','b'),replace('aaaa','a','bb'),replace('aaaa','','b'),replace('bbbb','a','c'); select replace('aaaa','a','b'),replace('aaaa','aa','b'),replace('aaaa','a','bb'),replace('aaaa','','b'),replace('bbbb','a','c');
select replace(concat(lcase(concat('THIS',' ','IS',' ','A',' ')),ucase('false'),' ','test'),'FALSE','REAL') ; select replace(concat(lcase(concat('THIS',' ','IS',' ','A',' ')),ucase('false'),' ','test'),'FALSE','REAL') ;
...@@ -70,3 +77,26 @@ insert into t1 VALUES ("hello.de" ), ("test.de" ); ...@@ -70,3 +77,26 @@ insert into t1 VALUES ("hello.de" ), ("test.de" );
select domain from t1 where concat('@', trim(leading '.' from concat('.', domain))) = '@hello.de'; select domain from t1 where concat('@', trim(leading '.' from concat('.', domain))) = '@hello.de';
select domain from t1 where concat('@', trim(leading '.' from concat('.', domain))) = '@test.de'; select domain from t1 where concat('@', trim(leading '.' from concat('.', domain))) = '@test.de';
drop table t1; drop table t1;
#
# Test bug in concat_ws
#
CREATE TABLE t1 (
id int(10) unsigned NOT NULL,
title varchar(255) default NULL,
prio int(10) unsigned default NULL,
category int(10) unsigned default NULL,
program int(10) unsigned default NULL,
bugdesc text,
created datetime default NULL,
modified timestamp(14) NOT NULL,
bugstatus int(10) unsigned default NULL,
submitter int(10) unsigned default NULL
) TYPE=MyISAM;
INSERT INTO t1 VALUES (1,'Link',1,1,1,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','2001-02-28 08:40:16',20010228084016,0,4);
SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter), '"') FROM t1;
SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"') FROM t1;
SELECT CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified,bugstatus,submitter) FROM t1;
drop table t1;
...@@ -37,3 +37,42 @@ VALUES (1,0,0,0,0,0,0,20000928174434); ...@@ -37,3 +37,42 @@ VALUES (1,0,0,0,0,0,0,20000928174434);
UPDATE t1 SET shows=shows+1,ishows=ishows+1,ushows=ushows+1,clicks=clicks+1,iclicks=iclicks+1,uclicks=uclicks+1 WHERE place_id=1 AND ts>="2000-09-28 00:00:00"; UPDATE t1 SET shows=shows+1,ishows=ishows+1,ushows=ushows+1,clicks=clicks+1,iclicks=iclicks+1,uclicks=uclicks+1 WHERE place_id=1 AND ts>="2000-09-28 00:00:00";
select place_id,shows from t1; select place_id,shows from t1;
drop table t1; drop table t1;
#
# Test bug with update reported by Jan Legenhausen
#
CREATE TABLE t1 (
lfdnr int(10) unsigned NOT NULL default '0',
ticket int(10) unsigned NOT NULL default '0',
client varchar(255) NOT NULL default '',
replyto varchar(255) NOT NULL default '',
subject varchar(100) NOT NULL default '',
timestamp int(10) unsigned NOT NULL default '0',
tstamp timestamp(14) NOT NULL,
status int(3) NOT NULL default '0',
type varchar(15) NOT NULL default '',
assignment int(10) unsigned NOT NULL default '0',
fupcount int(4) unsigned NOT NULL default '0',
parent int(10) unsigned NOT NULL default '0',
activity int(10) unsigned NOT NULL default '0',
priority tinyint(1) unsigned NOT NULL default '1',
cc varchar(255) NOT NULL default '',
bcc varchar(255) NOT NULL default '',
body text NOT NULL,
comment text,
header text,
PRIMARY KEY (lfdnr),
KEY k1 (timestamp),
KEY k2 (type),
KEY k3 (parent),
KEY k4 (assignment),
KEY ticket (ticket)
) TYPE=MyISAM;
INSERT INTO t1 VALUES (773,773,'','','',980257344,20010318180652,0,'Open',10,0,0,0,1,'','','','','');
alter table t1 change lfdnr lfdnr int(10) unsigned default 0 not null auto_increment;
update t1 set status=1 where type='Open';
select status from t1;
drop table t1;
...@@ -472,7 +472,7 @@ int main(int argc,char **argv) ...@@ -472,7 +472,7 @@ int main(int argc,char **argv)
int error; int error;
MY_INIT(argv[0]); MY_INIT(argv[0]);
start_value=5315771L; best_t1=6916833L; best_t2=3813748L; best_type=3; /* mode=5839 add=5 type: 0 */ start_value=318439L; best_t1=7136932L; best_t2=1067561L; best_type=0; /* mode=5413 add=5 type: 0 */
if (get_options(argc,(char **) argv)) if (get_options(argc,(char **) argv))
exit(1); exit(1);
......
...@@ -55,16 +55,17 @@ const char *ha_table_type[] = { ...@@ -55,16 +55,17 @@ const char *ha_table_type[] = {
"MRG_ISAM","MYISAM", "MRG_MYISAM", "BDB", "INNOBASE", "GEMINI", "?", "?",NullS "MRG_ISAM","MYISAM", "MRG_MYISAM", "BDB", "INNOBASE", "GEMINI", "?", "?",NullS
}; };
TYPELIB ha_table_typelib= {array_elements(ha_table_type)-4,"",
ha_table_type+1};
const char *ha_row_type[] = { const char *ha_row_type[] = {
"", "FIXED", "DYNAMIC", "COMPRESSED","?","?","?" "", "FIXED", "DYNAMIC", "COMPRESSED","?","?","?"
}; };
TYPELIB ha_table_typelib= {array_elements(ha_table_type)-4,"",
ha_table_type+1};
const char *tx_isolation_names[] = const char *tx_isolation_names[] =
{ "READ-UNCOMMITTED", "READ-COMMITTED", "REPEATABLE-READ", "SERIALIZABLE"}; { "READ-UNCOMMITTED", "READ-COMMITTED", "REPEATABLE-READ", "SERIALIZABLE",
TYPELIB tx_isolation_typelib= {array_elements(tx_isolation_names),"", NullS};
TYPELIB tx_isolation_typelib= {array_elements(tx_isolation_names)-1,"",
tx_isolation_names}; tx_isolation_names};
/* Use other database handler if databasehandler is not incompiled */ /* Use other database handler if databasehandler is not incompiled */
......
...@@ -223,9 +223,9 @@ String *Item_func_concat_ws::val_str(String *str) ...@@ -223,9 +223,9 @@ String *Item_func_concat_ws::val_str(String *str)
// Skip until non-null and non-empty argument is found. // Skip until non-null and non-empty argument is found.
// If not, return the empty string // If not, return the empty string
for (i=0; for (i=0; i < arg_count; i++)
!(res= args[i]->val_str(str)) || !res->length() && i < arg_count; if ((res= args[i]->val_str(str)) && res->length())
i++) ; break;
if (i == arg_count) if (i == arg_count)
return &empty_string; return &empty_string;
...@@ -242,38 +242,52 @@ String *Item_func_concat_ws::val_str(String *str) ...@@ -242,38 +242,52 @@ String *Item_func_concat_ws::val_str(String *str)
{ // Use old buffer { // Use old buffer
res->append(*sep_str); // res->length() > 0 always res->append(*sep_str); // res->length() > 0 always
res->append(*res2); res->append(*res2);
use_as_buff= &tmp_value;
} }
else if (str->alloced_length() >= else if (str->alloced_length() >=
res->length() + sep_str->length() + res2->length()) res->length() + sep_str->length() + res2->length())
{
/* We have room in str; We can't get any errors here */
if (str == res2)
{ // This is quote uncommon!
str->replace(0,0,*sep_str);
str->replace(0,0,*res);
}
else
{ {
str->copy(*res); str->copy(*res);
str->append(*sep_str); str->append(*sep_str);
str->append(*res2); str->append(*res2);
}
res=str; res=str;
use_as_buff= &tmp_value; use_as_buff= &tmp_value;
} }
else if (res == &tmp_value) else if (res == &tmp_value)
{ {
if ((res->length() && res->append(*sep_str)) || res->append(*res2)) if (res->append(*sep_str) || res->append(*res2))
goto null; // Must be a blob goto null; // Must be a blob
} }
else if (res2 == &tmp_value)
{ // This can happend only 1 time
if (tmp_value.replace(0,0,*sep_str) || tmp_value.replace(0,0,*res))
goto null;
res= &tmp_value;
use_as_buff=str; // Put next arg here
}
else if (tmp_value.is_alloced() && res2->ptr() >= tmp_value.ptr() && else if (tmp_value.is_alloced() && res2->ptr() >= tmp_value.ptr() &&
res2->ptr() <= tmp_value.ptr() + tmp_value.alloced_length()) res2->ptr() < tmp_value.ptr() + tmp_value.alloced_length())
{ {
/* /*
This happens really seldom: This happens really seldom:
In this case res2 is sub string of tmp_value. We will In this case res2 is sub string of tmp_value. We will
now work in place in tmp_value to set it to res | res2 now work in place in tmp_value to set it to res | sep_str | res2
*/ */
/* Chop the last characters in tmp_value that isn't in res2 */ /* Chop the last characters in tmp_value that isn't in res2 */
tmp_value.length((uint32) (res2->ptr() - tmp_value.ptr()) + tmp_value.length((uint32) (res2->ptr() - tmp_value.ptr()) +
res2->length()); res2->length());
/* Place res2 at start of tmp_value, remove chars before res2 */ /* Place res2 at start of tmp_value, remove chars before res2 */
if (res->append(*sep_str))
goto null;
if (tmp_value.replace(0,(uint32) (res2->ptr() - tmp_value.ptr()), if (tmp_value.replace(0,(uint32) (res2->ptr() - tmp_value.ptr()),
*res)) *res) ||
tmp_value.replace(res->length(),0, *sep_str))
goto null; goto null;
res= &tmp_value; res= &tmp_value;
use_as_buff=str; // Put next arg here use_as_buff=str; // Put next arg here
......
...@@ -536,6 +536,7 @@ extern bool low_priority_updates; ...@@ -536,6 +536,7 @@ extern bool low_priority_updates;
extern bool opt_sql_bin_update, opt_safe_show_db; extern bool opt_sql_bin_update, opt_safe_show_db;
extern char language[LIBLEN],reg_ext[FN_EXTLEN],blob_newline; extern char language[LIBLEN],reg_ext[FN_EXTLEN],blob_newline;
extern const char **errmesg; /* Error messages */ extern const char **errmesg; /* Error messages */
extern const char *default_tx_isolation_name;
extern String empty_string; extern String empty_string;
extern struct show_var_st init_vars[]; extern struct show_var_st init_vars[];
extern struct show_var_st status_vars[]; extern struct show_var_st status_vars[];
......
...@@ -281,7 +281,9 @@ char server_version[SERVER_VERSION_LENGTH]=MYSQL_SERVER_VERSION; ...@@ -281,7 +281,9 @@ char server_version[SERVER_VERSION_LENGTH]=MYSQL_SERVER_VERSION;
const char *first_keyword="first"; const char *first_keyword="first";
const char **errmesg; /* Error messages */ const char **errmesg; /* Error messages */
const char *myisam_recover_options_str="OFF"; const char *myisam_recover_options_str="OFF";
const char *default_tx_isolation_name;
enum_tx_isolation default_tx_isolation=ISO_READ_COMMITTED; enum_tx_isolation default_tx_isolation=ISO_READ_COMMITTED;
#ifdef HAVE_GEMINI_DB #ifdef HAVE_GEMINI_DB
const char *gemini_recovery_options_str="FULL"; const char *gemini_recovery_options_str="FULL";
#endif #endif
...@@ -2819,6 +2821,7 @@ struct show_var_st init_vars[]= { ...@@ -2819,6 +2821,7 @@ struct show_var_st init_vars[]= {
{"thread_concurrency", (char*) &concurrency, SHOW_LONG}, {"thread_concurrency", (char*) &concurrency, SHOW_LONG},
#endif #endif
{"thread_stack", (char*) &thread_stack, SHOW_LONG}, {"thread_stack", (char*) &thread_stack, SHOW_LONG},
{"transaction_isolation", (char*) &default_tx_isolation_name, SHOW_CHAR_PTR},
#ifdef HAVE_TZNAME #ifdef HAVE_TZNAME
{"timezone", time_zone, SHOW_CHAR}, {"timezone", time_zone, SHOW_CHAR},
#endif #endif
...@@ -3672,6 +3675,7 @@ static void get_options(int argc,char **argv) ...@@ -3672,6 +3675,7 @@ static void get_options(int argc,char **argv)
} }
fix_paths(); fix_paths();
default_table_type_name=ha_table_typelib.type_names[default_table_type-1]; default_table_type_name=ha_table_typelib.type_names[default_table_type-1];
default_tx_isolation_name=tx_isolation_typelib.type_names[default_tx_isolation];
} }
......
...@@ -168,7 +168,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields, ...@@ -168,7 +168,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list, List<Item> &fields,
table->time_stamp=save_time_stamp; table->time_stamp=save_time_stamp;
goto abort; goto abort;
} }
if (setup_tables(table_list) || setup_fields(thd,table_list,*values,0,0)) if (setup_fields(thd,table_list,*values,0,0))
{ {
table->time_stamp=save_time_stamp; table->time_stamp=save_time_stamp;
goto abort; goto abort;
......
...@@ -1266,8 +1266,11 @@ mysql_execute_command(void) ...@@ -1266,8 +1266,11 @@ mysql_execute_command(void)
} }
if (tables->next) if (tables->next)
{ {
TABLE_LIST *table;
if (check_table_access(thd, SELECT_ACL, tables->next)) if (check_table_access(thd, SELECT_ACL, tables->next))
goto error; // Error message is given goto error; // Error message is given
for (table = tables->next ; table ; table=table->next)
table->lock_type= lex->lock_option;
} }
thd->offset_limit=lex->offset_limit; thd->offset_limit=lex->offset_limit;
thd->select_limit=lex->select_limit+lex->offset_limit; thd->select_limit=lex->select_limit+lex->offset_limit;
...@@ -1539,6 +1542,7 @@ mysql_execute_command(void) ...@@ -1539,6 +1542,7 @@ mysql_execute_command(void)
{ {
// Check that we have modify privileges for the first table and // Check that we have modify privileges for the first table and
// select privileges for the rest // select privileges for the rest
{
uint privilege= (lex->sql_command == SQLCOM_INSERT_SELECT ? uint privilege= (lex->sql_command == SQLCOM_INSERT_SELECT ?
INSERT_ACL : INSERT_ACL | UPDATE_ACL | DELETE_ACL); INSERT_ACL : INSERT_ACL | UPDATE_ACL | DELETE_ACL);
TABLE_LIST *save_next=tables->next; TABLE_LIST *save_next=tables->next;
...@@ -1550,6 +1554,7 @@ mysql_execute_command(void) ...@@ -1550,6 +1554,7 @@ mysql_execute_command(void)
tables->next=save_next; tables->next=save_next;
if ((res=check_table_access(thd, SELECT_ACL, save_next))) if ((res=check_table_access(thd, SELECT_ACL, save_next)))
goto error; goto error;
}
select_result *result; select_result *result;
thd->offset_limit=lex->offset_limit; thd->offset_limit=lex->offset_limit;
...@@ -1563,6 +1568,11 @@ mysql_execute_command(void) ...@@ -1563,6 +1568,11 @@ mysql_execute_command(void)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
tables->lock_type=TL_WRITE; // update first table tables->lock_type=TL_WRITE; // update first table
{
TABLE_LIST *table;
for (table = tables->next ; table ; table=table->next)
table->lock_type= lex->lock_option;
}
if (!(res=open_and_lock_tables(thd,tables))) if (!(res=open_and_lock_tables(thd,tables)))
{ {
if ((result=new select_insert(tables->table,&lex->field_list, if ((result=new select_insert(tables->table,&lex->field_list,
......
...@@ -699,6 +699,7 @@ create3: ...@@ -699,6 +699,7 @@ create3:
/* empty */ {} /* empty */ {}
| opt_duplicate opt_as SELECT_SYM | opt_duplicate opt_as SELECT_SYM
{ {
Lex->lock_option= TL_READ_NO_INSERT;
mysql_init_select(Lex); mysql_init_select(Lex);
} }
select_options select_item_list opt_select_from {} select_options select_item_list opt_select_from {}
...@@ -781,7 +782,7 @@ raid_types: ...@@ -781,7 +782,7 @@ raid_types:
opt_select_from: opt_select_from:
/* empty */ /* empty */
| select_from | select_from select_lock_type
udf_func_type: udf_func_type:
/* empty */ { $$ = UDFTYPE_FUNCTION; } /* empty */ { $$ = UDFTYPE_FUNCTION; }
...@@ -2071,9 +2072,10 @@ insert_values: ...@@ -2071,9 +2072,10 @@ insert_values:
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command = (lex->sql_command == SQLCOM_INSERT ? lex->sql_command = (lex->sql_command == SQLCOM_INSERT ?
SQLCOM_INSERT_SELECT : SQLCOM_REPLACE_SELECT); SQLCOM_INSERT_SELECT : SQLCOM_REPLACE_SELECT);
lex->lock_option= TL_READ_NO_INSERT;
mysql_init_select(lex); mysql_init_select(lex);
} }
select_options select_item_list select_from {} select_options select_item_list select_from select_lock_type {}
values_list: values_list:
values_list ',' no_braces values_list ',' no_braces
...@@ -2783,6 +2785,7 @@ set_isolation: ...@@ -2783,6 +2785,7 @@ set_isolation:
if (check_process_priv()) if (check_process_priv())
YYABORT; YYABORT;
default_tx_isolation= $2; default_tx_isolation= $2;
default_tx_isolation_name=tx_isolation_typelib.type_names[default_tx_isolation];
} }
| SESSION_SYM tx_isolation | SESSION_SYM tx_isolation
{ current_thd->session_tx_isolation= Lex->tx_isolation= $2; } { current_thd->session_tx_isolation= Lex->tx_isolation= $2; }
......
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