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
b435d6e8
Commit
b435d6e8
authored
Mar 17, 2005
by
gluh@gluh.mysql.r18.ru
Browse files
Options
Browse Files
Download
Plain Diff
Merge 4.1 -> 5.0
parents
08b2c7ec
261105a0
Changes
26
Show whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
394 additions
and
95 deletions
+394
-95
client/mysqldump.c
client/mysqldump.c
+60
-35
heap/hp_create.c
heap/hp_create.c
+1
-2
include/heap.h
include/heap.h
+2
-0
mysql-test/mysql-test-run.sh
mysql-test/mysql-test-run.sh
+3
-3
mysql-test/r/ctype_utf8.result
mysql-test/r/ctype_utf8.result
+7
-0
mysql-test/r/func_gconcat.result
mysql-test/r/func_gconcat.result
+8
-0
mysql-test/r/func_str.result
mysql-test/r/func_str.result
+16
-7
mysql-test/r/olap.result
mysql-test/r/olap.result
+72
-0
mysql-test/r/rpl000005.result
mysql-test/r/rpl000005.result
+3
-0
mysql-test/r/update.result
mysql-test/r/update.result
+7
-0
mysql-test/t/ctype_utf8.test
mysql-test/t/ctype_utf8.test
+9
-0
mysql-test/t/func_gconcat.test
mysql-test/t/func_gconcat.test
+9
-1
mysql-test/t/func_str.test
mysql-test/t/func_str.test
+9
-0
mysql-test/t/olap.test
mysql-test/t/olap.test
+30
-0
mysql-test/t/rpl000005.test
mysql-test/t/rpl000005.test
+5
-0
mysql-test/t/update.test
mysql-test/t/update.test
+10
-0
sql/ha_heap.cc
sql/ha_heap.cc
+11
-3
sql/item.cc
sql/item.cc
+12
-0
sql/item.h
sql/item.h
+12
-0
sql/item_func.cc
sql/item_func.cc
+0
-5
sql/item_strfunc.cc
sql/item_strfunc.cc
+8
-10
sql/key.cc
sql/key.cc
+1
-1
sql/set_var.cc
sql/set_var.cc
+1
-0
sql/sql_select.cc
sql/sql_select.cc
+92
-27
sql/sql_select.h
sql/sql_select.h
+2
-1
sql/sql_string.h
sql/sql_string.h
+4
-0
No files found.
client/mysqldump.c
View file @
b435d6e8
...
...
@@ -875,7 +875,7 @@ static int dbConnect(char *host, char *user,char *passwd)
cannot reconnect.
*/
sock
->
reconnect
=
0
;
sprintf
(
buff
,
"/*!40100 SET @@SQL_MODE='%s' */"
,
my_snprintf
(
buff
,
sizeof
(
buff
)
,
"/*!40100 SET @@SQL_MODE='%s' */"
,
compatible_mode_normal_str
);
if
(
mysql_query_with_error_report
(
sock
,
0
,
buff
))
{
...
...
@@ -1111,7 +1111,8 @@ static uint getTableStructure(char *table, char* db)
if
(
verbose
)
fprintf
(
stderr
,
"-- Retrieving table structure for table %s...
\n
"
,
table
);
sprintf
(
insert_pat
,
"SET OPTION SQL_QUOTE_SHOW_CREATE=%d"
,
my_snprintf
(
insert_pat
,
sizeof
(
insert_pat
),
"SET OPTION SQL_QUOTE_SHOW_CREATE=%d"
,
(
opt_quoted
||
opt_keywords
));
if
(
!
create_options
)
strmov
(
strend
(
insert_pat
),
"/*!40102 ,SQL_MODE=concat(@@sql_mode, _utf8 ',NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS') */"
);
...
...
@@ -1131,7 +1132,7 @@ static uint getTableStructure(char *table, char* db)
char
buff
[
20
+
FN_REFLEN
];
MYSQL_FIELD
*
field
;
sprintf
(
buff
,
"show create table %s"
,
result_table
);
my_snprintf
(
buff
,
sizeof
(
buff
),
"show create table %s"
,
result_table
);
if
(
mysql_query_with_error_report
(
sock
,
0
,
buff
))
{
safe_exit
(
EX_MYSQLERR
);
...
...
@@ -1177,7 +1178,8 @@ static uint getTableStructure(char *table, char* db)
check_io
(
sql_file
);
mysql_free_result
(
tableRes
);
}
sprintf
(
insert_pat
,
"show fields from %s"
,
result_table
);
my_snprintf
(
insert_pat
,
sizeof
(
insert_pat
),
"show fields from %s"
,
result_table
);
if
(
mysql_query_with_error_report
(
sock
,
&
tableRes
,
insert_pat
))
{
if
(
path
)
...
...
@@ -1187,11 +1189,12 @@ static uint getTableStructure(char *table, char* db)
}
if
(
cFlag
)
sprintf
(
insert_pat
,
"INSERT %sINTO %s ("
,
delayed
,
opt_quoted_table
);
my_snprintf
(
insert_pat
,
sizeof
(
insert_pat
),
"INSERT %sINTO %s ("
,
delayed
,
opt_quoted_table
);
else
{
sprintf
(
insert_pat
,
"INSERT %sINTO %s VALUES "
,
delayed
,
opt_quoted_table
);
my_snprintf
(
insert_pat
,
sizeof
(
insert_pat
),
"INSERT %sINTO %s VALUES "
,
delayed
,
opt_quoted_table
);
if
(
!
extended_insert
)
strcat
(
insert_pat
,
"("
);
}
...
...
@@ -1218,7 +1221,8 @@ static uint getTableStructure(char *table, char* db)
"%s: Warning: Can't set SQL_QUOTE_SHOW_CREATE option (%s)
\n
"
,
my_progname
,
mysql_error
(
sock
));
sprintf
(
insert_pat
,
"show fields from %s"
,
result_table
);
my_snprintf
(
insert_pat
,
sizeof
(
insert_pat
),
"show fields from %s"
,
result_table
);
if
(
mysql_query_with_error_report
(
sock
,
&
tableRes
,
insert_pat
))
{
safe_exit
(
EX_MYSQLERR
);
...
...
@@ -1253,10 +1257,12 @@ static uint getTableStructure(char *table, char* db)
check_io
(
sql_file
);
}
if
(
cFlag
)
sprintf
(
insert_pat
,
"INSERT %sINTO %s ("
,
delayed
,
result_table
);
my_snprintf
(
insert_pat
,
sizeof
(
insert_pat
),
"INSERT %sINTO %s ("
,
delayed
,
result_table
);
else
{
sprintf
(
insert_pat
,
"INSERT %sINTO %s VALUES "
,
delayed
,
result_table
);
my_snprintf
(
insert_pat
,
sizeof
(
insert_pat
),
"INSERT %sINTO %s VALUES "
,
delayed
,
result_table
);
if
(
!
extended_insert
)
strcat
(
insert_pat
,
"("
);
}
...
...
@@ -1313,7 +1319,7 @@ static uint getTableStructure(char *table, char* db)
/* Make an sql-file, if path was given iow. option -T was given */
char
buff
[
20
+
FN_REFLEN
];
uint
keynr
,
primary_key
;
sprintf
(
buff
,
"show keys from %s"
,
result_table
);
my_snprintf
(
buff
,
sizeof
(
buff
),
"show keys from %s"
,
result_table
);
if
(
mysql_query_with_error_report
(
sock
,
&
tableRes
,
buff
))
{
if
(
mysql_errno
(
sock
)
==
ER_WRONG_OBJECT
)
...
...
@@ -1391,8 +1397,12 @@ static uint getTableStructure(char *table, char* db)
if
(
create_options
)
{
char
show_name_buff
[
FN_REFLEN
];
sprintf
(
buff
,
"show table status like %s"
,
/* Check memory for quote_for_like() */
DBUG_ASSERT
(
2
*
sizeof
(
table
)
<
sizeof
(
show_name_buff
));
my_snprintf
(
buff
,
sizeof
(
buff
),
"show table status like %s"
,
quote_for_like
(
table
,
show_name_buff
));
if
(
mysql_query_with_error_report
(
sock
,
&
tableRes
,
buff
))
{
if
(
mysql_errno
(
sock
)
!=
ER_PARSE_ERROR
)
...
...
@@ -1553,7 +1563,8 @@ static void dumpTable(uint numFields, char *table)
my_delete
(
filename
,
MYF
(
0
));
/* 'INTO OUTFILE' doesn't work, if
filename wasn't deleted */
to_unix_path
(
filename
);
sprintf
(
query
,
"SELECT /*!40001 SQL_NO_CACHE */ * INTO OUTFILE '%s'"
,
my_snprintf
(
query
,
QUERY_LENGTH
,
"SELECT /*!40001 SQL_NO_CACHE */ * INTO OUTFILE '%s'"
,
filename
);
end
=
strend
(
query
);
...
...
@@ -1566,7 +1577,7 @@ static void dumpTable(uint numFields, char *table)
end
=
add_load_option
(
end
,
lines_terminated
,
" LINES TERMINATED BY"
);
*
end
=
'\0'
;
sprintf
(
buff
,
" FROM %s"
,
result_table
);
my_snprintf
(
buff
,
sizeof
(
buff
),
" FROM %s"
,
result_table
);
end
=
strmov
(
end
,
buff
);
if
(
where
||
order_by
)
{
...
...
@@ -1594,7 +1605,8 @@ static void dumpTable(uint numFields, char *table)
result_table
);
check_io
(
md_result_file
);
}
sprintf
(
query
,
"SELECT /*!40001 SQL_NO_CACHE */ * FROM %s"
,
my_snprintf
(
query
,
QUERY_LENGTH
,
"SELECT /*!40001 SQL_NO_CACHE */ * FROM %s"
,
result_table
);
if
(
where
||
order_by
)
{
...
...
@@ -1693,7 +1705,8 @@ static void dumpTable(uint numFields, char *table)
int
is_blob
;
if
(
!
(
field
=
mysql_fetch_field
(
res
)))
{
sprintf
(
query
,
"%s: Not enough fields from table %s! Aborting.
\n
"
,
my_snprintf
(
query
,
QUERY_LENGTH
,
"%s: Not enough fields from table %s! Aborting.
\n
"
,
my_progname
,
result_table
);
fputs
(
query
,
stderr
);
error
=
EX_CONSCHECK
;
...
...
@@ -1896,7 +1909,8 @@ static void dumpTable(uint numFields, char *table)
check_io
(
md_result_file
);
if
(
mysql_errno
(
sock
))
{
sprintf
(
query
,
"%s: Error %d: %s when dumping table %s at row: %ld
\n
"
,
my_snprintf
(
query
,
QUERY_LENGTH
,
"%s: Error %d: %s when dumping table %s at row: %ld
\n
"
,
my_progname
,
mysql_errno
(
sock
),
mysql_error
(
sock
),
...
...
@@ -2045,7 +2059,8 @@ static int init_dumping(char *database)
MYSQL_ROW
row
;
MYSQL_RES
*
dbinfo
;
sprintf
(
qbuf
,
"SHOW CREATE DATABASE IF NOT EXISTS %s"
,
my_snprintf
(
qbuf
,
sizeof
(
qbuf
),
"SHOW CREATE DATABASE IF NOT EXISTS %s"
,
qdatabase
);
if
(
mysql_query
(
sock
,
qbuf
)
||
!
(
dbinfo
=
mysql_store_result
(
sock
)))
...
...
@@ -2141,6 +2156,7 @@ static int dump_all_tables_in_db(char *database)
return
0
;
}
/* dump_all_tables_in_db */
/*
dump structure of views of database
...
...
@@ -2195,6 +2211,7 @@ static my_bool dump_all_views_in_db(char *database)
return
0
;
}
/* dump_all_tables_in_db */
/*
get_actual_table_name -- executes a SHOW TABLES LIKE '%s' to get the actual
table name from the server for the table name given on the command line.
...
...
@@ -2211,10 +2228,15 @@ static void get_actual_table_name(const char *old_table_name,
{
MYSQL_RES
*
tableRes
;
MYSQL_ROW
row
;
char
query
[
NAME_LEN
+
50
];
char
query
[
50
+
2
*
NAME_LEN
];
char
show_name_buff
[
FN_REFLEN
];
DBUG_ENTER
(
"get_actual_table_name"
);
sprintf
(
query
,
"SHOW TABLES LIKE '%s'"
,
old_table_name
);
/* Check memory for quote_for_like() */
DBUG_ASSERT
(
2
*
sizeof
(
old_table_name
)
<
sizeof
(
show_name_buff
));
my_snprintf
(
query
,
sizeof
(
query
),
"SHOW TABLES LIKE %s"
,
quote_for_like
(
old_table_name
,
show_name_buff
));
if
(
mysql_query_with_error_report
(
sock
,
0
,
query
))
{
safe_exit
(
EX_MYSQLERR
);
...
...
@@ -2464,7 +2486,9 @@ static const char *check_if_ignore_table(const char *table_name)
MYSQL_ROW
row
;
const
char
*
result
=
0
;
sprintf
(
buff
,
"show table status like %s"
,
/* Check memory for quote_for_like() */
DBUG_ASSERT
(
2
*
sizeof
(
table_name
)
<
sizeof
(
show_name_buff
));
my_snprintf
(
buff
,
sizeof
(
buff
),
"show table status like %s"
,
quote_for_like
(
table_name
,
show_name_buff
));
if
(
mysql_query_with_error_report
(
sock
,
&
res
,
buff
))
{
...
...
@@ -2523,7 +2547,8 @@ static char *primary_key_fields(const char *table_name)
uint
result_length
=
0
;
char
*
result
=
0
;
sprintf
(
show_keys_buff
,
"SHOW KEYS FROM %s"
,
table_name
);
my_snprintf
(
show_keys_buff
,
sizeof
(
show_keys_buff
),
"SHOW KEYS FROM %s"
,
table_name
);
if
(
mysql_query
(
sock
,
show_keys_buff
)
||
!
(
res
=
mysql_store_result
(
sock
)))
{
...
...
heap/hp_create.c
View file @
b435d6e8
...
...
@@ -168,8 +168,6 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
keyinfo
->
write_key
=
hp_write_key
;
keyinfo
->
hash_buckets
=
0
;
}
if
((
keyinfo
->
flag
&
HA_AUTO_KEY
)
&&
create_info
->
with_auto_increment
)
share
->
auto_key
=
i
+
1
;
}
share
->
min_records
=
min_records
;
share
->
max_records
=
max_records
;
...
...
@@ -180,6 +178,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
share
->
keys
=
keys
;
share
->
max_key_length
=
max_length
;
share
->
changed
=
0
;
share
->
auto_key
=
create_info
->
auto_key
;
share
->
auto_key_type
=
create_info
->
auto_key_type
;
share
->
auto_increment
=
create_info
->
auto_increment
;
/* Must be allocated separately for rename to work */
...
...
include/heap.h
View file @
b435d6e8
...
...
@@ -181,8 +181,10 @@ typedef struct st_heap_info
LIST
open_list
;
}
HP_INFO
;
typedef
struct
st_heap_create_info
{
uint
auto_key
;
/* keynr [1 - maxkey] for auto key */
uint
auto_key_type
;
ulong
max_table_size
;
ulonglong
auto_increment
;
...
...
mysql-test/mysql-test-run.sh
View file @
b435d6e8
...
...
@@ -432,10 +432,10 @@ while test $# -gt 0; do
TMP
=
`
$ECHO
"
$1
"
|
$SED
-e
"s;--valgrind-options=;;"
`
VALGRIND
=
"
$VALGRIND
$TMP
"
;;
--skip-ndbcluster
)
--skip-ndbcluster
|
--skip-ndb
)
USE_NDBCLUSTER
=
""
EXTRA_MASTER_MYSQLD_OPT
=
"
$EXTRA_MASTER_MYSQLD_OPT
$1
"
EXTRA_SLAVE_MYSQLD_OPT
=
"
$EXTRA_SLAVE_MYSQLD_OPT
$1
"
EXTRA_MASTER_MYSQLD_OPT
=
"
$EXTRA_MASTER_MYSQLD_OPT
--skip-ndbcluster
"
EXTRA_SLAVE_MYSQLD_OPT
=
"
$EXTRA_SLAVE_MYSQLD_OPT
--skip-ndbcluster
"
;;
--skip-
*
)
EXTRA_MASTER_MYSQLD_OPT
=
"
$EXTRA_MASTER_MYSQLD_OPT
$1
"
...
...
mysql-test/r/ctype_utf8.result
View file @
b435d6e8
...
...
@@ -861,6 +861,13 @@ user c
one <one>
two <two>
DROP TABLE t1;
create table t1 (f1 varchar(1) not null) default charset utf8;
insert into t1 values (''), ('');
select concat(concat(_latin1'->',f1),_latin1'<-') from t1;
concat(concat(_latin1'->',f1),_latin1'<-')
-><-
-><-
drop table t1;
select convert(_koi8r'' using utf8) < convert(_koi8r'' using utf8);
convert(_koi8r'' using utf8) < convert(_koi8r'' using utf8)
1
mysql-test/r/func_gconcat.result
View file @
b435d6e8
...
...
@@ -469,3 +469,11 @@ group_concat(a)
ABW
ABW
drop table t1;
create table r2 (a int, b int);
insert into r2 values (1,1), (2,2);
select b x, (select group_concat(x) from r2) from r2;
x (select group_concat(x) from r2)
1 1,1
2 2,2
drop table r2;
mysql-test/r/func_str.result
View file @
b435d6e8
...
...
@@ -515,7 +515,7 @@ collation(make_set(255,_latin2'a',_latin2'b',_latin2'c')) coercibility(make_set(
latin2_general_ci 4
select collation(export_set(255,_latin2'y',_latin2'n',_latin2' ')), coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '));
collation(export_set(255,_latin2'y',_latin2'n',_latin2' ')) coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '))
binary
4
latin2_general_ci
4
select collation(trim(_latin2' a ')), coercibility(trim(_latin2' a '));
collation(trim(_latin2' a ')) coercibility(trim(_latin2' a '))
latin2_general_ci 4
...
...
@@ -630,6 +630,15 @@ t1 CREATE TABLE `t1` (
`encode('abcd','ab')` varbinary(4) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1 (a char character set latin2);
insert into t1 values (null);
select charset(a), collation(a), coercibility(a) from t1;
charset(a) collation(a) coercibility(a)
latin2 latin2_general_ci 2
drop table t1;
select charset(null), collation(null), coercibility(null);
charset(null) collation(null) coercibility(null)
binary binary 5
select SUBSTR('abcdefg',3,2);
SUBSTR('abcdefg',3,2)
cd
...
...
@@ -683,16 +692,16 @@ drop table t1, t2;
create table t1 (c1 INT, c2 INT UNSIGNED);
insert into t1 values ('21474836461','21474836461');
Warnings:
Warning 126
4 Out of range value adjus
ted for column 'c1' at row 1
Warning 126
4 Out of range value adjus
ted for column 'c2' at row 1
Warning 126
5 Data trunca
ted for column 'c1' at row 1
Warning 126
5 Data trunca
ted for column 'c2' at row 1
insert into t1 values ('-21474836461','-21474836461');
Warnings:
Warning 126
4 Out of range value adjus
ted for column 'c1' at row 1
Warning 126
4 Out of range value adjus
ted for column 'c2' at row 1
Warning 126
5 Data trunca
ted for column 'c1' at row 1
Warning 126
5 Data trunca
ted for column 'c2' at row 1
show warnings;
Level Code Message
Warning 126
4 Out of range value adjus
ted for column 'c1' at row 1
Warning 126
4 Out of range value adjus
ted for column 'c2' at row 1
Warning 126
5 Data trunca
ted for column 'c1' at row 1
Warning 126
5 Data trunca
ted for column 'c2' at row 1
select * from t1;
c1 c2
2147483647 4294967295
...
...
mysql-test/r/olap.result
View file @
b435d6e8
...
...
@@ -307,3 +307,75 @@ day sample not_cancelled
2004-06-07 1 0
NULL 3 1
DROP TABLE user_day;
CREATE TABLE t1 (a int, b int);
INSERT INTO t1 VALUES
(1,4),
(2,2), (2,2),
(4,1), (4,1), (4,1), (4,1),
(2,1), (2,1);
SELECT SUM(b) FROM t1 GROUP BY a WITH ROLLUP;
SUM(b)
4
6
4
14
SELECT DISTINCT SUM(b) FROM t1 GROUP BY a WITH ROLLUP;
SUM(b)
4
6
14
SELECT SUM(b), COUNT(DISTINCT b) FROM t1 GROUP BY a WITH ROLLUP;
SUM(b) COUNT(DISTINCT b)
4 1
6 2
4 1
14 3
SELECT DISTINCT SUM(b), COUNT(DISTINCT b) FROM t1 GROUP BY a WITH ROLLUP;
SUM(b) COUNT(DISTINCT b)
4 1
6 2
14 3
SELECT SUM(b), COUNT(*) FROM t1 GROUP BY a WITH ROLLUP;
SUM(b) COUNT(*)
4 1
6 4
4 4
14 9
SELECT DISTINCT SUM(b), COUNT(*) FROM t1 GROUP BY a WITH ROLLUP;
SUM(b) COUNT(*)
4 1
6 4
4 4
14 9
SELECT SUM(b), COUNT(DISTINCT b), COUNT(*) FROM t1 GROUP BY a WITH ROLLUP;
SUM(b) COUNT(DISTINCT b) COUNT(*)
4 1 1
6 2 4
4 1 4
14 3 9
SELECT DISTINCT SUM(b), COUNT(DISTINCT b), COUNT(*) FROM t1
GROUP BY a WITH ROLLUP;
SUM(b) COUNT(DISTINCT b) COUNT(*)
4 1 1
6 2 4
4 1 4
14 3 9
SELECT a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
a sum(b)
1 4
1 4
2 2
2 4
2 6
4 4
4 4
NULL 14
SELECT DISTINCT a, sum(b) FROM t1 GROUP BY a,b WITH ROLLUP;
a sum(b)
1 4
2 2
2 4
2 6
4 4
NULL 14
DROP TABLE t1;
mysql-test/r/rpl000005.result
View file @
b435d6e8
...
...
@@ -4,6 +4,9 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
SHOW VARIABLES LIKE 'relay_log_space_limit';
Variable_name Value
relay_log_space_limit 0
CREATE TABLE t1 (name varchar(64), age smallint(3));
INSERT INTO t1 SET name='Andy', age=31;
INSERT t1 SET name='Jacob', age=2;
...
...
mysql-test/r/update.result
View file @
b435d6e8
...
...
@@ -219,3 +219,10 @@ select * from t1;
id id_str
1 test1
drop table t1;
create table t1 (a int, b char(255), key(a, b(20)));
insert into t1 values (0, '1');
update t1 set b = b + 1 where a = 0;
select * from t1;
a b
0 2
drop table t1;
mysql-test/t/ctype_utf8.test
View file @
b435d6e8
...
...
@@ -694,6 +694,15 @@ SELECT CHARSET('a');
SELECT
user
,
CONCAT
(
'<'
,
user
,
'>'
)
AS
c
FROM
t1
;
DROP
TABLE
t1
;
#
# Bug#8785
# the same problem with the above, but with nested CONCATs
#
create
table
t1
(
f1
varchar
(
1
)
not
null
)
default
charset
utf8
;
insert
into
t1
values
(
''
),
(
''
);
select
concat
(
concat
(
_latin1
'->'
,
f1
),
_latin1
'<-'
)
from
t1
;
drop
table
t1
;
#
# Bug#8385: utf8_general_ci treats Cyrillic letters I and SHORT I as the same
#
...
...
mysql-test/t/func_gconcat.test
View file @
b435d6e8
...
...
@@ -288,8 +288,16 @@ DROP TABLE t1;
#
# Bug #6475
#
create
table
t1
(
a
char
(
3
),
b
char
(
20
),
primary
key
(
a
,
b
));
insert
into
t1
values
(
'ABW'
,
'Dutch'
),
(
'ABW'
,
'English'
);
select
group_concat
(
a
)
from
t1
group
by
b
;
drop
table
t1
;
#
# Bug #8656: Crash with group_concat on alias in outer table
#
create
table
r2
(
a
int
,
b
int
);
insert
into
r2
values
(
1
,
1
),
(
2
,
2
);
select
b
x
,
(
select
group_concat
(
x
)
from
r2
)
from
r2
;
drop
table
r2
;
mysql-test/t/func_str.test
View file @
b435d6e8
...
...
@@ -369,6 +369,15 @@ select
show
create
table
t1
;
drop
table
t1
;
#
# Bug#9129
#
create
table
t1
(
a
char
character
set
latin2
);
insert
into
t1
values
(
null
);
select
charset
(
a
),
collation
(
a
),
coercibility
(
a
)
from
t1
;
drop
table
t1
;
select
charset
(
null
),
collation
(
null
),
coercibility
(
null
);
#
# test for SUBSTR
#
...
...
mysql-test/t/olap.test
View file @
b435d6e8
...
...
@@ -125,3 +125,33 @@ SELECT
DROP
TABLE
user_day
;
#
# Tests for bugs #8616, #8615: distinct sum with rollup
#
CREATE
TABLE
t1
(
a
int
,
b
int
);
INSERT
INTO
t1
VALUES
(
1
,
4
),
(
2
,
2
),
(
2
,
2
),
(
4
,
1
),
(
4
,
1
),
(
4
,
1
),
(
4
,
1
),
(
2
,
1
),
(
2
,
1
);
SELECT
SUM
(
b
)
FROM
t1
GROUP
BY
a
WITH
ROLLUP
;
SELECT
DISTINCT
SUM
(
b
)
FROM
t1
GROUP
BY
a
WITH
ROLLUP
;
SELECT
SUM
(
b
),
COUNT
(
DISTINCT
b
)
FROM
t1
GROUP
BY
a
WITH
ROLLUP
;
SELECT
DISTINCT
SUM
(
b
),
COUNT
(
DISTINCT
b
)
FROM
t1
GROUP
BY
a
WITH
ROLLUP
;
SELECT
SUM
(
b
),
COUNT
(
*
)
FROM
t1
GROUP
BY
a
WITH
ROLLUP
;
SELECT
DISTINCT
SUM
(
b
),
COUNT
(
*
)
FROM
t1
GROUP
BY
a
WITH
ROLLUP
;
SELECT
SUM
(
b
),
COUNT
(
DISTINCT
b
),
COUNT
(
*
)
FROM
t1
GROUP
BY
a
WITH
ROLLUP
;
SELECT
DISTINCT
SUM
(
b
),
COUNT
(
DISTINCT
b
),
COUNT
(
*
)
FROM
t1
GROUP
BY
a
WITH
ROLLUP
;
SELECT
a
,
sum
(
b
)
FROM
t1
GROUP
BY
a
,
b
WITH
ROLLUP
;
SELECT
DISTINCT
a
,
sum
(
b
)
FROM
t1
GROUP
BY
a
,
b
WITH
ROLLUP
;
DROP
TABLE
t1
;
mysql-test/t/rpl000005.test
View file @
b435d6e8
source
include
/
master
-
slave
.
inc
;
#
# Bug#7100 relay_log_space_max missing from SHOW VARIABLES
#
SHOW
VARIABLES
LIKE
'relay_log_space_limit'
;
CREATE
TABLE
t1
(
name
varchar
(
64
),
age
smallint
(
3
));
INSERT
INTO
t1
SET
name
=
'Andy'
,
age
=
31
;
INSERT
t1
SET
name
=
'Jacob'
,
age
=
2
;
...
...
mysql-test/t/update.test
View file @
b435d6e8
...
...
@@ -179,3 +179,13 @@ insert into t1 (id_str) values ("test");
update
t1
set
id_str
=
concat
(
id_str
,
id
)
where
id
=
last_insert_id
();
select
*
from
t1
;
drop
table
t1
;
#
# Bug #8942: a problem with update and partial key part
#
create
table
t1
(
a
int
,
b
char
(
255
),
key
(
a
,
b
(
20
)));
insert
into
t1
values
(
0
,
'1'
);
update
t1
set
b
=
b
+
1
where
a
=
0
;
select
*
from
t1
;
drop
table
t1
;
sql/ha_heap.cc
View file @
b435d6e8
...
...
@@ -521,11 +521,19 @@ int ha_heap::create(const char *name, TABLE *table_arg,
seg
->
null_bit
=
0
;
seg
->
null_pos
=
0
;
}
// We have to store field->key_type() as seg->type can differ from it
if
(
field
->
flags
&
AUTO_INCREMENT_FLAG
)
if
(
field
->
flags
&
AUTO_INCREMENT_FLAG
&&
table_arg
->
found_next_number_field
&&
key
==
table_arg
->
next_number_index
)
{
/*
Store key number and type for found auto_increment key
We have to store type as seg->type can differ from it
*/
auto_key
=
key
+
1
;
auto_key_type
=
field
->
key_type
();
}
}
}
mem_per_row
+=
MY_ALIGN
(
share
->
reclength
+
1
,
sizeof
(
char
*
));
max_rows
=
(
ha_rows
)
(
table
->
in_use
->
variables
.
max_heap_table_size
/
mem_per_row
);
...
...
@@ -535,8 +543,8 @@ int ha_heap::create(const char *name, TABLE *table_arg,
found_real_auto_increment
=
share
->
next_number_key_offset
==
0
;
}
HP_CREATE_INFO
hp_create_info
;
hp_create_info
.
auto_key
=
auto_key
;
hp_create_info
.
auto_key_type
=
auto_key_type
;
hp_create_info
.
with_auto_increment
=
found_real_auto_increment
;
hp_create_info
.
auto_increment
=
(
create_info
->
auto_increment_value
?
create_info
->
auto_increment_value
-
1
:
0
);
hp_create_info
.
max_table_size
=
current_thd
->
variables
.
max_heap_table_size
;
...
...
sql/item.cc
View file @
b435d6e8
...
...
@@ -586,6 +586,18 @@ Item *Item_string::safe_charset_converter(CHARSET_INFO *tocs)
return
NULL
;
}
conv
->
str_value
.
copy
();
/*
The above line executes str_value.realloc() internally,
which alligns Alloced_length using ALLIGN_SIZE.
In the case of Item_string::str_value we don't want
Alloced_length to be longer than str_length.
Otherwise, some functions like Item_func_concat::val_str()
try to reuse str_value as a buffer for concatenation result
for optimization purposes, so our string constant become
corrupted. See bug#8785 for more details.
Let's shrink Alloced_length to str_length to avoid this problem.
*/
conv
->
str_value
.
shrink_to_length
();
return
conv
;
}
...
...
sql/item.h
View file @
b435d6e8
...
...
@@ -790,6 +790,17 @@ public:
Item
*
safe_charset_converter
(
CHARSET_INFO
*
tocs
);
};
class
Item_null_result
:
public
Item_null
{
public:
Field
*
result_field
;
Item_null_result
()
:
Item_null
(),
result_field
(
0
)
{}
bool
is_result_field
()
{
return
result_field
!=
0
;
}
void
save_in_result_field
(
bool
no_conversions
)
{
save_in_field
(
result_field
,
no_conversions
);
}
};
/* Item represents one placeholder ('?') of prepared statement */
...
...
@@ -1274,6 +1285,7 @@ public:
void
save_org_in_field
(
Field
*
field
)
{
(
*
ref
)
->
save_org_in_field
(
field
);
}
enum
Item_result
result_type
()
const
{
return
(
*
ref
)
->
result_type
();
}
enum_field_types
field_type
()
const
{
return
(
*
ref
)
->
field_type
();
}
Field
*
get_tmp_table_field
()
{
return
result_field
;
}
table_map
used_tables
()
const
{
return
depended_from
?
OUTER_REF_TABLE_BIT
:
(
*
ref
)
->
used_tables
();
...
...
sql/item_func.cc
View file @
b435d6e8
...
...
@@ -2096,11 +2096,6 @@ longlong Item_func_char_length::val_int()
longlong
Item_func_coercibility
::
val_int
()
{
DBUG_ASSERT
(
fixed
==
1
);
if
(
args
[
0
]
->
null_value
)
{
null_value
=
1
;
return
0
;
}
null_value
=
0
;
return
(
longlong
)
args
[
0
]
->
collation
.
derivation
;
}
...
...
sql/item_strfunc.cc
View file @
b435d6e8
...
...
@@ -267,8 +267,7 @@ String *Item_func_concat::val_str(String *str)
current_thd
->
variables
.
max_allowed_packet
);
goto
null
;
}
if
(
!
args
[
0
]
->
const_item
()
&&
res
->
alloced_length
()
>=
res
->
length
()
+
res2
->
length
())
if
(
res
->
alloced_length
()
>=
res
->
length
()
+
res2
->
length
())
{
// Use old buffer
res
->
append
(
*
res2
);
}
...
...
@@ -2308,12 +2307,11 @@ void Item_func_set_collation::print(String *str)
String
*
Item_func_charset
::
val_str
(
String
*
str
)
{
DBUG_ASSERT
(
fixed
==
1
);
String
*
res
=
args
[
0
]
->
val_str
(
str
);
uint
dummy_errors
;
if
((
null_value
=
(
args
[
0
]
->
null_value
||
!
res
->
charset
())))
return
0
;
str
->
copy
(
res
->
charset
()
->
csname
,
strlen
(
res
->
charset
()
->
csname
),
CHARSET_INFO
*
cs
=
args
[
0
]
->
collation
.
collation
;
null_value
=
0
;
str
->
copy
(
cs
->
csname
,
strlen
(
cs
->
csname
),
&
my_charset_latin1
,
collation
.
collation
,
&
dummy_errors
);
return
str
;
}
...
...
@@ -2321,12 +2319,11 @@ String *Item_func_charset::val_str(String *str)
String
*
Item_func_collation
::
val_str
(
String
*
str
)
{
DBUG_ASSERT
(
fixed
==
1
);
String
*
res
=
args
[
0
]
->
val_str
(
str
);
uint
dummy_errors
;
CHARSET_INFO
*
cs
=
args
[
0
]
->
collation
.
collation
;
if
((
null_value
=
(
args
[
0
]
->
null_value
||
!
res
->
charset
())))
return
0
;
str
->
copy
(
res
->
charset
()
->
name
,
strlen
(
res
->
charset
()
->
name
),
null_value
=
0
;
str
->
copy
(
cs
->
name
,
strlen
(
cs
->
name
),
&
my_charset_latin1
,
collation
.
collation
,
&
dummy_errors
);
return
str
;
}
...
...
@@ -2490,6 +2487,7 @@ String* Item_func_export_set::val_str(String* str)
uint
num_set_values
=
64
;
ulonglong
mask
=
0x1
;
str
->
length
(
0
);
str
->
set_charset
(
collation
.
collation
);
/* Check if some argument is a NULL value */
if
(
args
[
0
]
->
null_value
||
args
[
1
]
->
null_value
||
args
[
2
]
->
null_value
)
...
...
sql/key.cc
View file @
b435d6e8
...
...
@@ -368,7 +368,7 @@ bool check_if_key_used(TABLE *table, uint idx, List<Item> &fields)
f
.
rewind
();
while
((
field
=
(
Item_field
*
)
f
++
))
{
if
(
key_part
->
field
==
field
->
field
)
if
(
key_part
->
field
->
eq
(
field
->
field
)
)
return
1
;
}
}
...
...
sql/set_var.cc
View file @
b435d6e8
...
...
@@ -926,6 +926,7 @@ struct show_var_st init_vars[]= {
{
sys_read_rnd_buff_size
.
name
,(
char
*
)
&
sys_read_rnd_buff_size
,
SHOW_SYS
},
#ifdef HAVE_REPLICATION
{
sys_relay_log_purge
.
name
,
(
char
*
)
&
sys_relay_log_purge
,
SHOW_SYS
},
{
"relay_log_space_limit"
,
(
char
*
)
&
relay_log_space_limit
,
SHOW_LONGLONG
},
#endif
{
sys_rpl_recovery_rank
.
name
,(
char
*
)
&
sys_rpl_recovery_rank
,
SHOW_SYS
},
{
"secure_auth"
,
(
char
*
)
&
sys_secure_auth
,
SHOW_SYS
},
...
...
sql/sql_select.cc
View file @
b435d6e8
...
...
@@ -191,7 +191,7 @@ static bool change_refs_to_tmp_fields(THD *thd, Item **ref_pointer_array,
uint
elements
,
List
<
Item
>
&
items
);
static
void
init_tmptable_sum_functions
(
Item_sum
**
func
);
static
void
update_tmptable_sum_func
(
Item_sum
**
func
,
TABLE
*
tmp_table
);
static
void
copy_sum_funcs
(
Item_sum
**
func_ptr
);
static
void
copy_sum_funcs
(
Item_sum
**
func_ptr
,
Item_sum
**
end
);
static
bool
add_ref_to_table_cond
(
THD
*
thd
,
JOIN_TAB
*
join_tab
);
static
bool
setup_sum_funcs
(
THD
*
thd
,
Item_sum
**
func_ptr
);
static
bool
init_sum_functions
(
Item_sum
**
func
,
Item_sum
**
end
);
...
...
@@ -1386,7 +1386,6 @@ JOIN::exec()
{
DBUG_VOID_RETURN
;
}
curr_join
->
group_list
=
0
;
}
thd
->
proc_info
=
"Copying to group table"
;
...
...
@@ -1447,7 +1446,7 @@ JOIN::exec()
if
(
curr_join
->
tmp_having
)
curr_join
->
tmp_having
->
update_used_tables
();
if
(
remove_duplicates
(
curr_join
,
curr_tmp_table
,
curr_join
->
fields_list
,
curr_join
->
tmp_having
))
*
curr_
fields_list
,
curr_join
->
tmp_having
))
DBUG_VOID_RETURN
;
curr_join
->
tmp_having
=
0
;
curr_join
->
select_distinct
=
0
;
...
...
@@ -10132,26 +10131,32 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
{
if
(
join
->
procedure
)
join
->
procedure
->
end_group
();
if
(
idx
<
(
int
)
join
->
send_group_parts
)
int
send_group_parts
=
join
->
send_group_parts
;
if
(
idx
<
send_group_parts
)
{
if
(
!
join
->
first_record
)
{
/* No matching rows for group function */
join
->
clear
();
}
copy_sum_funcs
(
join
->
sum_funcs
);
if
(
!
join
->
having
||
join
->
having
->
val_int
())
{
if
((
error
=
table
->
file
->
write_row
(
table
->
record
[
0
])))
copy_sum_funcs
(
join
->
sum_funcs
,
join
->
sum_funcs_end
[
send_group_parts
]);
if
(
join
->
having
&&
join
->
having
->
val_int
()
==
0
)
error
=
-
1
;
else
if
((
error
=
table
->
file
->
write_row
(
table
->
record
[
0
])))
{
if
(
create_myisam_from_heap
(
join
->
thd
,
table
,
&
join
->
tmp_table_param
,
error
,
0
))
DBUG_RETURN
(
-
1
);
// Not a table_is_full error
DBUG_RETURN
(
-
1
);
}
else
join
->
send_records
++
;
if
(
join
->
rollup
.
state
!=
ROLLUP
::
STATE_NONE
&&
error
<=
0
)
{
if
(
join
->
rollup_write_data
((
uint
)
(
idx
+
1
),
table
))
error
=
1
;
}
if
(
error
>
0
)
DBUG_RETURN
(
-
1
);
if
(
end_of_records
)
DBUG_RETURN
(
0
);
}
...
...
@@ -12413,11 +12418,10 @@ update_tmptable_sum_func(Item_sum **func_ptr,
/* Copy result of sum functions to record in tmp_table */
static
void
copy_sum_funcs
(
Item_sum
**
func_ptr
)
copy_sum_funcs
(
Item_sum
**
func_ptr
,
Item_sum
**
end_ptr
)
{
Item_sum
*
func
;
for
(;
(
func
=
*
func_ptr
)
;
func_ptr
++
)
(
void
)
func
->
save_in_result_field
(
1
);
for
(;
func_ptr
!=
end_ptr
;
func_ptr
++
)
(
void
)
(
*
func_ptr
)
->
save_in_result_field
(
1
);
return
;
}
...
...
@@ -12539,14 +12543,16 @@ bool JOIN::rollup_init()
*/
tmp_table_param
.
group_parts
=
send_group_parts
;
if
(
!
(
rollup
.
fields
=
(
List
<
Item
>*
)
thd
->
alloc
((
sizeof
(
Item
*
)
+
if
(
!
(
rollup
.
null_items
=
(
Item_null_result
**
)
thd
->
alloc
((
sizeof
(
Item
*
)
+
sizeof
(
Item
**
)
+
sizeof
(
List
<
Item
>
)
+
ref_pointer_array_size
)
*
send_group_parts
)))
*
send_group_parts
)))
return
1
;
rollup
.
fields
=
(
List
<
Item
>*
)
(
rollup
.
null_items
+
send_group_parts
);
rollup
.
ref_pointer_arrays
=
(
Item
***
)
(
rollup
.
fields
+
send_group_parts
);
ref_array
=
(
Item
**
)
(
rollup
.
ref_pointer_arrays
+
send_group_parts
);
rollup
.
item_null
=
new
(
thd
->
mem_root
)
Item_null
();
/*
Prepare space for field list for the different levels
...
...
@@ -12554,12 +12560,16 @@ bool JOIN::rollup_init()
*/
for
(
i
=
0
;
i
<
send_group_parts
;
i
++
)
{
rollup
.
null_items
[
i
]
=
new
(
thd
->
mem_root
)
Item_null_result
();
List
<
Item
>
*
rollup_fields
=
&
rollup
.
fields
[
i
];
rollup_fields
->
empty
();
rollup
.
ref_pointer_arrays
[
i
]
=
ref_array
;
ref_array
+=
all_fields
.
elements
;
}
for
(
i
=
0
;
i
<
send_group_parts
;
i
++
)
{
for
(
j
=
0
;
j
<
fields_list
.
elements
;
j
++
)
rollup
_fields
->
push_back
(
rollup
.
item_null
);
rollup
.
fields
[
i
].
push_back
(
rollup
.
null_items
[
i
]
);
}
return
0
;
}
...
...
@@ -12663,7 +12673,8 @@ bool JOIN::rollup_make_fields(List<Item> &fields_arg, List<Item> &sel_fields,
{
/* Check if this is something that is part of this group by */
ORDER
*
group_tmp
;
for
(
group_tmp
=
start_group
;
group_tmp
;
group_tmp
=
group_tmp
->
next
)
for
(
group_tmp
=
start_group
,
i
--
;
group_tmp
;
group_tmp
=
group_tmp
->
next
,
i
++
)
{
if
(
*
group_tmp
->
item
==
item
)
{
...
...
@@ -12672,7 +12683,9 @@ bool JOIN::rollup_make_fields(List<Item> &fields_arg, List<Item> &sel_fields,
set to NULL in this level
*/
item
->
maybe_null
=
1
;
// Value will be null sometimes
item
=
rollup
.
item_null
;
Item_null_result
*
null_item
=
rollup
.
null_items
[
i
];
null_item
->
result_field
=
((
Item_field
*
)
item
)
->
result_field
;
item
=
null_item
;
break
;
}
}
...
...
@@ -12732,6 +12745,58 @@ int JOIN::rollup_send_data(uint idx)
return
0
;
}
/*
Write all rollup levels higher than the current one to a temp table
SYNOPSIS:
rollup_write_data()
idx Level we are on:
0 = Total sum level
1 = First group changed (a)
2 = Second group changed (a,b)
table reference to temp table
SAMPLE
SELECT a, b, SUM(c) FROM t1 GROUP BY a,b WITH ROLLUP
RETURN
0 ok
1 if write_data_failed()
*/
int
JOIN
::
rollup_write_data
(
uint
idx
,
TABLE
*
table
)
{
uint
i
;
for
(
i
=
send_group_parts
;
i
--
>
idx
;
)
{
/* Get reference pointers to sum functions in place */
memcpy
((
char
*
)
ref_pointer_array
,
(
char
*
)
rollup
.
ref_pointer_arrays
[
i
],
ref_pointer_array_size
);
if
((
!
having
||
having
->
val_int
()))
{
int
error
;
Item
*
item
;
List_iterator_fast
<
Item
>
it
(
rollup
.
fields
[
i
]);
while
((
item
=
it
++
))
{
if
(
item
->
type
()
==
Item
::
NULL_ITEM
&&
item
->
is_result_field
())
item
->
save_in_result_field
(
1
);
}
copy_sum_funcs
(
sum_funcs_end
[
i
+
1
],
sum_funcs_end
[
i
]);
if
((
error
=
table
->
file
->
write_row
(
table
->
record
[
0
])))
{
if
(
create_myisam_from_heap
(
thd
,
table
,
&
tmp_table_param
,
error
,
0
))
return
1
;
}
}
}
/* Restore ref_pointer_array */
set_items_ref_array
(
current_ref_pointer_array
);
return
0
;
}
/*
clear results if there are not rows found for group
(end_send_group/end_write_group)
...
...
sql/sql_select.h
View file @
b435d6e8
...
...
@@ -135,7 +135,7 @@ typedef struct st_rollup
{
enum
State
{
STATE_NONE
,
STATE_INITED
,
STATE_READY
};
State
state
;
Item
*
item_null
;
Item
_null_result
**
null_items
;
Item
***
ref_pointer_arrays
;
List
<
Item
>
*
fields
;
}
ROLLUP
;
...
...
@@ -323,6 +323,7 @@ class JOIN :public Sql_alloc
bool
rollup_make_fields
(
List
<
Item
>
&
all_fields
,
List
<
Item
>
&
fields
,
Item_sum
***
func
);
int
rollup_send_data
(
uint
idx
);
int
rollup_write_data
(
uint
idx
,
TABLE
*
table
);
bool
test_in_subselect
(
Item
**
where
);
void
join_free
(
bool
full
);
void
clear
();
...
...
sql/sql_string.h
View file @
b435d6e8
...
...
@@ -205,6 +205,10 @@ public:
}
}
}
inline
void
shrink_to_length
()
{
Alloced_length
=
str_length
;
}
bool
is_alloced
()
{
return
alloced
;
}
inline
String
&
operator
=
(
const
String
&
s
)
{
...
...
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