Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
d7a63c0f
Commit
d7a63c0f
authored
Jan 15, 2007
by
kostja@bodhi.local
Browse files
Options
Browse Files
Download
Plain Diff
Manual merge.
parents
7c298786
92f1c762
Changes
14
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
686 additions
and
254 deletions
+686
-254
mysql-test/r/ps.result
mysql-test/r/ps.result
+117
-0
mysql-test/r/sp.result
mysql-test/r/sp.result
+17
-0
mysql-test/t/ps.test
mysql-test/t/ps.test
+142
-1
mysql-test/t/sp.test
mysql-test/t/sp.test
+28
-0
sql/mysql_priv.h
sql/mysql_priv.h
+6
-10
sql/sql_class.h
sql/sql_class.h
+11
-10
sql/sql_insert.cc
sql/sql_insert.cc
+8
-9
sql/sql_lex.cc
sql/sql_lex.cc
+11
-0
sql/sql_lex.h
sql/sql_lex.h
+46
-8
sql/sql_list.h
sql/sql_list.h
+59
-9
sql/sql_parse.cc
sql/sql_parse.cc
+119
-110
sql/sql_show.cc
sql/sql_show.cc
+1
-1
sql/sql_table.cc
sql/sql_table.cc
+96
-74
sql/sql_yacc.yy
sql/sql_yacc.yy
+25
-22
No files found.
mysql-test/r/ps.result
View file @
d7a63c0f
...
...
@@ -1055,6 +1055,73 @@ EXECUTE stmt USING @a;
0 0
DEALLOCATE PREPARE stmt;
DROP TABLE t1;
DROP TABLE IF EXISTS t1, t2;
CREATE TABLE t1 (i INT);
PREPARE st_19182
FROM "CREATE TABLE t2 (i INT, j INT, KEY (i), KEY(j)) SELECT i FROM t1";
EXECUTE st_19182;
DESC t2;
Field Type Null Key Default Extra
j int(11) YES MUL NULL
i int(11) YES MUL NULL
DROP TABLE t2;
EXECUTE st_19182;
DESC t2;
Field Type Null Key Default Extra
j int(11) YES MUL NULL
i int(11) YES MUL NULL
DEALLOCATE PREPARE st_19182;
DROP TABLE t2, t1;
drop database if exists mysqltest;
drop table if exists t1, t2;
create database mysqltest character set utf8;
prepare stmt1 from "create table mysqltest.t1 (c char(10))";
prepare stmt2 from "create table mysqltest.t2 select 'test'";
execute stmt1;
execute stmt2;
show create table mysqltest.t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c` char(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
show create table mysqltest.t2;
Table Create Table
t2 CREATE TABLE `t2` (
`test` varchar(4) character set latin1 NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8
drop table mysqltest.t1;
drop table mysqltest.t2;
alter database mysqltest character set latin1;
execute stmt1;
execute stmt2;
show create table mysqltest.t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c` char(10) character set utf8 default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
show create table mysqltest.t2;
Table Create Table
t2 CREATE TABLE `t2` (
`test` varchar(4) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop database mysqltest;
deallocate prepare stmt1;
deallocate prepare stmt2;
execute stmt;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c` char(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
execute stmt;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c` char(10) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
deallocate prepare stmt;
End of 4.1 tests.
create table t1 (a varchar(20));
insert into t1 values ('foo');
...
...
@@ -1536,4 +1603,54 @@ a
2
DEALLOCATE PREPARE stmt;
DROP TABLE t1,t2;
drop table if exists t1;
create table t1 (s1 char(20));
prepare stmt from "alter table t1 modify s1 int";
execute stmt;
execute stmt;
drop table t1;
deallocate prepare stmt;
drop table if exists t1;
create table t1 (a int, b int);
prepare s_6895 from "alter table t1 drop column b";
execute s_6895;
show columns from t1;
Field Type Null Key Default Extra
a int(11) YES NULL
drop table t1;
create table t1 (a int, b int);
execute s_6895;
show columns from t1;
Field Type Null Key Default Extra
a int(11) YES NULL
drop table t1;
create table t1 (a int, b int);
execute s_6895;
show columns from t1;
Field Type Null Key Default Extra
a int(11) YES NULL
deallocate prepare s_6895;
drop table t1;
create table t1 (i int primary key auto_increment) comment='comment for table t1';
create table t2 (i int, j int, k int);
prepare stmt from "alter table t1 auto_increment=100";
execute stmt;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`i` int(11) NOT NULL auto_increment,
PRIMARY KEY (`i`)
) ENGINE=MyISAM AUTO_INCREMENT=100 DEFAULT CHARSET=latin1 COMMENT='comment for table t1'
flush tables;
select * from t2;
i j k
execute stmt;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`i` int(11) NOT NULL auto_increment,
PRIMARY KEY (`i`)
) ENGINE=MyISAM AUTO_INCREMENT=100 DEFAULT CHARSET=latin1 COMMENT='comment for table t1'
deallocate prepare stmt;
drop table t1, t2;
End of 5.0 tests.
mysql-test/r/sp.result
View file @
d7a63c0f
...
...
@@ -5626,6 +5626,23 @@ Called B
Called B
drop procedure proc_21462_a|
drop procedure proc_21462_b|
drop table if exists t3|
drop procedure if exists proc_bug19733|
create table t3 (s1 int)|
create procedure proc_bug19733()
begin
declare v int default 0;
while v < 100 do
create index i on t3 (s1);
drop index i on t3;
set v = v + 1;
end while;
end|
call proc_bug19733()|
call proc_bug19733()|
call proc_bug19733()|
drop procedure proc_bug19733|
drop table t3|
End of 5.0 tests
DROP TABLE IF EXISTS bug23760|
DROP TABLE IF EXISTS bug23760_log|
...
...
mysql-test/t/ps.test
View file @
d7a63c0f
...
...
@@ -1106,10 +1106,80 @@ EXECUTE stmt USING @a;
DEALLOCATE
PREPARE
stmt
;
DROP
TABLE
t1
;
#
# Bug#19182: CREATE TABLE bar (m INT) SELECT n FROM foo; doesn't work
# from stored procedure.
#
# The cause of a bug was that cached LEX::create_list was modified,
# and then together with LEX::key_list was reset.
#
--
disable_warnings
DROP
TABLE
IF
EXISTS
t1
,
t2
;
--
enable_warnings
--
echo
End
of
4.1
tests
.
CREATE
TABLE
t1
(
i
INT
);
PREPARE
st_19182
FROM
"CREATE TABLE t2 (i INT, j INT, KEY (i), KEY(j)) SELECT i FROM t1"
;
EXECUTE
st_19182
;
DESC
t2
;
DROP
TABLE
t2
;
# Check that on second execution we don't loose 'j' column and the keys
# on 'i' and 'j' columns.
EXECUTE
st_19182
;
DESC
t2
;
DEALLOCATE
PREPARE
st_19182
;
DROP
TABLE
t2
,
t1
;
#
# Bug #22060 "ALTER TABLE x AUTO_INCREMENT=y in SP crashes server"
#
# Code which implemented CREATE/ALTER TABLE and CREATE DATABASE
# statement modified HA_CREATE_INFO structure in LEX, making these
# statements PS/SP-unsafe (their re-execution might have resulted
# in incorrect results).
#
--
disable_warnings
drop
database
if
exists
mysqltest
;
drop
table
if
exists
t1
,
t2
;
--
enable_warnings
# CREATE TABLE and CREATE TABLE ... SELECT
create
database
mysqltest
character
set
utf8
;
prepare
stmt1
from
"create table mysqltest.t1 (c char(10))"
;
prepare
stmt2
from
"create table mysqltest.t2 select 'test'"
;
execute
stmt1
;
execute
stmt2
;
show
create
table
mysqltest
.
t1
;
show
create
table
mysqltest
.
t2
;
drop
table
mysqltest
.
t1
;
drop
table
mysqltest
.
t2
;
alter
database
mysqltest
character
set
latin1
;
execute
stmt1
;
execute
stmt2
;
show
create
table
mysqltest
.
t1
;
show
create
table
mysqltest
.
t2
;
drop
database
mysqltest
;
deallocate
prepare
stmt1
;
deallocate
prepare
stmt2
;
# CREATE TABLE with DATA DIRECTORY option
--
disable_query_log
eval
prepare
stmt
from
"create table t1 (c char(10)) data directory='
$MYSQLTEST_VARDIR
/tmp'"
;
--
enable_query_log
execute
stmt
;
--
replace_result
$MYSQLTEST_VARDIR
MYSQLTEST_VARDIR
show
create
table
t1
;
drop
table
t1
;
execute
stmt
;
--
replace_result
$MYSQLTEST_VARDIR
MYSQLTEST_VARDIR
show
create
table
t1
;
drop
table
t1
;
deallocate
prepare
stmt
;
--
echo
End
of
4.1
tests
.
############################# 5.0 tests start ################################
#
...
...
@@ -1585,5 +1655,76 @@ EXECUTE stmt USING @arg;
DEALLOCATE
PREPARE
stmt
;
DROP
TABLE
t1
,
t2
;
#
# Bug#4968 "Stored procedure crash if cursor opened on altered table"
# The bug is not repeatable any more after the fix for
# Bug#15217 "Bug #15217 Using a SP cursor on a table created with PREPARE
# fails with weird error", however ALTER TABLE is not re-execution friendly
# and that caused a valgrind warning. Check that the warning is gone.
#
--
disable_warnings
drop
table
if
exists
t1
;
--
enable_warnings
create
table
t1
(
s1
char
(
20
));
prepare
stmt
from
"alter table t1 modify s1 int"
;
execute
stmt
;
execute
stmt
;
drop
table
t1
;
deallocate
prepare
stmt
;
#
# Bug#6895 "Prepared Statements: ALTER TABLE DROP COLUMN does nothing"
#
--
disable_warnings
drop
table
if
exists
t1
;
--
enable_warnings
create
table
t1
(
a
int
,
b
int
);
prepare
s_6895
from
"alter table t1 drop column b"
;
execute
s_6895
;
show
columns
from
t1
;
drop
table
t1
;
create
table
t1
(
a
int
,
b
int
);
execute
s_6895
;
show
columns
from
t1
;
drop
table
t1
;
create
table
t1
(
a
int
,
b
int
);
execute
s_6895
;
show
columns
from
t1
;
deallocate
prepare
s_6895
;
drop
table
t1
;
#
# Bug #22060 "ALTER TABLE x AUTO_INCREMENT=y in SP crashes server"
#
# 5.0 part of the test.
#
# ALTER TABLE
create
table
t1
(
i
int
primary
key
auto_increment
)
comment
=
'comment for table t1'
;
create
table
t2
(
i
int
,
j
int
,
k
int
);
prepare
stmt
from
"alter table t1 auto_increment=100"
;
execute
stmt
;
show
create
table
t1
;
# Let us trash table-cache's memory
flush
tables
;
select
*
from
t2
;
execute
stmt
;
show
create
table
t1
;
deallocate
prepare
stmt
;
drop
table
t1
,
t2
;
# 5.1 part of the test.
# CREATE DATABASE
#set @old_character_set_server= @@character_set_server;
#set @@character_set_server= latin1;
#prepare stmt from "create database mysqltest";
#execute stmt;
#show create database mysqltest;
#drop database mysqltest;
#set @@character_set_server= utf8;
#execute stmt;
#show create database mysqltest;
#drop database mysqltest;
#deallocate prepare stmt;
#set @@character_set_server= @old_character_set_server;
--
echo
End
of
5.0
tests
.
mysql-test/t/sp.test
View file @
d7a63c0f
...
...
@@ -6587,6 +6587,34 @@ call proc_21462_b(1)|
drop procedure proc_21462_a|
drop procedure proc_21462_b|
#
# Bug#19733 "Repeated alter, or repeated create/drop, fails"
# Check that CREATE/DROP INDEX is re-execution friendly.
#
--disable_warnings
drop table if exists t3|
drop procedure if exists proc_bug19733|
--enable_warnings
create table t3 (s1 int)|
create procedure proc_bug19733()
begin
declare v int default 0;
while v < 100 do
create index i on t3 (s1);
drop index i on t3;
set v = v + 1;
end while;
end|
call proc_bug19733()|
call proc_bug19733()|
call proc_bug19733()|
drop procedure proc_bug19733|
drop table t3|
--echo End of 5.0 tests
...
...
sql/mysql_priv.h
View file @
d7a63c0f
...
...
@@ -773,17 +773,15 @@ int prepare_create_field(create_field *sql_field,
uint
table_flags
);
bool
mysql_create_table
(
THD
*
thd
,
const
char
*
db
,
const
char
*
table_name
,
HA_CREATE_INFO
*
create_info
,
List
<
create_field
>
&
fields
,
List
<
Key
>
&
keys
,
Alter_info
*
alter_info
,
bool
tmp_table
,
uint
select_field_count
);
bool
mysql_alter_table
(
THD
*
thd
,
char
*
new_db
,
char
*
new_name
,
HA_CREATE_INFO
*
create_info
,
TABLE_LIST
*
table_list
,
List
<
create_field
>
&
fields
,
List
<
Key
>
&
keys
,
uint
order_num
,
ORDER
*
order
,
bool
ignore
,
ALTER_INFO
*
alter_info
,
bool
do_send_ok
);
bool
mysql_recreate_table
(
THD
*
thd
,
TABLE_LIST
*
table_list
,
bool
do_send_ok
);
Alter_info
*
alter_info
,
uint
order_num
,
ORDER
*
order
,
bool
ignore
);
bool
mysql_recreate_table
(
THD
*
thd
,
TABLE_LIST
*
table_list
);
bool
mysql_create_like_table
(
THD
*
thd
,
TABLE_LIST
*
table
,
HA_CREATE_INFO
*
create_info
,
Table_ident
*
src_table
);
...
...
@@ -792,9 +790,6 @@ bool mysql_rename_table(enum db_type base,
const
char
*
old_name
,
const
char
*
new_db
,
const
char
*
new_name
);
bool
mysql_create_index
(
THD
*
thd
,
TABLE_LIST
*
table_list
,
List
<
Key
>
&
keys
);
bool
mysql_drop_index
(
THD
*
thd
,
TABLE_LIST
*
table_list
,
ALTER_INFO
*
alter_info
);
bool
mysql_prepare_update
(
THD
*
thd
,
TABLE_LIST
*
table_list
,
Item
**
conds
,
uint
order_num
,
ORDER
*
order
);
int
mysql_update
(
THD
*
thd
,
TABLE_LIST
*
tables
,
List
<
Item
>
&
fields
,
...
...
@@ -896,7 +891,8 @@ int get_quote_char_for_identifier(THD *thd, const char *name, uint length);
void
mysqld_list_fields
(
THD
*
thd
,
TABLE_LIST
*
table
,
const
char
*
wild
);
int
mysqld_dump_create_info
(
THD
*
thd
,
TABLE_LIST
*
table_list
,
int
fd
);
bool
mysqld_show_create
(
THD
*
thd
,
TABLE_LIST
*
table_list
);
bool
mysqld_show_create_db
(
THD
*
thd
,
char
*
dbname
,
HA_CREATE_INFO
*
create
);
bool
mysqld_show_create_db
(
THD
*
thd
,
char
*
dbname
,
const
HA_CREATE_INFO
*
create
);
void
mysqld_list_processes
(
THD
*
thd
,
const
char
*
user
,
bool
verbose
);
int
mysqld_show_status
(
THD
*
thd
);
...
...
sql/sql_class.h
View file @
d7a63c0f
...
...
@@ -1839,21 +1839,22 @@ class select_insert :public select_result_interceptor {
class
select_create
:
public
select_insert
{
ORDER
*
group
;
TABLE_LIST
*
create_table
;
List
<
create_field
>
*
extra_fields
;
List
<
Key
>
*
keys
;
HA_CREATE_INFO
*
create_info
;
Alter_info
*
alter_info
;
MYSQL_LOCK
*
lock
;
Field
**
field
;
public:
select_create
(
TABLE_LIST
*
table
,
HA_CREATE_INFO
*
create_info_par
,
List
<
create_field
>
&
fields_par
,
List
<
Key
>
&
keys_par
,
List
<
Item
>
&
select_fields
,
enum_duplicates
duplic
,
bool
ignore
)
:
select_insert
(
NULL
,
NULL
,
&
select_fields
,
0
,
0
,
duplic
,
ignore
),
create_table
(
table
),
extra_fields
(
&
fields_par
),
keys
(
&
keys_par
),
create_info
(
create_info_par
),
select_create
(
TABLE_LIST
*
table
,
HA_CREATE_INFO
*
create_info_arg
,
Alter_info
*
alter_info_arg
,
List
<
Item
>
&
select_fields
,
enum_duplicates
duplic
,
bool
ignore
)
:
select_insert
(
NULL
,
NULL
,
&
select_fields
,
0
,
0
,
duplic
,
ignore
),
create_table
(
table
),
create_info
(
create_info_arg
),
alter_info
(
alter_info_arg
),
lock
(
0
)
{}
{}
int
prepare
(
List
<
Item
>
&
list
,
SELECT_LEX_UNIT
*
u
);
void
store_values
(
List
<
Item
>
&
values
);
void
send_error
(
uint
errcode
,
const
char
*
err
);
...
...
sql/sql_insert.cc
View file @
d7a63c0f
...
...
@@ -2616,11 +2616,11 @@ bool select_insert::send_eof()
temporary table flag)
create_table in Pointer to TABLE_LIST object providing database
and name for table to be created or to be open
extra_fields in/out Initial list of fields for table to be created
keys in List of keys for table
to be created
alter_info in/out Initial list of columns and indexes for the table
to be created
items in List of items which should be used to produce rest
of fields for the table (corresponding fields will
be added to the end of
'extra_fields'
list)
be added to the end of
alter_info->create_
list)
lock out Pointer to the MYSQL_LOCK object for table created
(open) will be returned in this parameter. Since
this table is not included in THD::lock caller is
...
...
@@ -2642,8 +2642,8 @@ bool select_insert::send_eof()
static
TABLE
*
create_table_from_items
(
THD
*
thd
,
HA_CREATE_INFO
*
create_info
,
TABLE_LIST
*
create_table
,
List
<
create_field
>
*
extra_fields
,
List
<
Key
>
*
keys
,
List
<
Item
>
*
items
,
Alter_info
*
alter_info
,
List
<
Item
>
*
items
,
MYSQL_LOCK
**
lock
)
{
TABLE
tmp_table
;
// Used during 'create_field()'
...
...
@@ -2682,7 +2682,7 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
DBUG_RETURN
(
0
);
if
(
item
->
maybe_null
)
cr_field
->
flags
&=
~
NOT_NULL_FLAG
;
extra_fields
->
push_back
(
cr_field
);
alter_info
->
create_list
.
push_back
(
cr_field
);
}
/*
create and lock table
...
...
@@ -2703,8 +2703,7 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info,
{
tmp_disable_binlog
(
thd
);
if
(
!
mysql_create_table
(
thd
,
create_table
->
db
,
create_table
->
table_name
,
create_info
,
*
extra_fields
,
*
keys
,
0
,
select_field_count
))
create_info
,
alter_info
,
0
,
select_field_count
))
{
/*
If we are here in prelocked mode we either create temporary table
...
...
@@ -2760,7 +2759,7 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
unit
=
u
;
table
=
create_table_from_items
(
thd
,
create_info
,
create_table
,
extra_fields
,
keys
,
&
values
,
&
lock
);
alter_info
,
&
values
,
&
lock
);
if
(
!
table
)
DBUG_RETURN
(
-
1
);
// abort() deletes table
...
...
sql/sql_lex.cc
View file @
d7a63c0f
...
...
@@ -1054,6 +1054,17 @@ int MYSQLlex(void *arg, void *yythd)
}
Alter_info
::
Alter_info
(
const
Alter_info
&
rhs
,
MEM_ROOT
*
mem_root
)
:
drop_list
(
rhs
.
drop_list
,
mem_root
),
alter_list
(
rhs
.
alter_list
,
mem_root
),
key_list
(
rhs
.
key_list
,
mem_root
),
create_list
(
rhs
.
create_list
,
mem_root
),
flags
(
rhs
.
flags
),
keys_onoff
(
rhs
.
keys_onoff
),
tablespace_op
(
rhs
.
tablespace_op
)
{}
/*
Skip comment in the end of statement.
...
...
sql/sql_lex.h
View file @
d7a63c0f
...
...
@@ -686,18 +686,58 @@ typedef class st_select_lex SELECT_LEX;
#define ALTER_CONVERT 1024
#define ALTER_FORCE 2048
typedef
struct
st_alter_info
/**
@brief Parsing data for CREATE or ALTER TABLE.
This structure contains a list of columns or indexes to be created,
altered or dropped.
*/
class
Alter_info
{
public:
List
<
Alter_drop
>
drop_list
;
List
<
Alter_column
>
alter_list
;
List
<
Key
>
key_list
;
List
<
create_field
>
create_list
;
uint
flags
;
enum
enum_enable_or_disable
keys_onoff
;
enum
tablespace_op_type
tablespace_op
;
st_alter_info
(){
clear
();}
void
clear
(){
keys_onoff
=
LEAVE_AS_IS
;
tablespace_op
=
NO_TABLESPACE_OP
;}
void
reset
(){
drop_list
.
empty
();
alter_list
.
empty
();
clear
();}
}
ALTER_INFO
;
Alter_info
()
:
flags
(
0
),
keys_onoff
(
LEAVE_AS_IS
),
tablespace_op
(
NO_TABLESPACE_OP
)
{}
void
reset
()
{
drop_list
.
empty
();
alter_list
.
empty
();
key_list
.
empty
();
create_list
.
empty
();
flags
=
0
;
keys_onoff
=
LEAVE_AS_IS
;
tablespace_op
=
NO_TABLESPACE_OP
;
}
/**
Construct a copy of this object to be used for mysql_alter_table
and mysql_create_table. Historically, these two functions modify
their Alter_info arguments. This behaviour breaks re-execution of
prepared statements and stored procedures and is compensated by
always supplying a copy of Alter_info to these functions.
The constructed copy still shares key Key, Alter_drop, create_field
and Alter_column elements of the lists - these structures are not
modified and thus are not copied.
@note You need to use check thd->is_fatal_error for out
of memory condition after calling this function.
*/
Alter_info
(
const
Alter_info
&
rhs
,
MEM_ROOT
*
mem_root
);
private:
Alter_info
&
operator
=
(
const
Alter_info
&
rhs
);
// not implemented
Alter_info
(
const
Alter_info
&
rhs
);
// not implemented
};
struct
st_sp_chistics
{
...
...
@@ -883,8 +923,6 @@ typedef struct st_lex : public Query_tables_list
List
<
String
>
interval_list
;
List
<
LEX_USER
>
users_list
;
List
<
LEX_COLUMN
>
columns
;
List
<
Key
>
key_list
;
List
<
create_field
>
create_list
;
List
<
Item
>
*
insert_list
,
field_list
,
value_list
,
update_list
;
List
<
List_item
>
many_values
;
List
<
set_var_base
>
var_list
;
...
...
@@ -977,7 +1015,7 @@ typedef struct st_lex : public Query_tables_list
bool
safe_to_cache_query
;
bool
subqueries
,
ignore
;
st_parsing_options
parsing_options
;
A
LTER_INFO
alter_info
;
A
lter_info
alter_info
;
/* Prepared statements SQL syntax:*/
LEX_STRING
prepared_stmt_name
;
/* Statement name (in all queries) */
/*
...
...
sql/sql_list.h
View file @
d7a63c0f
...
...
@@ -61,21 +61,24 @@ public:
pointer.
*/
class
list_node
:
public
Sql_alloc
/**
list_node - a node of a single-linked list.
@note We never call a destructor for instances of this class.
*/
struct
list_node
:
public
Sql_alloc
{
public:
list_node
*
next
;
void
*
info
;
list_node
(
void
*
info_par
,
list_node
*
next_par
)
:
next
(
next_par
),
info
(
info_par
)
{}
{}
list_node
()
/* For end_of_list */
{
info
=
0
;
next
=
this
;
}
friend
class
base_list
;
friend
class
base_list_iterator
;
{
info
=
0
;
next
=
this
;
}
};
...
...
@@ -91,12 +94,57 @@ public:
inline
void
empty
()
{
elements
=
0
;
first
=
&
end_of_list
;
last
=&
first
;}
inline
base_list
()
{
empty
();
}
/**
This is a shallow copy constructor that implicitly passes the ownership
from the source list to the new instance. The old instance is not
updated, so both objects end up sharing the same nodes. If one of
the instances then adds or removes a node, the other becomes out of
sync ('last' pointer), while still operational. Some old code uses and
relies on this behaviour. This logic is quite tricky: please do not use
it in any new code.
*/
inline
base_list
(
const
base_list
&
tmp
)
:
Sql_alloc
()
{
elements
=
tmp
.
elements
;
first
=
tmp
.
first
;
last
=
elements
?
tmp
.
last
:
&
first
;
}
/**
Construct a deep copy of the argument in memory root mem_root.
The elements themselves are copied by pointer.
*/
inline
base_list
(
const
base_list
&
rhs
,
MEM_ROOT
*
mem_root
)
{
if
(
rhs
.
elements
)
{
/*
It's okay to allocate an array of nodes at once: we never
call a destructor for list_node objects anyway.
*/
first
=
(
list_node
*
)
alloc_root
(
mem_root
,
sizeof
(
list_node
)
*
rhs
.
elements
);
if
(
first
)
{
elements
=
rhs
.
elements
;
list_node
*
dst
=
first
;
list_node
*
src
=
rhs
.
first
;
for
(;
dst
<
first
+
elements
-
1
;
dst
++
,
src
=
src
->
next
)
{
dst
->
info
=
src
->
info
;
dst
->
next
=
dst
+
1
;
}
/* Copy the last node */
dst
->
info
=
src
->
info
;
dst
->
next
=
&
end_of_list
;
/* Setup 'last' member */
last
=
&
dst
->
next
;
return
;
}
}
elements
=
0
;
first
=
&
end_of_list
;
last
=
&
first
;
}
inline
base_list
(
bool
error
)
{
}
inline
bool
push_back
(
void
*
info
)
{
...
...
@@ -347,6 +395,8 @@ template <class T> class List :public base_list
public:
inline
List
()
:
base_list
()
{}
inline
List
(
const
List
<
T
>
&
tmp
)
:
base_list
(
tmp
)
{}
inline
List
(
const
List
<
T
>
&
tmp
,
MEM_ROOT
*
mem_root
)
:
base_list
(
tmp
,
mem_root
)
{}
inline
bool
push_back
(
T
*
a
)
{
return
base_list
::
push_back
(
a
);
}
inline
bool
push_back
(
T
*
a
,
MEM_ROOT
*
mem_root
)
{
return
base_list
::
push_back
(
a
,
mem_root
);
}
...
...
sql/sql_parse.cc
View file @
d7a63c0f
This diff is collapsed.
Click to expand it.
sql/sql_show.cc
View file @
d7a63c0f
...
...
@@ -460,7 +460,7 @@ mysqld_show_create(THD *thd, TABLE_LIST *table_list)
}
bool
mysqld_show_create_db
(
THD
*
thd
,
char
*
dbname
,
HA_CREATE_INFO
*
create_info
)
const
HA_CREATE_INFO
*
create_info
)
{
Security_context
*
sctx
=
thd
->
security_ctx
;
char
buff
[
2048
];
...
...
sql/sql_table.cc
View file @
d7a63c0f
This diff is collapsed.
Click to expand it.
sql/sql_yacc.yy
View file @
d7a63c0f
...
...
@@ -1352,8 +1352,7 @@ create:
TL_READ_NO_INSERT:
TL_READ)))
YYABORT;
lex->create_list.empty();
lex->key_list.empty();
lex->alter_info.reset();
lex->col_list.empty();
lex->change=NullS;
bzero((char*) &lex->create_info,sizeof(lex->create_info));
...
...
@@ -1371,16 +1370,17 @@ create:
if (!lex->current_select->add_table_to_list(lex->thd, $7, NULL,
TL_OPTION_UPDATING))
YYABORT;
lex->create_list.empty
();
lex->key_list.empty()
;
lex->alter_info.reset
();
lex->alter_info.flags= ALTER_ADD_INDEX
;
lex->col_list.empty();
lex->change=NullS;
}
'(' key_list ')'
{
LEX *lex=Lex;
Key *key= new Key($2, $4.str, $5, 0, lex->col_list);
lex->key_list.push_back(new Key($2,$4.str, $5, 0, lex->col_list)
);
lex->alter_info.key_list.push_back(key
);
lex->col_list.empty();
}
| CREATE DATABASE opt_if_not_exists ident
...
...
@@ -2920,29 +2920,34 @@ key_def:
key_type opt_ident key_alg '(' key_list ')'
{
LEX *lex=Lex;
lex->key_list.push_back(new Key($1,$2, $3, 0, lex->col_list));
Key *key= new Key($1, $2, $3, 0, lex->col_list);
lex->alter_info.key_list.push_back(key);
lex->col_list.empty(); /* Alloced by sql_alloc */
}
| opt_constraint constraint_key_type opt_ident key_alg '(' key_list ')'
{
LEX *lex=Lex;
const char *key_name= $3 ? $3:$1;
lex->key_list.push_back(new Key($2, key_name, $4, 0,
lex->col_list)
);
Key *key= new Key($2, key_name, $4, 0, lex->col_list);
lex->alter_info.key_list.push_back(key
);
lex->col_list.empty(); /* Alloced by sql_alloc */
}
| opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references
{
LEX *lex=Lex;
lex->key_list.push_back(new foreign_key($4 ? $4:$1, lex->col_list,
$8,
lex->ref_list,
lex->fk_delete_opt,
lex->fk_update_opt,
lex->fk_match_option));
lex->key_list.push_back(new Key(Key::MULTIPLE, $4 ? $4 : $1,
HA_KEY_ALG_UNDEF, 1,
lex->col_list));
const char *key_name= $4 ? $4 : $1;
Key *key= new foreign_key(key_name, lex->col_list,
$8,
lex->ref_list,
lex->fk_delete_opt,
lex->fk_update_opt,
lex->fk_match_option);
lex->alter_info.key_list.push_back(key);
key= new Key(Key::MULTIPLE, key_name,
HA_KEY_ALG_UNDEF, 1,
lex->col_list);
lex->alter_info.key_list.push_back(key);
lex->col_list.empty(); /* Alloced by sql_alloc */
}
| constraint opt_check_constraint
...
...
@@ -3484,8 +3489,6 @@ alter:
if (!lex->select_lex.add_table_to_list(thd, $4, NULL,
TL_OPTION_UPDATING))
YYABORT;
lex->create_list.empty();
lex->key_list.empty();
lex->col_list.empty();
lex->select_lex.init_order();
lex->select_lex.db=
...
...
@@ -3495,8 +3498,7 @@ alter:
lex->create_info.db_type= DB_TYPE_DEFAULT;
lex->create_info.default_table_charset= NULL;
lex->create_info.row_type= ROW_TYPE_NOT_USED;
lex->alter_info.reset();
lex->alter_info.flags= 0;
lex->alter_info.reset();
}
alter_list
{}
...
...
@@ -6254,7 +6256,8 @@ drop:
{
LEX *lex=Lex;
lex->sql_command= SQLCOM_DROP_INDEX;
lex->alter_info.drop_list.empty();
lex->alter_info.reset();
lex->alter_info.flags= ALTER_DROP_INDEX;
lex->alter_info.drop_list.push_back(new Alter_drop(Alter_drop::KEY,
$3.str));
if (!lex->current_select->add_table_to_list(lex->thd, $5, NULL,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment