Skip to content

Commit f23b176

Browse files
author
Alexander Nozdrin
committed
Manual merge from mysql-trunk.
Conflicts: - storage/ibmdb2i/ha_ibmdb2i.cc
2 parents cb2c2fd + 9ce5872 commit f23b176

File tree

144 files changed

+4518
-1205
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

144 files changed

+4518
-1205
lines changed

client/mysql_upgrade.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,10 @@ static int run_sql_fix_privilege_tables(void)
783783
found_real_errors++;
784784
print_line(line);
785785
}
786+
else if (strncmp(line, "WARNING", 7) == 0)
787+
{
788+
print_line(line);
789+
}
786790
} while ((line= get_line(line)) && *line);
787791
}
788792

configure.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2113,7 +2113,7 @@ AC_CHECK_FUNCS(alarm bcmp bfill bmove bsearch bzero \
21132113
sighold sigset sigthreadmask port_create sleep \
21142114
snprintf socket stpcpy strcasecmp strerror strsignal strnlen strpbrk strstr \
21152115
strtol strtoll strtoul strtoull tell tempnam thr_setconcurrency vidattr \
2116-
posix_fallocate backtrace backtrace_symbols backtrace_symbols_fd)
2116+
posix_fallocate backtrace backtrace_symbols backtrace_symbols_fd printstack)
21172117

21182118
#
21192119
#

include/my_global.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,7 @@ typedef SOCKET_SIZE_TYPE size_socket;
900900
#define FLT_MAX ((float)3.40282346638528860e+38)
901901
#endif
902902
#ifndef SIZE_T_MAX
903-
#define SIZE_T_MAX ~((size_t) 0)
903+
#define SIZE_T_MAX (~((size_t) 0))
904904
#endif
905905

906906
#ifndef isfinite

include/my_no_pthread.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,13 @@
4848
#define rw_unlock(A)
4949
#define rwlock_destroy(A)
5050

51+
typedef int my_pthread_once_t;
52+
#define MY_PTHREAD_ONCE_INIT 0
53+
#define MY_PTHREAD_ONCE_DONE 1
54+
55+
#define my_pthread_once(C,F) do { \
56+
if (*(C) != MY_PTHREAD_ONCE_DONE) { F(); *(C)= MY_PTHREAD_ONCE_DONE; } \
57+
} while(0)
58+
5159
#endif
5260
#endif /* MY_NO_PTHREAD_INCLUDED */

include/my_pthread.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ typedef int pthread_mutexattr_t;
6868
#define pthread_handler_t EXTERNC void * __cdecl
6969
typedef void * (__cdecl *pthread_handler)(void *);
7070

71+
typedef volatile LONG my_pthread_once_t;
72+
#define MY_PTHREAD_ONCE_INIT 0
73+
#define MY_PTHREAD_ONCE_INPROGRESS 1
74+
#define MY_PTHREAD_ONCE_DONE 2
75+
7176
/*
7277
Struct and macros to be used in combination with the
7378
windows implementation of pthread_cond_timedwait
@@ -112,6 +117,7 @@ int pthread_attr_init(pthread_attr_t *connect_att);
112117
int pthread_attr_setstacksize(pthread_attr_t *connect_att,DWORD stack);
113118
int pthread_attr_setprio(pthread_attr_t *connect_att,int priority);
114119
int pthread_attr_destroy(pthread_attr_t *connect_att);
120+
int my_pthread_once(my_pthread_once_t *once_control,void (*init_routine)(void));
115121
struct tm *localtime_r(const time_t *timep,struct tm *tmp);
116122
struct tm *gmtime_r(const time_t *timep,struct tm *tmp);
117123

@@ -190,6 +196,10 @@ extern int my_pthread_getprio(pthread_t thread_id);
190196
#define pthread_handler_t EXTERNC void *
191197
typedef void *(* pthread_handler)(void *);
192198

199+
#define my_pthread_once_t pthread_once_t
200+
#define MY_PTHREAD_ONCE_INIT PTHREAD_ONCE_INIT
201+
#define my_pthread_once(C,F) pthread_once(C,F)
202+
193203
/* Test first for RTS or FSU threads */
194204

195205
#if defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM)

include/my_stacktrace.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
(defined(__alpha__) && defined(__GNUC__))
2424
#define HAVE_STACKTRACE 1
2525
#endif
26-
#elif defined(__WIN__)
26+
#elif defined(__WIN__) || defined(__sun)
2727
#define HAVE_STACKTRACE 1
2828
#endif
2929

include/my_sys.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -978,7 +978,6 @@ extern my_bool resolve_collation(const char *cl_name,
978978
CHARSET_INFO *default_cl,
979979
CHARSET_INFO **cl);
980980

981-
extern void free_charsets(void);
982981
extern char *get_charsets_dir(char *buf);
983982
extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2);
984983
extern my_bool init_compiled_charsets(myf flags);

include/myisam.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ extern ulong myisam_bulk_insert_tree_size, myisam_data_pointer_size;
259259
/* usually used to check if a symlink points into the mysql data home */
260260
/* which is normally forbidden */
261261
extern int (*myisam_test_invalid_symlink)(const char *filename);
262+
extern ulonglong myisam_mmap_size, myisam_mmap_used;
263+
extern pthread_mutex_t THR_LOCK_myisam_mmap;
262264

263265
/* Prototypes for myisam-functions */
264266

@@ -304,6 +306,7 @@ extern int mi_delete_all_rows(struct st_myisam_info *info);
304306
extern ulong _mi_calc_blob_length(uint length , const uchar *pos);
305307
extern uint mi_get_pointer_length(ulonglong file_length, uint def);
306308

309+
#define MEMMAP_EXTRA_MARGIN 7 /* Write this as a suffix for mmap file */
307310
/* this is used to pass to mysql_myisamchk_table */
308311

309312
#define MYISAMCHK_REPAIR 1 /* equivalent to myisamchk -r */

libmysql/libmysql.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ void STDCALL mysql_server_end()
211211
}
212212
else
213213
{
214-
free_charsets();
215214
mysql_thread_end();
216215
}
217216

mysql-test/collections/default.experimental

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ main.lock_multi_bug38499 # Bug#47448 2009-09-19 alik main.lock_m
1212
main.lock_multi_bug38691 @solaris # Bug#47792 2009-10-02 alik main.lock_multi_bug38691 times out sporadically on Solaris 10
1313
main.log_tables # Bug#47924 2009-10-08 alik main.log_tables times out sporadically
1414
main.plugin # Bug#47146 Linking problem with example plugin when dtrace enabled
15-
main.plugin_load # Bug#47146
1615

17-
rpl.rpl_cross_version* # Bug#48340 2009-12-01 Daogang rpl_cross_version: Found warnings/errors in server log file!
1816
rpl.rpl_get_master_version_and_clock* # Bug#49191 2009-12-01 Daogang rpl_get_master_version_and_clock failed on PB2: COM_REGISTER_SLAVE failed
1917
rpl.rpl_heartbeat_basic # BUG#43828 2009-10-22 luis fails sporadically
2018
rpl.rpl_heartbeat_2slaves # BUG#43828 2009-10-22 luis fails sporadically

mysql-test/extra/rpl_tests/rpl_loaddata.test

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,26 @@ connection slave;
2121
reset master;
2222
connection master;
2323

24+
# MTR is not case-sensitive.
25+
let $lower_stmt_head= load data;
26+
let $UPPER_STMT_HEAD= LOAD DATA;
27+
if (`SELECT '$lock_option' <> ''`)
28+
{
29+
#if $lock_option is null, an extra blank is added into the statement,
30+
#this will change the result of rpl_loaddata test case. so $lock_option
31+
#is set only when it is not null.
32+
let $lower_stmt_head= load data $lock_option;
33+
let $UPPER_STMT_HEAD= LOAD DATA $lock_option;
34+
}
35+
2436
select last_insert_id();
2537
create table t1(a int not null auto_increment, b int, primary key(a) );
26-
load data infile '../../std_data/rpl_loaddata.dat' into table t1;
38+
eval $lower_stmt_head infile '../../std_data/rpl_loaddata.dat' into table t1;
2739
# verify that LAST_INSERT_ID() is set by LOAD DATA INFILE
2840
select last_insert_id();
2941

3042
create temporary table t2 (day date,id int(9),category enum('a','b','c'),name varchar(60));
31-
load data infile '../../std_data/rpl_loaddata2.dat' into table t2 fields terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by '\n##\n' starting by '>' ignore 1 lines;
43+
eval $lower_stmt_head infile '../../std_data/rpl_loaddata2.dat' into table t2 fields terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by '\n##\n' starting by '>' ignore 1 lines;
3244

3345
create table t3 (day date,id int(9),category enum('a','b','c'),name varchar(60));
3446
insert into t3 select * from t2;
@@ -56,7 +68,7 @@ sync_with_master;
5668
insert into t1 values(1,10);
5769

5870
connection master;
59-
load data infile '../../std_data/rpl_loaddata.dat' into table t1;
71+
eval $lower_stmt_head infile '../../std_data/rpl_loaddata.dat' into table t1;
6072

6173
save_master_pos;
6274
connection slave;
@@ -70,17 +82,19 @@ connection slave;
7082
set global sql_slave_skip_counter=1;
7183
start slave;
7284
sync_with_master;
73-
--replace_result $MASTER_MYPORT MASTER_PORT
74-
--replace_column 1 # 8 # 9 # 16 # 23 # 33 #
75-
--query_vertical show slave status;
85+
let $last_error= query_get_value(SHOW SLAVE STATUS, Last_SQL_Errno, 1);
86+
echo Last_SQL_Errno=$last_error;
87+
let $last_error= query_get_value(SHOW SLAVE STATUS, Last_SQL_Error, 1);
88+
echo Last_SQL_Error;
89+
echo $last_error;
7690

7791
# Trigger error again to test CHANGE MASTER
7892

7993
connection master;
8094
set sql_log_bin=0;
8195
delete from t1;
8296
set sql_log_bin=1;
83-
load data infile '../../std_data/rpl_loaddata.dat' into table t1;
97+
eval $lower_stmt_head infile '../../std_data/rpl_loaddata.dat' into table t1;
8498
save_master_pos;
8599
connection slave;
86100
# The SQL slave thread should be stopped now.
@@ -92,9 +106,11 @@ connection slave;
92106
stop slave;
93107
change master to master_user='test';
94108
change master to master_user='root';
95-
--replace_result $MASTER_MYPORT MASTER_PORT
96-
--replace_column 1 # 8 # 9 # 16 # 23 # 33 #
97-
--query_vertical show slave status;
109+
let $last_error= query_get_value(SHOW SLAVE STATUS, Last_SQL_Errno, 1);
110+
echo Last_SQL_Errno=$last_error;
111+
let $last_error= query_get_value(SHOW SLAVE STATUS, Last_SQL_Error, 1);
112+
echo Last_SQL_Error;
113+
echo $last_error;
98114

99115
# Trigger error again to test RESET SLAVE
100116

@@ -105,7 +121,7 @@ connection master;
105121
set sql_log_bin=0;
106122
delete from t1;
107123
set sql_log_bin=1;
108-
load data infile '../../std_data/rpl_loaddata.dat' into table t1;
124+
eval $lower_stmt_head infile '../../std_data/rpl_loaddata.dat' into table t1;
109125
save_master_pos;
110126
connection slave;
111127
# The SQL slave thread should be stopped now.
@@ -114,9 +130,11 @@ connection slave;
114130
# RESET SLAVE and see if error is cleared in SHOW SLAVE STATUS.
115131
stop slave;
116132
reset slave;
117-
--replace_result $MASTER_MYPORT MASTER_PORT
118-
--replace_column 1 # 8 # 9 # 16 # 23 # 33 #
119-
--query_vertical show slave status;
133+
let $last_error= query_get_value(SHOW SLAVE STATUS, Last_SQL_Errno, 1);
134+
echo Last_SQL_Errno=$last_error;
135+
let $last_error= query_get_value(SHOW SLAVE STATUS, Last_SQL_Error, 1);
136+
echo Last_SQL_Error;
137+
echo $last_error;
120138

121139
# Finally, see if logging is done ok on master for a failing LOAD DATA INFILE
122140

@@ -125,7 +143,7 @@ reset master;
125143
eval create table t2 (day date,id int(9),category enum('a','b','c'),name varchar(60),
126144
unique(day)) engine=$engine_type; # no transactions
127145
--error ER_DUP_ENTRY
128-
load data infile '../../std_data/rpl_loaddata2.dat' into table t2 fields
146+
eval $lower_stmt_head infile '../../std_data/rpl_loaddata2.dat' into table t2 fields
129147
terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
130148
'\n##\n' starting by '>' ignore 1 lines;
131149
select * from t2;
@@ -141,7 +159,7 @@ alter table t2 drop key day;
141159
connection master;
142160
delete from t2;
143161
--error ER_DUP_ENTRY
144-
load data infile '../../std_data/rpl_loaddata2.dat' into table t2 fields
162+
eval $lower_stmt_head infile '../../std_data/rpl_loaddata2.dat' into table t2 fields
145163
terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
146164
'\n##\n' starting by '>' ignore 1 lines;
147165
connection slave;
@@ -154,7 +172,7 @@ drop table t1, t2;
154172
CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB;
155173

156174
--error ER_DUP_ENTRY
157-
LOAD DATA INFILE "../../std_data/words.dat" INTO TABLE t1;
175+
eval $UPPER_STMT_HEAD INFILE "../../std_data/words.dat" INTO TABLE t1;
158176

159177
DROP TABLE IF EXISTS t1;
160178

@@ -182,25 +200,25 @@ DROP TABLE IF EXISTS t1;
182200

183201
-- echo ### assertion: works with cross-referenced database
184202
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
185-
-- eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
203+
-- eval $UPPER_STMT_HEAD LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
186204

187205
-- eval use $db1
188206
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
189207
-- echo ### assertion: works with fully qualified name on current database
190208
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
191-
-- eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
209+
-- eval $UPPER_STMT_HEAD LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
192210

193211
-- echo ### assertion: works without fully qualified name on current database
194212
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
195-
-- eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE t1
213+
-- eval $UPPER_STMT_HEAD LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE t1
196214

197215
-- echo ### create connection without default database
198216
-- echo ### connect (conn2,localhost,root,,*NO-ONE*);
199217
connect (conn2,localhost,root,,*NO-ONE*);
200218
-- connection conn2
201219
-- echo ### assertion: works without stating the default database
202220
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
203-
-- eval LOAD DATA LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
221+
-- eval $UPPER_STMT_HEAD LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
204222
-- echo ### disconnect and switch back to master connection
205223
-- disconnect conn2
206224
-- connection master
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# include file for checking if variable key_reads is zero
2+
let $key_reads= query_get_value(SHOW STATUS LIKE 'key_reads',Value,1);
3+
--disable_query_log
4+
eval SELECT IF($key_reads = 0, "Yes!", "No!") as 'Zero key reads?';
5+
FLUSH STATUS;
6+
--enable_query_log

mysql-test/include/check_key_req.inc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# include file for checking if variable key_reads = key_read_requests
2+
let $key_reads= query_get_value(SHOW STATUS LIKE 'key_reads',Value,1);
3+
let $key_r_req= query_get_value(SHOW STATUS LIKE 'key_read_requests',Value,1);
4+
let $key_writes= query_get_value(SHOW STATUS LIKE 'key_writes',Value,1);
5+
let $key_w_req= query_get_value(SHOW STATUS LIKE 'key_write_requests',Value,1);
6+
--disable_query_log
7+
eval SELECT IF($key_reads = $key_r_req, "reads == requests", "reads != requests") as 'reads vs requests';
8+
eval SELECT IF($key_writes = $key_w_req, "writes == requests", "writes != requests") as 'writes vs requests';
9+
--enable_query_log

mysql-test/include/kill_query.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ if (`SELECT '$debug_lock' != ''`)
5252

5353
# reap the result of the waiting query
5454
connection $connection_name;
55-
error 0, 1317, 1307, 1306, 1334, 1305;
55+
error 0, 1317, 1307, 1306, 1334, 1305, 1034;
5656
reap;
5757

5858
connection master;

mysql-test/mysql-test-run.pl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,17 +1843,19 @@ sub environment_setup {
18431843
}
18441844
else
18451845
{
1846-
$semisync_master_filename = "libsemisync_master.so";
1847-
$semisync_slave_filename = "libsemisync_slave.so";
1846+
$semisync_master_filename = "semisync_master.so";
1847+
$semisync_slave_filename = "semisync_slave.so";
18481848
}
18491849
my $lib_semisync_master_plugin=
18501850
mtr_file_exists(vs_config_dirs('plugin/semisync',$semisync_master_filename),
18511851
"$basedir/plugin/semisync/.libs/" . $semisync_master_filename,
1852-
"$basedir/lib/mysql/plugin/" . $semisync_master_filename);
1852+
"$basedir/lib/mysql/plugin/" . $semisync_master_filename,
1853+
"$basedir/lib/plugin/" . $semisync_master_filename);
18531854
my $lib_semisync_slave_plugin=
18541855
mtr_file_exists(vs_config_dirs('plugin/semisync',$semisync_slave_filename),
18551856
"$basedir/plugin/semisync/.libs/" . $semisync_slave_filename,
1856-
"$basedir/lib/mysql/plugin/" . $semisync_slave_filename);
1857+
"$basedir/lib/mysql/plugin/" . $semisync_slave_filename,
1858+
"$basedir/lib/plugin/" . $semisync_slave_filename);
18571859
if ($lib_semisync_master_plugin && $lib_semisync_slave_plugin)
18581860
{
18591861
$ENV{'SEMISYNC_MASTER_PLUGIN'}= basename($lib_semisync_master_plugin);

mysql-test/r/ctype_ldml.result

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,3 +369,8 @@ s1
369369
a
370370
b
371371
DROP TABLE t1;
372+
SET NAMES utf8 COLLATE utf8_test_ci;
373+
SHOW COLLATION LIKE 'utf8_test_ci';
374+
Collation Charset Id Default Compiled Sortlen
375+
utf8_test_ci utf8 353 8
376+
SET NAMES utf8;

mysql-test/r/ctype_ucs.result

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,26 @@ select binary 'a a' > 'a', binary 'a \0' > 'a', binary 'a\0' > 'a';
116116
binary 'a a' > 'a' binary 'a \0' > 'a' binary 'a\0' > 'a'
117117
1 1 1
118118
SET CHARACTER SET koi8r;
119+
create table t1 (a varchar(2) character set ucs2 collate ucs2_bin, key(a));
120+
insert into t1 values ('A'),('A'),('B'),('C'),('D'),('A\t');
121+
insert into t1 values ('A\0'),('A\0'),('A\0'),('A\0'),('AZ');
122+
select hex(a) from t1 where a like 'A_' order by a;
123+
hex(a)
124+
00410000
125+
00410000
126+
00410000
127+
00410000
128+
00410009
129+
0041005A
130+
select hex(a) from t1 ignore key(a) where a like 'A_' order by a;
131+
hex(a)
132+
00410000
133+
00410000
134+
00410000
135+
00410000
136+
00410009
137+
0041005A
138+
drop table t1;
119139
CREATE TABLE t1 (word VARCHAR(64) CHARACTER SET ucs2, word2 CHAR(64) CHARACTER SET ucs2);
120140
INSERT INTO t1 VALUES (_koi8r'�',_koi8r'�'), (X'2004',X'2004');
121141
SELECT hex(word) FROM t1 ORDER BY word;

mysql-test/r/ctype_utf8.result

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,6 +1848,24 @@ select hex(_utf8 B'001111111111');
18481848
ERROR HY000: Invalid utf8 character string: 'FF'
18491849
select (_utf8 X'616263FF');
18501850
ERROR HY000: Invalid utf8 character string: 'FF'
1851+
#
1852+
# Bug#44131 Binary-mode "order by" returns records in incorrect order for UTF-8 strings
1853+
#
1854+
CREATE TABLE t1 (id int not null primary key, name varchar(10)) character set utf8;
1855+
INSERT INTO t1 VALUES
1856+
(2,'一二三01'),(3,'一二三09'),(4,'一二三02'),(5,'一二三08'),
1857+
(6,'一二三11'),(7,'一二三91'),(8,'一二三21'),(9,'一二三81');
1858+
SELECT * FROM t1 ORDER BY BINARY(name);
1859+
id name
1860+
2 一二三01
1861+
4 一二三02
1862+
5 一二三08
1863+
3 一二三09
1864+
6 一二三11
1865+
8 一二三21
1866+
9 一二三81
1867+
7 一二三91
1868+
DROP TABLE t1;
18511869
CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL);
18521870
INSERT INTO t1 VALUES (70000, 1092), (70001, 1085), (70002, 1065);
18531871
SELECT CONVERT(a, CHAR), CONVERT(b, CHAR) FROM t1 GROUP BY b;

0 commit comments

Comments
 (0)