Merge gleb.loc:/home/uchum/work/bk/5.0
into gleb.loc:/home/uchum/work/bk/5.0-opt sql/sql_class.h: Auto merged
This commit is contained in:
commit
e0f93ca8c1
@ -1,4 +1,4 @@
|
|||||||
drop table if exists t1,t2;
|
drop table if exists t1,t2,t3,t4;
|
||||||
create table t1 (
|
create table t1 (
|
||||||
c_id int(11) not null default '0',
|
c_id int(11) not null default '0',
|
||||||
org_id int(11) default null,
|
org_id int(11) default null,
|
||||||
@ -676,4 +676,55 @@ INSERT INTO t1 VALUES (1);
|
|||||||
switch to connection default
|
switch to connection default
|
||||||
SET AUTOCOMMIT=default;
|
SET AUTOCOMMIT=default;
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id int NOT NULL auto_increment PRIMARY KEY,
|
||||||
|
b int NOT NULL,
|
||||||
|
c datetime NOT NULL,
|
||||||
|
INDEX idx_b(b),
|
||||||
|
INDEX idx_c(c)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
b int NOT NULL auto_increment PRIMARY KEY,
|
||||||
|
c datetime NOT NULL
|
||||||
|
) ENGINE= MyISAM;
|
||||||
|
INSERT INTO t2(c) VALUES ('2007-01-01');
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t1(b,c) SELECT b,c FROM t2;
|
||||||
|
UPDATE t2 SET c='2007-01-02';
|
||||||
|
INSERT INTO t1(b,c) SELECT b,c FROM t2;
|
||||||
|
UPDATE t2 SET c='2007-01-03';
|
||||||
|
INSERT INTO t1(b,c) SELECT b,c FROM t2;
|
||||||
|
set @@sort_buffer_size=8192;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
COUNT(*)
|
||||||
|
3072
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(*) FROM t1
|
||||||
|
WHERE (c >= '2007-01-02' AND c <= '2007-01-03') OR b >= 1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL idx_b,idx_c NULL NULL NULL # Using where
|
||||||
|
SELECT COUNT(*) FROM t1
|
||||||
|
WHERE (c >= '2007-01-02' AND c <= '2007-01-03') OR b >= 1;
|
||||||
|
COUNT(*)
|
||||||
|
3072
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(*) FROM t1 FORCE INDEX(idx_b, idx_c)
|
||||||
|
WHERE (c >= '2007-01-02' AND c <= '2007-01-03') OR b >= 1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index_merge idx_b,idx_c idx_c,idx_b 8,4 NULL # Using sort_union(idx_c,idx_b); Using where
|
||||||
|
SELECT COUNT(*) FROM t1 FORCE INDEX(idx_b, idx_c)
|
||||||
|
WHERE (c >= '2007-01-02' AND c <= '2007-01-03') OR b >= 1;
|
||||||
|
COUNT(*)
|
||||||
|
3072
|
||||||
|
set @@sort_buffer_size=default;
|
||||||
|
DROP TABLE t1,t2;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
|
@ -86,6 +86,60 @@ field1 field2
|
|||||||
a"b cd"ef
|
a"b cd"ef
|
||||||
a"b c"d"e
|
a"b c"d"e
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
c1 VARCHAR(255)
|
||||||
|
);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
id INT,
|
||||||
|
c2 VARCHAR(255)
|
||||||
|
);
|
||||||
|
INSERT INTO t1 (c1) VALUES
|
||||||
|
('r'), ('rr'), ('rrr'), ('rrrr'),
|
||||||
|
('.r'), ('.rr'), ('.rrr'), ('.rrrr'),
|
||||||
|
('r.'), ('rr.'), ('rrr.'), ('rrrr.'),
|
||||||
|
('.r.'), ('.rr.'), ('.rrr.'), ('.rrrr.');
|
||||||
|
SELECT * FROM t1;
|
||||||
|
id c1
|
||||||
|
1 r
|
||||||
|
2 rr
|
||||||
|
3 rrr
|
||||||
|
4 rrrr
|
||||||
|
5 .r
|
||||||
|
6 .rr
|
||||||
|
7 .rrr
|
||||||
|
8 .rrrr
|
||||||
|
9 r.
|
||||||
|
10 rr.
|
||||||
|
11 rrr.
|
||||||
|
12 rrrr.
|
||||||
|
13 .r.
|
||||||
|
14 .rr.
|
||||||
|
15 .rrr.
|
||||||
|
16 .rrrr.
|
||||||
|
SELECT * INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/t1' FIELDS ENCLOSED BY 'r' FROM t1;
|
||||||
|
r1r rrrr
|
||||||
|
r2r rrrrrr
|
||||||
|
r3r rrrrrrrr
|
||||||
|
r4r rrrrrrrrrr
|
||||||
|
r5r r.rrr
|
||||||
|
r6r r.rrrrr
|
||||||
|
r7r r.rrrrrrr
|
||||||
|
r8r r.rrrrrrrrr
|
||||||
|
r9r rrr.r
|
||||||
|
r10r rrrrr.r
|
||||||
|
r11r rrrrrrr.r
|
||||||
|
r12r rrrrrrrrr.r
|
||||||
|
r13r r.rr.r
|
||||||
|
r14r r.rrrr.r
|
||||||
|
r15r r.rrrrrr.r
|
||||||
|
r16r r.rrrrrrrr.r
|
||||||
|
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/t1' INTO TABLE t2 FIELDS ENCLOSED BY 'r';
|
||||||
|
SELECT t1.id, c1, c2 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE c1 != c2;
|
||||||
|
id c1 c2
|
||||||
|
SELECT t1.id, c1, c2 FROM t1 RIGHT JOIN t2 ON t1.id=t2.id WHERE c1 != c2;
|
||||||
|
id c1 c2
|
||||||
|
DROP TABLE t1,t2;
|
||||||
create table t1 (a int default 100, b int, c varchar(60));
|
create table t1 (a int default 100, b int, c varchar(60));
|
||||||
load data infile '../std_data_ln/rpl_loaddata.dat' into table t1 (a, @b) set b=@b+10, c=concat("b=",@b);
|
load data infile '../std_data_ln/rpl_loaddata.dat' into table t1 (a, @b) set b=@b+10, c=concat("b=",@b);
|
||||||
select * from t1;
|
select * from t1;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t1,t2;
|
drop table if exists t1,t2,t3,t4;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
# BUG#16798: Uninitialized row buffer reads in ref-or-null optimizer
|
# BUG#16798: Uninitialized row buffer reads in ref-or-null optimizer
|
||||||
@ -670,5 +670,61 @@ DISCONNECT c1;
|
|||||||
DISCONNECT c2;
|
DISCONNECT c2;
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #25798: a query with forced index merge returns wrong result
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id int NOT NULL auto_increment PRIMARY KEY,
|
||||||
|
b int NOT NULL,
|
||||||
|
c datetime NOT NULL,
|
||||||
|
INDEX idx_b(b),
|
||||||
|
INDEX idx_c(c)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
b int NOT NULL auto_increment PRIMARY KEY,
|
||||||
|
c datetime NOT NULL
|
||||||
|
) ENGINE= MyISAM;
|
||||||
|
|
||||||
|
INSERT INTO t2(c) VALUES ('2007-01-01');
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
INSERT INTO t2(c) SELECT c FROM t2;
|
||||||
|
|
||||||
|
INSERT INTO t1(b,c) SELECT b,c FROM t2;
|
||||||
|
UPDATE t2 SET c='2007-01-02';
|
||||||
|
INSERT INTO t1(b,c) SELECT b,c FROM t2;
|
||||||
|
UPDATE t2 SET c='2007-01-03';
|
||||||
|
INSERT INTO t1(b,c) SELECT b,c FROM t2;
|
||||||
|
|
||||||
|
set @@sort_buffer_size=8192;
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
|
||||||
|
--replace_column 9 #
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(*) FROM t1
|
||||||
|
WHERE (c >= '2007-01-02' AND c <= '2007-01-03') OR b >= 1;
|
||||||
|
SELECT COUNT(*) FROM t1
|
||||||
|
WHERE (c >= '2007-01-02' AND c <= '2007-01-03') OR b >= 1;
|
||||||
|
|
||||||
|
--replace_column 9 #
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(*) FROM t1 FORCE INDEX(idx_b, idx_c)
|
||||||
|
WHERE (c >= '2007-01-02' AND c <= '2007-01-03') OR b >= 1;
|
||||||
|
SELECT COUNT(*) FROM t1 FORCE INDEX(idx_b, idx_c)
|
||||||
|
WHERE (c >= '2007-01-02' AND c <= '2007-01-03') OR b >= 1;
|
||||||
|
|
||||||
|
set @@sort_buffer_size=default;
|
||||||
|
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
@ -67,6 +67,41 @@ load data infile '../std_data_ln/loaddata_dq.dat' into table t1 fields terminate
|
|||||||
select * from t1;
|
select * from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #29294 SELECT INTO OUTFILE/LOAD DATA INFILE with special
|
||||||
|
# characters in the FIELDS ENCLOSED BY clause
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
c1 VARCHAR(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
id INT,
|
||||||
|
c2 VARCHAR(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO t1 (c1) VALUES
|
||||||
|
('r'), ('rr'), ('rrr'), ('rrrr'),
|
||||||
|
('.r'), ('.rr'), ('.rrr'), ('.rrrr'),
|
||||||
|
('r.'), ('rr.'), ('rrr.'), ('rrrr.'),
|
||||||
|
('.r.'), ('.rr.'), ('.rrr.'), ('.rrrr.');
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
--exec rm -f $MYSQLTEST_VARDIR/tmp/t1
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1' FIELDS ENCLOSED BY 'r' FROM t1;
|
||||||
|
--exec cat $MYSQLTEST_VARDIR/tmp/t1
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t1' INTO TABLE t2 FIELDS ENCLOSED BY 'r';
|
||||||
|
SELECT t1.id, c1, c2 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE c1 != c2;
|
||||||
|
SELECT t1.id, c1, c2 FROM t1 RIGHT JOIN t2 ON t1.id=t2.id WHERE c1 != c2;
|
||||||
|
|
||||||
|
--exec rm $MYSQLTEST_VARDIR/tmp/t1
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1052,6 +1052,7 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file,
|
|||||||
BUFFPEK *buffpek;
|
BUFFPEK *buffpek;
|
||||||
QUEUE queue;
|
QUEUE queue;
|
||||||
qsort2_cmp cmp;
|
qsort2_cmp cmp;
|
||||||
|
void *first_cmp_arg;
|
||||||
volatile THD::killed_state *killed= ¤t_thd->killed;
|
volatile THD::killed_state *killed= ¤t_thd->killed;
|
||||||
THD::killed_state not_killable;
|
THD::killed_state not_killable;
|
||||||
DBUG_ENTER("merge_buffers");
|
DBUG_ENTER("merge_buffers");
|
||||||
@ -1077,9 +1078,18 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file,
|
|||||||
/* The following will fire if there is not enough space in sort_buffer */
|
/* The following will fire if there is not enough space in sort_buffer */
|
||||||
DBUG_ASSERT(maxcount!=0);
|
DBUG_ASSERT(maxcount!=0);
|
||||||
|
|
||||||
|
if (param->unique_buff)
|
||||||
|
{
|
||||||
|
cmp= param->compare;
|
||||||
|
first_cmp_arg= (void *) ¶m->cmp_context;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cmp= get_ptr_compare(sort_length);
|
||||||
|
first_cmp_arg= (void*) &sort_length;
|
||||||
|
}
|
||||||
if (init_queue(&queue, (uint) (Tb-Fb)+1, offsetof(BUFFPEK,key), 0,
|
if (init_queue(&queue, (uint) (Tb-Fb)+1, offsetof(BUFFPEK,key), 0,
|
||||||
(queue_compare) (cmp= get_ptr_compare(sort_length)),
|
(queue_compare) cmp, first_cmp_arg))
|
||||||
(void*) &sort_length))
|
|
||||||
DBUG_RETURN(1); /* purecov: inspected */
|
DBUG_RETURN(1); /* purecov: inspected */
|
||||||
for (buffpek= Fb ; buffpek <= Tb ; buffpek++)
|
for (buffpek= Fb ; buffpek <= Tb ; buffpek++)
|
||||||
{
|
{
|
||||||
@ -1132,7 +1142,7 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file,
|
|||||||
buffpek= (BUFFPEK*) queue_top(&queue);
|
buffpek= (BUFFPEK*) queue_top(&queue);
|
||||||
if (cmp) // Remove duplicates
|
if (cmp) // Remove duplicates
|
||||||
{
|
{
|
||||||
if (!(*cmp)(&sort_length, &(param->unique_buff),
|
if (!(*cmp)(first_cmp_arg, &(param->unique_buff),
|
||||||
(uchar**) &buffpek->key))
|
(uchar**) &buffpek->key))
|
||||||
goto skip_duplicate;
|
goto skip_duplicate;
|
||||||
memcpy(param->unique_buff, (uchar*) buffpek->key, rec_length);
|
memcpy(param->unique_buff, (uchar*) buffpek->key, rec_length);
|
||||||
@ -1184,7 +1194,7 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file,
|
|||||||
*/
|
*/
|
||||||
if (cmp)
|
if (cmp)
|
||||||
{
|
{
|
||||||
if (!(*cmp)(&sort_length, &(param->unique_buff), (uchar**) &buffpek->key))
|
if (!(*cmp)(first_cmp_arg, &(param->unique_buff), (uchar**) &buffpek->key))
|
||||||
{
|
{
|
||||||
buffpek->key+= rec_length; // Remove duplicate
|
buffpek->key+= rec_length; // Remove duplicate
|
||||||
--buffpek->mem_count;
|
--buffpek->mem_count;
|
||||||
|
10
sql/log.cc
10
sql/log.cc
@ -85,7 +85,7 @@ bool binlog_init()
|
|||||||
static int binlog_close_connection(THD *thd)
|
static int binlog_close_connection(THD *thd)
|
||||||
{
|
{
|
||||||
IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot];
|
IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot];
|
||||||
DBUG_ASSERT(mysql_bin_log.is_open() && !my_b_tell(trans_log));
|
DBUG_ASSERT(!my_b_tell(trans_log));
|
||||||
close_cached_file(trans_log);
|
close_cached_file(trans_log);
|
||||||
my_free((gptr)trans_log, MYF(0));
|
my_free((gptr)trans_log, MYF(0));
|
||||||
return 0;
|
return 0;
|
||||||
@ -126,7 +126,7 @@ static int binlog_commit(THD *thd, bool all)
|
|||||||
{
|
{
|
||||||
IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot];
|
IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot];
|
||||||
DBUG_ENTER("binlog_commit");
|
DBUG_ENTER("binlog_commit");
|
||||||
DBUG_ASSERT(mysql_bin_log.is_open() &&
|
DBUG_ASSERT(
|
||||||
(all || !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))));
|
(all || !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))));
|
||||||
|
|
||||||
if (my_b_tell(trans_log) == 0)
|
if (my_b_tell(trans_log) == 0)
|
||||||
@ -155,7 +155,7 @@ static int binlog_rollback(THD *thd, bool all)
|
|||||||
unnecessary, doing extra work. The cause should be found and eliminated
|
unnecessary, doing extra work. The cause should be found and eliminated
|
||||||
*/
|
*/
|
||||||
DBUG_ASSERT(all || !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)));
|
DBUG_ASSERT(all || !(thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)));
|
||||||
DBUG_ASSERT(mysql_bin_log.is_open() && my_b_tell(trans_log));
|
DBUG_ASSERT(my_b_tell(trans_log));
|
||||||
/*
|
/*
|
||||||
Update the binary log with a BEGIN/ROLLBACK block if we have
|
Update the binary log with a BEGIN/ROLLBACK block if we have
|
||||||
cached some queries and we updated some non-transactional
|
cached some queries and we updated some non-transactional
|
||||||
@ -198,7 +198,7 @@ static int binlog_savepoint_set(THD *thd, void *sv)
|
|||||||
{
|
{
|
||||||
IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot];
|
IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot];
|
||||||
DBUG_ENTER("binlog_savepoint_set");
|
DBUG_ENTER("binlog_savepoint_set");
|
||||||
DBUG_ASSERT(mysql_bin_log.is_open() && my_b_tell(trans_log));
|
DBUG_ASSERT(my_b_tell(trans_log));
|
||||||
|
|
||||||
*(my_off_t *)sv= my_b_tell(trans_log);
|
*(my_off_t *)sv= my_b_tell(trans_log);
|
||||||
/* Write it to the binary log */
|
/* Write it to the binary log */
|
||||||
@ -210,7 +210,7 @@ static int binlog_savepoint_rollback(THD *thd, void *sv)
|
|||||||
{
|
{
|
||||||
IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot];
|
IO_CACHE *trans_log= (IO_CACHE*)thd->ha_data[binlog_hton.slot];
|
||||||
DBUG_ENTER("binlog_savepoint_rollback");
|
DBUG_ENTER("binlog_savepoint_rollback");
|
||||||
DBUG_ASSERT(mysql_bin_log.is_open() && my_b_tell(trans_log));
|
DBUG_ASSERT(my_b_tell(trans_log));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Write ROLLBACK TO SAVEPOINT to the binlog cache if we have updated some
|
Write ROLLBACK TO SAVEPOINT to the binlog cache if we have updated some
|
||||||
|
@ -1209,6 +1209,7 @@ select_export::prepare(List<Item> &list, SELECT_LEX_UNIT *u)
|
|||||||
field_sep_char= (exchange->enclosed->length() ? (*exchange->enclosed)[0] :
|
field_sep_char= (exchange->enclosed->length() ? (*exchange->enclosed)[0] :
|
||||||
field_term_length ? (*exchange->field_term)[0] : INT_MAX);
|
field_term_length ? (*exchange->field_term)[0] : INT_MAX);
|
||||||
escape_char= (exchange->escaped->length() ? (*exchange->escaped)[0] : -1);
|
escape_char= (exchange->escaped->length() ? (*exchange->escaped)[0] : -1);
|
||||||
|
is_ambiguous_field_sep= test(strchr(ESCAPE_CHARS, field_sep_char));
|
||||||
line_sep_char= (exchange->line_term->length() ?
|
line_sep_char= (exchange->line_term->length() ?
|
||||||
(*exchange->line_term)[0] : INT_MAX);
|
(*exchange->line_term)[0] : INT_MAX);
|
||||||
if (!field_term_length)
|
if (!field_term_length)
|
||||||
@ -1349,7 +1350,9 @@ bool select_export::send_data(List<Item> &items)
|
|||||||
NEED_ESCAPING(pos[1])))
|
NEED_ESCAPING(pos[1])))
|
||||||
{
|
{
|
||||||
char tmp_buff[2];
|
char tmp_buff[2];
|
||||||
tmp_buff[0]= escape_char;
|
tmp_buff[0]= ((int) *pos == field_sep_char &&
|
||||||
|
is_ambiguous_field_sep) ?
|
||||||
|
field_sep_char : escape_char;
|
||||||
tmp_buff[1]= *pos ? *pos : '0';
|
tmp_buff[1]= *pos ? *pos : '0';
|
||||||
if (my_b_write(&cache,(byte*) start,(uint) (pos-start)) ||
|
if (my_b_write(&cache,(byte*) start,(uint) (pos-start)) ||
|
||||||
my_b_write(&cache,(byte*) tmp_buff,2))
|
my_b_write(&cache,(byte*) tmp_buff,2))
|
||||||
|
@ -1926,9 +1926,18 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define ESCAPE_CHARS "ntrb0ZN" // keep synchronous with READ_INFO::unescape
|
||||||
|
|
||||||
|
|
||||||
class select_export :public select_to_file {
|
class select_export :public select_to_file {
|
||||||
uint field_term_length;
|
uint field_term_length;
|
||||||
int field_sep_char,escape_char,line_sep_char;
|
int field_sep_char,escape_char,line_sep_char;
|
||||||
|
/*
|
||||||
|
The is_ambiguous_field_sep field is true if a value of the field_sep_char
|
||||||
|
field is one of the 'n', 't', 'r' etc characters
|
||||||
|
(see the READ_INFO::unescape method and the ESCAPE_CHARS constant value).
|
||||||
|
*/
|
||||||
|
bool is_ambiguous_field_sep;
|
||||||
bool fixed_row_size;
|
bool fixed_row_size;
|
||||||
public:
|
public:
|
||||||
select_export(sql_exchange *ex) :select_to_file(ex) {}
|
select_export(sql_exchange *ex) :select_to_file(ex) {}
|
||||||
|
@ -847,6 +847,7 @@ continue_loop:;
|
|||||||
char
|
char
|
||||||
READ_INFO::unescape(char chr)
|
READ_INFO::unescape(char chr)
|
||||||
{
|
{
|
||||||
|
/* keep this switch synchornous with the ESCAPE_CHARS macro */
|
||||||
switch(chr) {
|
switch(chr) {
|
||||||
case 'n': return '\n';
|
case 'n': return '\n';
|
||||||
case 't': return '\t';
|
case 't': return '\t';
|
||||||
|
@ -1909,11 +1909,9 @@ bool uses_only_table_name_fields(Item *item, TABLE_LIST *table)
|
|||||||
if (item->type() == Item::FUNC_ITEM)
|
if (item->type() == Item::FUNC_ITEM)
|
||||||
{
|
{
|
||||||
Item_func *item_func= (Item_func*)item;
|
Item_func *item_func= (Item_func*)item;
|
||||||
Item **child;
|
for (uint i=0; i<item_func->argument_count(); i++)
|
||||||
Item **item_end= (item_func->arguments()) + item_func->argument_count();
|
|
||||||
for (child= item_func->arguments(); child != item_end; child++)
|
|
||||||
{
|
{
|
||||||
if (!uses_only_table_name_fields(*child, table))
|
if (!uses_only_table_name_fields(item_func->arguments()[i], table))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,12 @@ typedef struct st_buffpek { /* Struktur om sorteringsbuffrarna */
|
|||||||
ulong max_keys; /* Max keys in buffert */
|
ulong max_keys; /* Max keys in buffert */
|
||||||
} BUFFPEK;
|
} BUFFPEK;
|
||||||
|
|
||||||
|
struct BUFFPEK_COMPARE_CONTEXT
|
||||||
|
{
|
||||||
|
qsort_cmp2 key_compare;
|
||||||
|
void *key_compare_arg;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct st_sort_param {
|
typedef struct st_sort_param {
|
||||||
uint rec_length; /* Length of sorted records */
|
uint rec_length; /* Length of sorted records */
|
||||||
uint sort_length; /* Length of sorted columns */
|
uint sort_length; /* Length of sorted columns */
|
||||||
@ -65,6 +71,9 @@ typedef struct st_sort_param {
|
|||||||
uchar *unique_buff;
|
uchar *unique_buff;
|
||||||
bool not_killable;
|
bool not_killable;
|
||||||
char* tmp_buffer;
|
char* tmp_buffer;
|
||||||
|
/* The fields below are used only by Unique class */
|
||||||
|
qsort2_cmp compare;
|
||||||
|
BUFFPEK_COMPARE_CONTEXT cmp_context;
|
||||||
} SORTPARAM;
|
} SORTPARAM;
|
||||||
|
|
||||||
|
|
||||||
|
@ -361,17 +361,12 @@ Unique::reset()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The comparison function, passed to queue_init() in merge_walk() must
|
The comparison function, passed to queue_init() in merge_walk() and in
|
||||||
|
merge_buffers() when the latter is called from Uniques::get() must
|
||||||
use comparison function of Uniques::tree, but compare members of struct
|
use comparison function of Uniques::tree, but compare members of struct
|
||||||
BUFFPEK.
|
BUFFPEK.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct BUFFPEK_COMPARE_CONTEXT
|
|
||||||
{
|
|
||||||
qsort_cmp2 key_compare;
|
|
||||||
void *key_compare_arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
C_MODE_START
|
C_MODE_START
|
||||||
|
|
||||||
static int buffpek_compare(void *arg, byte *key_ptr1, byte *key_ptr2)
|
static int buffpek_compare(void *arg, byte *key_ptr1, byte *key_ptr2)
|
||||||
@ -630,6 +625,10 @@ bool Unique::get(TABLE *table)
|
|||||||
sort_param.unique_buff= sort_buffer+(sort_param.keys*
|
sort_param.unique_buff= sort_buffer+(sort_param.keys*
|
||||||
sort_param.sort_length);
|
sort_param.sort_length);
|
||||||
|
|
||||||
|
sort_param.compare= (qsort2_cmp) buffpek_compare;
|
||||||
|
sort_param.cmp_context.key_compare= tree.compare;
|
||||||
|
sort_param.cmp_context.key_compare_arg= tree.custom_arg;
|
||||||
|
|
||||||
/* Merge the buffers to one file, removing duplicates */
|
/* Merge the buffers to one file, removing duplicates */
|
||||||
if (merge_many_buff(&sort_param,sort_buffer,file_ptr,&maxbuffer,&file))
|
if (merge_many_buff(&sort_param,sort_buffer,file_ptr,&maxbuffer,&file))
|
||||||
goto err;
|
goto err;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user