Merge bk-internal:/home/bk/mysql-5.1-new-rpl

into  neptunus.(none):/home/msvensson/mysql/mysql-5.1-new-maint


client/mysql.cc:
  Auto merged
include/m_ctype.h:
  Auto merged
mysql-test/r/ctype_utf8.result:
  Auto merged
mysql-test/r/ps.result:
  Auto merged
mysql-test/r/strict.result:
  Auto merged
mysql-test/r/view.result:
  Auto merged
mysql-test/r/warnings.result:
  Auto merged
mysql-test/t/ctype_utf8.test:
  Auto merged
sql/field.cc:
  Auto merged
sql/item_func.cc:
  Auto merged
sql/sql_yacc.yy:
  Auto merged
This commit is contained in:
unknown 2006-10-03 15:56:56 +02:00
commit c9970c5b41
55 changed files with 1490 additions and 400 deletions

View file

@ -2497,9 +2497,14 @@ print_table_data_xml(MYSQL_RES *result)
{
tee_fprintf(PAGER, "\t<field name=\"");
xmlencode_print(fields[i].name, (uint) strlen(fields[i].name));
tee_fprintf(PAGER, "\">");
xmlencode_print(cur[i], lengths[i]);
tee_fprintf(PAGER, "</field>\n");
if (cur[i])
{
tee_fprintf(PAGER, "\">");
xmlencode_print(cur[i], lengths[i]);
tee_fprintf(PAGER, "</field>\n");
}
else
tee_fprintf(PAGER, "\" xsi:nil=\"true\" />\n");
}
(void) tee_fputs(" </row>\n", PAGER);
}

View file

@ -217,6 +217,9 @@ typedef struct my_charset_handler_st
int *err);
longlong (*strtoll10)(struct charset_info_st *cs,
const char *nptr, char **endptr, int *error);
ulonglong (*strntoull10rnd)(struct charset_info_st *cs,
const char *str, uint length, int unsigned_fl,
char **endptr, int *error);
ulong (*scan)(struct charset_info_st *, const char *b, const char *e,
int sq);
} MY_CHARSET_HANDLER;
@ -358,6 +361,13 @@ longlong my_strtoll10_8bit(CHARSET_INFO *cs,
longlong my_strtoll10_ucs2(CHARSET_INFO *cs,
const char *nptr, char **endptr, int *error);
ulonglong my_strntoull10rnd_8bit(CHARSET_INFO *cs,
const char *str, uint length, int unsigned_fl,
char **endptr, int *error);
ulonglong my_strntoull10rnd_ucs2(CHARSET_INFO *cs,
const char *str, uint length, int unsigned_fl,
char **endptr, int *error);
void my_fill_8bit(CHARSET_INFO *cs, char* to, uint l, int fill);
my_bool my_like_range_simple(CHARSET_INFO *cs,

View file

@ -4,25 +4,39 @@ create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
# Verify that only one INSERT_ID event is binlogged.
# Note, that because of WL#3368 mixed mode binlog records RBR events for the delayed
let $table=t1;
let $rows_inserted=11; # total number of inserted rows in this test
insert delayed into t1 values (207);
let $count=1;
# We use sleeps between statements, that's the only way to get a
# repeatable binlog in a normal test run and under Valgrind. The
# reason is that without sleeps, rows of different INSERT DELAYEDs
# sometimes group together and sometimes not, so the table may be
# unlocked/relocked causing a different number of table map log
# events.
sleep 2;
# use this macro instead of sleeps.
--source include/wait_until_rows_count.inc
insert delayed into t1 values (null);
sleep 2;
inc $count;
--source include/wait_until_rows_count.inc
insert delayed into t1 values (300);
sleep 2; # time for the delayed queries to reach disk
insert delayed into t1 values (null),(null),(null),(null);
sleep 2;
insert delayed into t1 values (null),(null),(400),(null);
sleep 2;
select * from t1;
inc $count;
--source include/wait_until_rows_count.inc
# moving binlog check affront of multi-rows queries which work is indeterministic (extra table_maps)
# todo: better check is to substitute SHOW BINLOG with reading from binlog, probably bug#19459 is in
# the way
--replace_column 2 # 5 #
--replace_regex /table_id: [0-9]+/table_id: #/
show binlog events from 102;
insert delayed into t1 values (null),(null),(null),(null);
inc $count; inc $count; inc $count; inc $count;
--source include/wait_until_rows_count.inc
insert delayed into t1 values (null),(null),(400),(null);
inc $count; inc $count; inc $count; inc $count;
--source include/wait_until_rows_count.inc
#check this assertion about $count calculation
--echo $count == $rows_inserted
select * from t1;
drop table t1;

View file

@ -0,0 +1,52 @@
# include/wait_until_rows_count.inc
# inspired by wait_for_slave_status by Matthias Leich
#
# SUMMARY
#
# Waits until SELECT count(*)-$count from $table returns zero
#
# USAGE
#
# Set vars like
# let $count=11;
# let $table=t1;
# # invoke the macro
# --include wait_until_rows_count.inc
#
# EXAMPLE
# extra/binlog/binlog_insert_delayed.test
#
#
# TODO: generalize up to wait_[until|while] with arbitrary select or even query and
# a condition to wait or get awakened
# It's impossible to implement such a "most" general macro without
# extending mysqltest. Just no way to pass a query as an argument and
# evaluate it here, like eval "$quuery". One is bound
# to specify it inside of the macro
--disable_query_log
let $wait_counter= 300; # max wait in 0.1 seconds
while ($wait_counter)
{
eval select count(*)-$count from $table into @rez;
let $rez=`select @rez`;
let $success=`SELECT @rez = 0`;
let $no_success=1;
if ($success)
{
let $wait_counter= 1; # droppping counter to leave loop
let $no_success=0;
}
if ($no_success)
{
--sleep 0.1
}
dec $wait_counter;
}
--enable_query_log
if ($no_success)
{
--die Timeout in wait_until_rows_count.inc, required table never had a prescribed number of rows.
}

View file

@ -250,21 +250,6 @@ set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
insert delayed into t1 values (207);
insert delayed into t1 values (null);
insert delayed into t1 values (300);
insert delayed into t1 values (null),(null),(null),(null);
insert delayed into t1 values (null),(null),(400),(null);
select * from t1;
a
207
208
300
301
302
303
304
305
306
400
401
show binlog events from 102;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Query 1 # use `test`; create table t1 (id tinyint auto_increment primary key)
@ -278,12 +263,20 @@ master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
insert delayed into t1 values (null),(null),(null),(null);
insert delayed into t1 values (null),(null),(400),(null);
11 == 11
select * from t1;
a
207
208
300
301
302
303
304
305
306
400
401
drop table t1;

View file

@ -3,8 +3,16 @@ set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
insert delayed into t1 values (207);
insert delayed into t1 values (null);
insert delayed into t1 values (300);
show binlog events from 102;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Query 1 # use `test`; create table t1 (a int not null auto_increment, primary key (a)) engine=myisam
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (207)
master-bin.000001 # Intvar 1 # INSERT_ID=208
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (null)
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (300)
insert delayed into t1 values (null),(null),(null),(null);
insert delayed into t1 values (null),(null),(400),(null);
11 == 11
select * from t1;
a
207
@ -18,15 +26,4 @@ a
306
400
401
show binlog events from 102;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Query 1 # use `test`; create table t1 (a int not null auto_increment, primary key (a)) engine=myisam
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (207)
master-bin.000001 # Intvar 1 # INSERT_ID=208
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (null)
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (300)
master-bin.000001 # Intvar 1 # INSERT_ID=301
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (null),(null),(null),(null)
master-bin.000001 # Intvar 1 # INSERT_ID=305
master-bin.000001 # Query 1 # use `test`; insert delayed into t1 values (null),(null),(400),(null)
drop table t1;

View file

@ -160,21 +160,6 @@ set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
insert delayed into t1 values (207);
insert delayed into t1 values (null);
insert delayed into t1 values (300);
insert delayed into t1 values (null),(null),(null),(null);
insert delayed into t1 values (null),(null),(400),(null);
select * from t1;
a
207
208
300
301
302
303
304
305
306
400
401
show binlog events from 102;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Query 1 # use `test`; create table t1 (id tinyint auto_increment primary key)
@ -188,12 +173,20 @@ master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map 1 # table_id: # (test.t1)
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
insert delayed into t1 values (null),(null),(null),(null);
insert delayed into t1 values (null),(null),(400),(null);
11 == 11
select * from t1;
a
207
208
300
301
302
303
304
305
306
400
401
drop table t1;

View file

@ -68,7 +68,7 @@ insert into t1 values (1, 2, 'a&b a<b a>b');
<resultset statement="select null from dual
">
<row>
<field name="NULL">NULL</field>
<field name="NULL" xsi:nil="true" />
</row>
</resultset>
drop table t1;

View file

@ -168,3 +168,13 @@ DROP TABLE t1;
select hex(convert(_gbk 0xA14041 using ucs2));
hex(convert(_gbk 0xA14041 using ucs2))
003F0041
create table t1 (c1 text not null, c2 text not null) character set gbk;
alter table t1 change c1 c1 mediumtext character set gbk not null;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`c1` mediumtext NOT NULL,
`c2` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk
drop table t1;
End of 5.0 tests

View file

@ -1461,3 +1461,21 @@ set @a:=null;
execute my_stmt using @a;
a b
drop table if exists t1;
CREATE TABLE t1 (
colA int(11) NOT NULL,
colB varchar(255) character set utf8 NOT NULL,
PRIMARY KEY (colA)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO t1 (colA, colB) VALUES (1, 'foo'), (2, 'foo bar');
CREATE TABLE t2 (
colA int(11) NOT NULL,
colB varchar(255) character set utf8 NOT NULL,
KEY bad (colA,colB(3))
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO t2 (colA, colB) VALUES (1, 'foo'),(2, 'foo bar');
SELECT * FROM t1 JOIN t2 ON t1.colA=t2.colA AND t1.colB=t2.colB
WHERE t1.colA < 3;
colA colB colA colB
1 foo 1 foo
2 foo bar 2 foo bar
DROP TABLE t1, t2;

View file

@ -43,9 +43,9 @@ drop table t1;
create table t1 (a int, b char(10));
load data infile '../std_data_ln/loaddata3.dat' into table t1 fields terminated by '' enclosed by '' ignore 1 lines;
Warnings:
Warning 1264 Out of range value for column 'a' at row 3
Warning 1366 Incorrect integer value: 'error ' for column 'a' at row 3
Warning 1262 Row 3 was truncated; it contained more data than there were input columns
Warning 1264 Out of range value for column 'a' at row 5
Warning 1366 Incorrect integer value: 'wrong end ' for column 'a' at row 5
Warning 1262 Row 5 was truncated; it contained more data than there were input columns
select * from t1;
a b
@ -57,7 +57,8 @@ a b
truncate table t1;
load data infile '../std_data_ln/loaddata4.dat' into table t1 fields terminated by '' enclosed by '' lines terminated by '' ignore 1 lines;
Warnings:
Warning 1264 Out of range value for column 'a' at row 4
Warning 1366 Incorrect integer value: '
' for column 'a' at row 4
Warning 1261 Row 4 doesn't contain data for all columns
select * from t1;
a b

View file

@ -112,8 +112,8 @@ slow_log CREATE TABLE `slow_log` (
alter table mysql.general_log engine=myisam;
alter table mysql.slow_log engine=myisam;
Warnings:
Warning 1264 Out of range value for column 'last_insert_id' at row 0
Warning 1264 Out of range value for column 'insert_id' at row 0
Warning 1366 Incorrect integer value: '' for column 'last_insert_id' at row 0
Warning 1366 Incorrect integer value: '' for column 'insert_id' at row 0
show create table mysql.general_log;
Table Create Table
general_log CREATE TABLE `general_log` (

View file

@ -2689,21 +2689,21 @@ set @arg00= '1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 1
c2 1
c3 1
c4 1
c5 1
c6 1
c1 127
c2 32767
c3 8388607
c4 2147483647
c5 2147483647
c6 9223372036854775807
c7 3.40282e+38
c8 1.11111111111111e+50
c9 1.11111111111111e+50
@ -2739,21 +2739,21 @@ set @arg00= '-1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 -1
c2 -1
c3 -1
c4 -1
c5 -1
c6 -1
c1 -128
c2 -32768
c3 -8388608
c4 -2147483648
c5 -2147483648
c6 -9223372036854775808
c7 -3.40282e+38
c8 -1.11111111111111e+50
c9 -1.11111111111111e+50

View file

@ -2672,21 +2672,21 @@ set @arg00= '1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 1
c2 1
c3 1
c4 1
c5 1
c6 1
c1 127
c2 32767
c3 8388607
c4 2147483647
c5 2147483647
c6 9223372036854775807
c7 3.40282e+38
c8 1.11111111111111e+50
c9 1.11111111111111e+50
@ -2722,21 +2722,21 @@ set @arg00= '-1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 -1
c2 -1
c3 -1
c4 -1
c5 -1
c6 -1
c1 -128
c2 -32768
c3 -8388608
c4 -2147483648
c5 -2147483648
c6 -9223372036854775808
c7 -3.40282e+38
c8 -1.11111111111111e+50
c9 -1.11111111111111e+50

View file

@ -2673,21 +2673,21 @@ set @arg00= '1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 1
c2 1
c3 1
c4 1
c5 1
c6 1
c1 127
c2 32767
c3 8388607
c4 2147483647
c5 2147483647
c6 9223372036854775807
c7 3.40282e+38
c8 1.11111111111111e+50
c9 1.11111111111111e+50
@ -2723,21 +2723,21 @@ set @arg00= '-1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 -1
c2 -1
c3 -1
c4 -1
c5 -1
c6 -1
c1 -128
c2 -32768
c3 -8388608
c4 -2147483648
c5 -2147483648
c6 -9223372036854775808
c7 -3.40282e+38
c8 -1.11111111111111e+50
c9 -1.11111111111111e+50

View file

@ -2609,21 +2609,21 @@ set @arg00= '1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 1
c2 1
c3 1
c4 1
c5 1
c6 1
c1 127
c2 32767
c3 8388607
c4 2147483647
c5 2147483647
c6 9223372036854775807
c7 3.40282e+38
c8 1.11111111111111e+50
c9 1.11111111111111e+50
@ -2659,21 +2659,21 @@ set @arg00= '-1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 -1
c2 -1
c3 -1
c4 -1
c5 -1
c6 -1
c1 -128
c2 -32768
c3 -8388608
c4 -2147483648
c5 -2147483648
c6 -9223372036854775808
c7 -3.40282e+38
c8 -1.11111111111111e+50
c9 -1.11111111111111e+50
@ -5623,21 +5623,21 @@ set @arg00= '1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 1
c2 1
c3 1
c4 1
c5 1
c6 1
c1 127
c2 32767
c3 8388607
c4 2147483647
c5 2147483647
c6 9223372036854775807
c7 3.40282e+38
c8 1.11111111111111e+50
c9 1.11111111111111e+50
@ -5673,21 +5673,21 @@ set @arg00= '-1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 -1
c2 -1
c3 -1
c4 -1
c5 -1
c6 -1
c1 -128
c2 -32768
c3 -8388608
c4 -2147483648
c5 -2147483648
c6 -9223372036854775808
c7 -3.40282e+38
c8 -1.11111111111111e+50
c9 -1.11111111111111e+50

View file

@ -2672,21 +2672,21 @@ set @arg00= '1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 1
c2 1
c3 1
c4 1
c5 1
c6 1
c1 127
c2 32767
c3 8388607
c4 2147483647
c5 2147483647
c6 9223372036854775807
c7 3.40282e+38
c8 1.11111111111111e+50
c9 1.11111111111111e+50
@ -2722,21 +2722,21 @@ set @arg00= '-1.11111111111111111111e+50' ;
execute my_insert using @arg00, @arg00, @arg00, @arg00, @arg00, @arg00,
@arg00, @arg00, @arg00, @arg00, @arg00 ;
Warnings:
Warning 1265 Data truncated for column 'c1' at row 1
Warning 1265 Data truncated for column 'c2' at row 1
Warning 1265 Data truncated for column 'c3' at row 1
Warning 1265 Data truncated for column 'c4' at row 1
Warning 1265 Data truncated for column 'c5' at row 1
Warning 1265 Data truncated for column 'c6' at row 1
Warning 1264 Out of range value for column 'c1' at row 1
Warning 1264 Out of range value for column 'c2' at row 1
Warning 1264 Out of range value for column 'c3' at row 1
Warning 1264 Out of range value for column 'c4' at row 1
Warning 1264 Out of range value for column 'c5' at row 1
Warning 1264 Out of range value for column 'c6' at row 1
Warning 1264 Out of range value for column 'c7' at row 1
Warning 1264 Out of range value for column 'c12' at row 1
execute my_select ;
c1 -1
c2 -1
c3 -1
c4 -1
c5 -1
c6 -1
c1 -128
c2 -32768
c3 -8388608
c4 -2147483648
c5 -2147483648
c6 -9223372036854775808
c7 -3.40282e+38
c8 -1.11111111111111e+50
c9 -1.11111111111111e+50

272
mysql-test/r/round.result Normal file
View file

@ -0,0 +1,272 @@
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (sint8 tinyint not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('127.4');
INSERT INTO t1 VALUES ('127.5');
Warnings:
Warning 1264 Out of range value for column 'sint8' at row 1
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('-127.4');
INSERT INTO t1 VALUES ('-127.5');
INSERT INTO t1 VALUES ('-128.4');
INSERT INTO t1 VALUES ('-128.5');
Warnings:
Warning 1264 Out of range value for column 'sint8' at row 1
SELECT * FROM t1;
sint8
0
1
127
127
0
-1
-127
-128
-128
-128
DROP TABLE t1;
CREATE TABLE t1 (uint8 tinyint unsigned not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('127.4');
INSERT INTO t1 VALUES ('127.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
Warnings:
Warning 1264 Out of range value for column 'uint8' at row 1
INSERT INTO t1 VALUES ('255.4');
INSERT INTO t1 VALUES ('255.5');
Warnings:
Warning 1264 Out of range value for column 'uint8' at row 1
SELECT * FROM t1;
uint8
0
1
127
128
0
0
255
255
DROP TABLE t1;
CREATE TABLE t1 (sint16 smallint not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('32767.4');
INSERT INTO t1 VALUES ('32767.5');
Warnings:
Warning 1264 Out of range value for column 'sint16' at row 1
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('-32767.4');
INSERT INTO t1 VALUES ('-32767.5');
INSERT INTO t1 VALUES ('-32768.4');
INSERT INTO t1 VALUES ('-32768.5');
Warnings:
Warning 1264 Out of range value for column 'sint16' at row 1
SELECT * FROM t1;
sint16
0
1
32767
32767
0
-1
-32767
-32768
-32768
-32768
DROP TABLE t1;
CREATE TABLE t1 (uint16 smallint unsigned not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('32767.4');
INSERT INTO t1 VALUES ('32767.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
Warnings:
Warning 1264 Out of range value for column 'uint16' at row 1
INSERT INTO t1 VALUES ('65535.4');
INSERT INTO t1 VALUES ('65535.5');
Warnings:
Warning 1264 Out of range value for column 'uint16' at row 1
SELECT * FROM t1;
uint16
0
1
32767
32768
0
0
65535
65535
DROP TABLE t1;
CREATE TABLE t1 (sint24 mediumint not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('8388607.4');
INSERT INTO t1 VALUES ('8388607.5');
Warnings:
Warning 1264 Out of range value for column 'sint24' at row 1
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('-8388607.4');
INSERT INTO t1 VALUES ('-8388607.5');
INSERT INTO t1 VALUES ('-8388608.4');
INSERT INTO t1 VALUES ('-8388608.5');
Warnings:
Warning 1264 Out of range value for column 'sint24' at row 1
SELECT * FROM t1;
sint24
0
1
8388607
8388607
0
-1
-8388607
-8388608
-8388608
-8388608
DROP TABLE t1;
CREATE TABLE t1 (uint24 mediumint unsigned not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('8388607.4');
INSERT INTO t1 VALUES ('8388607.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
Warnings:
Warning 1264 Out of range value for column 'uint24' at row 1
INSERT INTO t1 VALUES ('16777215.4');
INSERT INTO t1 VALUES ('16777215.5');
Warnings:
Warning 1264 Out of range value for column 'uint24' at row 1
SELECT * FROM t1;
uint24
0
1
8388607
8388608
0
0
16777215
16777215
DROP TABLE t1;
CREATE TABLE t1 (sint64 bigint not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('9223372036854775807.4');
INSERT INTO t1 VALUES ('9223372036854775807.5');
Warnings:
Warning 1264 Out of range value for column 'sint64' at row 1
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('-9223372036854775807.4');
INSERT INTO t1 VALUES ('-9223372036854775807.5');
INSERT INTO t1 VALUES ('-9223372036854775808.4');
INSERT INTO t1 VALUES ('-9223372036854775808.5');
Warnings:
Warning 1264 Out of range value for column 'sint64' at row 1
SELECT * FROM t1;
sint64
0
1
9223372036854775807
9223372036854775807
0
-1
-9223372036854775807
-9223372036854775808
-9223372036854775808
-9223372036854775808
DROP TABLE t1;
CREATE TABLE t1 (uint64 bigint unsigned not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('9223372036854775807.4');
INSERT INTO t1 VALUES ('9223372036854775807.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
Warnings:
Warning 1264 Out of range value for column 'uint64' at row 1
INSERT INTO t1 VALUES ('18446744073709551615.4');
INSERT INTO t1 VALUES ('18446744073709551615.5');
Warnings:
Warning 1264 Out of range value for column 'uint64' at row 1
INSERT INTO t1 VALUES ('1844674407370955161.0');
INSERT INTO t1 VALUES ('1844674407370955161.1');
INSERT INTO t1 VALUES ('1844674407370955161.2');
INSERT INTO t1 VALUES ('1844674407370955161.3');
INSERT INTO t1 VALUES ('1844674407370955161.4');
INSERT INTO t1 VALUES ('1844674407370955161.5');
INSERT INTO t1 VALUES ('1844674407370955161.0e1');
INSERT INTO t1 VALUES ('1844674407370955161.1e1');
INSERT INTO t1 VALUES ('1844674407370955161.2e1');
INSERT INTO t1 VALUES ('1844674407370955161.3e1');
INSERT INTO t1 VALUES ('1844674407370955161.4e1');
INSERT INTO t1 VALUES ('1844674407370955161.5e1');
INSERT INTO t1 VALUES ('18446744073709551610e-1');
INSERT INTO t1 VALUES ('18446744073709551611e-1');
INSERT INTO t1 VALUES ('18446744073709551612e-1');
INSERT INTO t1 VALUES ('18446744073709551613e-1');
INSERT INTO t1 VALUES ('18446744073709551614e-1');
INSERT INTO t1 VALUES ('18446744073709551615e-1');
SELECT * FROM t1;
uint64
0
1
9223372036854775807
9223372036854775808
0
0
18446744073709551615
18446744073709551615
1844674407370955161
1844674407370955161
1844674407370955161
1844674407370955161
1844674407370955161
1844674407370955162
18446744073709551610
18446744073709551611
18446744073709551612
18446744073709551613
18446744073709551614
18446744073709551615
1844674407370955161
1844674407370955161
1844674407370955161
1844674407370955161
1844674407370955161
1844674407370955162
DROP TABLE t1;
CREATE TABLE t1 (str varchar(128), sint64 bigint not null default 0);
INSERT INTO t1 (str) VALUES ('1.5');
INSERT INTO t1 (str) VALUES ('1.00005e4');
INSERT INTO t1 (str) VALUES ('1.0005e3');
INSERT INTO t1 (str) VALUES ('1.005e2');
INSERT INTO t1 (str) VALUES ('1.05e1');
INSERT INTO t1 (str) VALUES ('1.5e0');
INSERT INTO t1 (str) VALUES ('100005e-1');
INSERT INTO t1 (str) VALUES ('100050e-2');
INSERT INTO t1 (str) VALUES ('100500e-3');
INSERT INTO t1 (str) VALUES ('105000e-4');
INSERT INTO t1 (str) VALUES ('150000e-5');
UPDATE t1 SET sint64=str;
SELECT * FROM t1;
str sint64
1.5 2
1.00005e4 10001
1.0005e3 1001
1.005e2 101
1.05e1 11
1.5e0 2
100005e-1 10001
100050e-2 1001
100500e-3 101
105000e-4 11
150000e-5 2
DROP TABLE t1;

View file

@ -67,9 +67,9 @@ drop table t1;
create table t1 (a int, b char(10));
load data infile '../std_data_ln/loaddata3.dat' into table t1 fields terminated by '' enclosed by '' ignore 1 lines;
Warnings:
Warning 1264 Out of range value for column 'a' at row 3
Warning 1366 Incorrect integer value: 'error ' for column 'a' at row 3
Warning 1262 Row 3 was truncated; it contained more data than there were input columns
Warning 1264 Out of range value for column 'a' at row 5
Warning 1366 Incorrect integer value: 'wrong end ' for column 'a' at row 5
Warning 1262 Row 5 was truncated; it contained more data than there were input columns
select * from rewrite.t1;
a b
@ -81,7 +81,8 @@ a b
truncate table t1;
load data infile '../std_data_ln/loaddata4.dat' into table t1 fields terminated by '' enclosed by '' lines terminated by '' ignore 1 lines;
Warnings:
Warning 1264 Out of range value for column 'a' at row 4
Warning 1366 Incorrect integer value: '
' for column 'a' at row 4
Warning 1261 Row 4 doesn't contain data for all columns
select * from rewrite.t1;
a b

View file

@ -99,4 +99,24 @@ a
7
8
9
DROP TABLE t1;
================ Test for BUG#22550 ================
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
CREATE TABLE t1 (a BIT(1), b INT) ENGINE=MYISAM;
INSERT INTO t1 VALUES(1,2);
SELECT HEX(a),b FROM t1;
HEX(a) b
1 2
SELECT HEX(a),b FROM t1;
HEX(a) b
1 2
UPDATE t1 SET a=0 WHERE b=2;
SELECT HEX(a),b FROM t1;
HEX(a) b
0 2
SELECT HEX(a),b FROM t1;
HEX(a) b
0 2

View file

@ -2809,7 +2809,7 @@ CREATE TABLE t1 (i BIGINT UNSIGNED NOT NULL);
INSERT INTO t1 VALUES (10);
SELECT i='1e+01',i=1e+01, i in (1e+01,1e+01), i in ('1e+01','1e+01') FROM t1;
i='1e+01' i=1e+01 i in (1e+01,1e+01) i in ('1e+01','1e+01')
0 1 1 1
1 1 1 1
DROP TABLE t1;
CREATE TABLE t1 (
K2C4 varchar(4) character set latin1 collate latin1_bin NOT NULL default '',

View file

@ -896,7 +896,7 @@ sp_var
@user_var
0
Warnings:
Warning 1264 Out of range value for column 'sp_var' at row 1
Warning 1366 Incorrect integer value: 'Hello, world!' for column 'sp_var' at row 1
DROP PROCEDURE p1;
DROP TABLE t1;

View file

@ -619,9 +619,9 @@ ERROR 22012: Division by 0
UPDATE t1 SET col1= MOD(col1,0) WHERE col1 > 0;
ERROR 22012: Division by 0
INSERT INTO t1 (col1) VALUES ('');
ERROR 22003: Out of range value for column 'col1' at row 1
ERROR HY000: Incorrect integer value: '' for column 'col1' at row 1
INSERT INTO t1 (col1) VALUES ('a59b');
ERROR 22003: Out of range value for column 'col1' at row 1
ERROR HY000: Incorrect integer value: 'a59b' for column 'col1' at row 1
INSERT INTO t1 (col1) VALUES ('1a');
ERROR 01000: Data truncated for column 'col1' at row 1
INSERT IGNORE INTO t1 (col1) VALUES ('2a');
@ -701,9 +701,9 @@ ERROR 22012: Division by 0
UPDATE t1 SET col1= MOD(col1,0) WHERE col1 > 0;
ERROR 22012: Division by 0
INSERT INTO t1 (col1) VALUES ('');
ERROR 22003: Out of range value for column 'col1' at row 1
ERROR HY000: Incorrect integer value: '' for column 'col1' at row 1
INSERT INTO t1 (col1) VALUES ('a59b');
ERROR 22003: Out of range value for column 'col1' at row 1
ERROR HY000: Incorrect integer value: 'a59b' for column 'col1' at row 1
INSERT INTO t1 (col1) VALUES ('1a');
ERROR 01000: Data truncated for column 'col1' at row 1
INSERT IGNORE INTO t1 (col1) VALUES ('2a');

View file

@ -6,21 +6,21 @@ primary key (`a`)
) engine = 'BDB' ;
set @@sql_mode='strict_all_tables';
insert into t1 values(1000);
ERROR 22003: Out of range value adjusted for column 'a' at row 1
ERROR 22003: Out of range value for column 'a' at row 1
select count(*) from t1;
count(*)
0
set auto_increment_increment=1000;
set auto_increment_offset=700;
insert into t1 values(null);
ERROR 22003: Out of range value adjusted for column 'a' at row 1
ERROR 22003: Out of range value for column 'a' at row 1
select count(*) from t1;
count(*)
0
set @@sql_mode=@org_mode;
insert into t1 values(null);
Warnings:
Warning 1264 Out of range value adjusted for column 'a' at row 1
Warning 1264 Out of range value for column 'a' at row 1
select * from t1;
a
127

View file

@ -1306,9 +1306,9 @@ a b
delete from t1;
load data infile '../std_data_ln/loaddata3.dat' ignore into table v1 fields terminated by '' enclosed by '' ignore 1 lines;
Warnings:
Warning 1264 Out of range value for column 'a' at row 3
Warning 1366 Incorrect integer value: 'error ' for column 'a' at row 3
Error 1369 CHECK OPTION failed 'test.v1'
Warning 1264 Out of range value for column 'a' at row 4
Warning 1366 Incorrect integer value: 'wrong end ' for column 'a' at row 4
Error 1369 CHECK OPTION failed 'test.v1'
select * from t1 order by a,b;
a b

View file

@ -31,19 +31,19 @@ Error 1064 You have an error in your SQL syntax; check the manual that correspon
insert into t1 values (1);
insert into t1 values ("hej");
Warnings:
Warning 1264 Out of range value for column 'a' at row 1
Warning 1366 Incorrect integer value: 'hej' for column 'a' at row 1
insert into t1 values ("hej"),("då");
Warnings:
Warning 1264 Out of range value for column 'a' at row 1
Warning 1264 Out of range value for column 'a' at row 2
Warning 1366 Incorrect integer value: 'hej' for column 'a' at row 1
Warning 1366 Incorrect integer value: 'd?' for column 'a' at row 2
set SQL_WARNINGS=1;
insert into t1 values ("hej");
Warnings:
Warning 1264 Out of range value for column 'a' at row 1
Warning 1366 Incorrect integer value: 'hej' for column 'a' at row 1
insert into t1 values ("hej"),("då");
Warnings:
Warning 1264 Out of range value for column 'a' at row 1
Warning 1264 Out of range value for column 'a' at row 2
Warning 1366 Incorrect integer value: 'hej' for column 'a' at row 1
Warning 1366 Incorrect integer value: 'd?' for column 'a' at row 2
drop table t1;
set SQL_WARNINGS=0;
drop temporary table if exists not_exists;
@ -180,44 +180,44 @@ create table t1 (a int);
insert into t1 (a) values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
update t1 set a='abc';
Warnings:
Warning 1264 Out of range value for column 'a' at row 1
Warning 1264 Out of range value for column 'a' at row 2
Warning 1264 Out of range value for column 'a' at row 3
Warning 1264 Out of range value for column 'a' at row 4
Warning 1264 Out of range value for column 'a' at row 5
Warning 1264 Out of range value for column 'a' at row 6
Warning 1264 Out of range value for column 'a' at row 7
Warning 1264 Out of range value for column 'a' at row 8
Warning 1264 Out of range value for column 'a' at row 9
Warning 1264 Out of range value for column 'a' at row 10
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 1
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 2
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 3
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 4
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 5
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 6
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 7
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 8
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 9
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 10
show warnings limit 2, 1;
Level Code Message
Warning 1264 Out of range value for column 'a' at row 3
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 3
show warnings limit 0, 10;
Level Code Message
Warning 1264 Out of range value for column 'a' at row 1
Warning 1264 Out of range value for column 'a' at row 2
Warning 1264 Out of range value for column 'a' at row 3
Warning 1264 Out of range value for column 'a' at row 4
Warning 1264 Out of range value for column 'a' at row 5
Warning 1264 Out of range value for column 'a' at row 6
Warning 1264 Out of range value for column 'a' at row 7
Warning 1264 Out of range value for column 'a' at row 8
Warning 1264 Out of range value for column 'a' at row 9
Warning 1264 Out of range value for column 'a' at row 10
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 1
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 2
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 3
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 4
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 5
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 6
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 7
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 8
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 9
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 10
show warnings limit 9, 1;
Level Code Message
Warning 1264 Out of range value for column 'a' at row 10
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 10
show warnings limit 10, 1;
Level Code Message
show warnings limit 9, 2;
Level Code Message
Warning 1264 Out of range value for column 'a' at row 10
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 10
show warnings limit 0, 0;
Level Code Message
show warnings limit 1;
Level Code Message
Warning 1264 Out of range value for column 'a' at row 1
Warning 1366 Incorrect integer value: 'abc' for column 'a' at row 1
show warnings limit 0;
Level Code Message
show warnings limit 1, 0;

View file

@ -570,7 +570,7 @@ select extractvalue('<a>a<b>B</b></a>','a|/b');
extractvalue('<a>a<b>B</b></a>','a|/b')
a
select extractvalue('<a>A</a>','/<a>');
ERROR HY000: XPATH syntax error: '<a>'
ERROR HY000: XPATH error: comparison of two nodesets is not supported: '<a>'
select extractvalue('<a><b>b</b><b!>b!</b!></a>','//b!');
ERROR HY000: XPATH syntax error: '!'
select extractvalue('<a>A<b>B<c>C</c></b></a>','/a/descendant::*');
@ -710,3 +710,29 @@ Data
select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/something');
extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/something')
Otherdata
select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','/zot/tim0/02');
ERROR HY000: XPATH syntax error: '02'
select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','//*');
extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','//*')
NULL
Warnings:
Warning 1512 Incorrect XML value: 'parse error at line 1 pos 13: unknown token unexpected (ident or '/' wanted)'
select extractValue('<.>test</.>','//*');
extractValue('<.>test</.>','//*')
NULL
Warnings:
Warning 1512 Incorrect XML value: 'parse error at line 1 pos 2: unknown token unexpected (ident or '/' wanted)'
select extractValue('<->test</->','//*');
extractValue('<->test</->','//*')
NULL
Warnings:
Warning 1512 Incorrect XML value: 'parse error at line 1 pos 2: unknown token unexpected (ident or '/' wanted)'
select extractValue('<:>test</:>','//*');
extractValue('<:>test</:>','//*')
test
select extractValue('<_>test</_>','//*');
extractValue('<_>test</_>','//*')
test
select extractValue('<x.-_:>test</x.-_:>','//*');
extractValue('<x.-_:>test</x.-_:>','//*')
test

View file

@ -42,3 +42,13 @@ DROP TABLE t1;
select hex(convert(_gbk 0xA14041 using ucs2));
# End of 4.1 tests
#
# Bug#21620 ALTER TABLE affects other columns
#
create table t1 (c1 text not null, c2 text not null) character set gbk;
alter table t1 change c1 c1 mediumtext character set gbk not null;
show create table t1;
drop table t1;
--echo End of 5.0 tests

View file

@ -1158,3 +1158,23 @@ execute my_stmt using @a;
set @a:=null;
execute my_stmt using @a;
drop table if exists t1;
#
# Bug#19960: Inconsistent results when joining
# InnoDB tables using partial UTF8 indexes
#
CREATE TABLE t1 (
colA int(11) NOT NULL,
colB varchar(255) character set utf8 NOT NULL,
PRIMARY KEY (colA)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO t1 (colA, colB) VALUES (1, 'foo'), (2, 'foo bar');
CREATE TABLE t2 (
colA int(11) NOT NULL,
colB varchar(255) character set utf8 NOT NULL,
KEY bad (colA,colB(3))
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO t2 (colA, colB) VALUES (1, 'foo'),(2, 'foo bar');
SELECT * FROM t1 JOIN t2 ON t1.colA=t2.colA AND t1.colB=t2.colB
WHERE t1.colA < 3;
DROP TABLE t1, t2;

145
mysql-test/t/round.test Normal file
View file

@ -0,0 +1,145 @@
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
CREATE TABLE t1 (sint8 tinyint not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('127.4');
INSERT INTO t1 VALUES ('127.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('-127.4');
INSERT INTO t1 VALUES ('-127.5');
INSERT INTO t1 VALUES ('-128.4');
INSERT INTO t1 VALUES ('-128.5');
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (uint8 tinyint unsigned not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('127.4');
INSERT INTO t1 VALUES ('127.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('255.4');
INSERT INTO t1 VALUES ('255.5');
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (sint16 smallint not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('32767.4');
INSERT INTO t1 VALUES ('32767.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('-32767.4');
INSERT INTO t1 VALUES ('-32767.5');
INSERT INTO t1 VALUES ('-32768.4');
INSERT INTO t1 VALUES ('-32768.5');
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (uint16 smallint unsigned not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('32767.4');
INSERT INTO t1 VALUES ('32767.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('65535.4');
INSERT INTO t1 VALUES ('65535.5');
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (sint24 mediumint not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('8388607.4');
INSERT INTO t1 VALUES ('8388607.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('-8388607.4');
INSERT INTO t1 VALUES ('-8388607.5');
INSERT INTO t1 VALUES ('-8388608.4');
INSERT INTO t1 VALUES ('-8388608.5');
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (uint24 mediumint unsigned not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('8388607.4');
INSERT INTO t1 VALUES ('8388607.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('16777215.4');
INSERT INTO t1 VALUES ('16777215.5');
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (sint64 bigint not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('9223372036854775807.4');
INSERT INTO t1 VALUES ('9223372036854775807.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('-9223372036854775807.4');
INSERT INTO t1 VALUES ('-9223372036854775807.5');
INSERT INTO t1 VALUES ('-9223372036854775808.4');
INSERT INTO t1 VALUES ('-9223372036854775808.5');
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (uint64 bigint unsigned not null);
INSERT INTO t1 VALUES ('0.1');
INSERT INTO t1 VALUES ('0.5');
INSERT INTO t1 VALUES ('9223372036854775807.4');
INSERT INTO t1 VALUES ('9223372036854775807.5');
INSERT INTO t1 VALUES ('-0.1');
INSERT INTO t1 VALUES ('-0.5');
INSERT INTO t1 VALUES ('18446744073709551615.4');
INSERT INTO t1 VALUES ('18446744073709551615.5');
INSERT INTO t1 VALUES ('1844674407370955161.0');
INSERT INTO t1 VALUES ('1844674407370955161.1');
INSERT INTO t1 VALUES ('1844674407370955161.2');
INSERT INTO t1 VALUES ('1844674407370955161.3');
INSERT INTO t1 VALUES ('1844674407370955161.4');
INSERT INTO t1 VALUES ('1844674407370955161.5');
INSERT INTO t1 VALUES ('1844674407370955161.0e1');
INSERT INTO t1 VALUES ('1844674407370955161.1e1');
INSERT INTO t1 VALUES ('1844674407370955161.2e1');
INSERT INTO t1 VALUES ('1844674407370955161.3e1');
INSERT INTO t1 VALUES ('1844674407370955161.4e1');
INSERT INTO t1 VALUES ('1844674407370955161.5e1');
INSERT INTO t1 VALUES ('18446744073709551610e-1');
INSERT INTO t1 VALUES ('18446744073709551611e-1');
INSERT INTO t1 VALUES ('18446744073709551612e-1');
INSERT INTO t1 VALUES ('18446744073709551613e-1');
INSERT INTO t1 VALUES ('18446744073709551614e-1');
INSERT INTO t1 VALUES ('18446744073709551615e-1');
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1 (str varchar(128), sint64 bigint not null default 0);
INSERT INTO t1 (str) VALUES ('1.5');
INSERT INTO t1 (str) VALUES ('1.00005e4');
INSERT INTO t1 (str) VALUES ('1.0005e3');
INSERT INTO t1 (str) VALUES ('1.005e2');
INSERT INTO t1 (str) VALUES ('1.05e1');
INSERT INTO t1 (str) VALUES ('1.5e0');
INSERT INTO t1 (str) VALUES ('100005e-1');
INSERT INTO t1 (str) VALUES ('100050e-2');
INSERT INTO t1 (str) VALUES ('100500e-3');
INSERT INTO t1 (str) VALUES ('105000e-4');
INSERT INTO t1 (str) VALUES ('150000e-5');
UPDATE t1 SET sint64=str;
SELECT * FROM t1;
DROP TABLE t1;

View file

@ -93,4 +93,24 @@ INSERT INTO t1 VALUES (7),(8),(9);
sync_slave_with_master;
SELECT * FROM t1;
DROP TABLE t1;
# Bug#22550: Replication of BIT columns failing
--echo ================ Test for BUG#22550 ================
--disable_query_log
--source include/master-slave-reset.inc
--enable_query_log
connection master;
CREATE TABLE t1 (a BIT(1), b INT) ENGINE=MYISAM;
sync_slave_with_master;
connection master;
INSERT INTO t1 VALUES(1,2);
SELECT HEX(a),b FROM t1;
sync_slave_with_master;
SELECT HEX(a),b FROM t1;
connection master;
UPDATE t1 SET a=0 WHERE b=2;
SELECT HEX(a),b FROM t1;
sync_slave_with_master;
SELECT HEX(a),b FROM t1;

View file

@ -1,3 +1,3 @@
let $type= 'MYISAM' ;
let $extra_index= ;
-- source include/rpl_row_basic.inc
-- source extra/rpl_tests/rpl_row_basic.test

View file

@ -2,5 +2,5 @@
let $type= 'INNODB' ;
let $extra_index= ;
-- source include/rpl_row_basic.inc
-- source extra/rpl_tests/rpl_row_basic.test

View file

@ -1,5 +1,5 @@
-- source include/have_ndb.inc
let $type= 'NDB' ;
let $extra_index= ;
-- source include/rpl_row_basic.inc
-- source extra/rpl_tests/rpl_row_basic.test
-- source include/master-slave-end.inc

View file

@ -649,9 +649,9 @@ UPDATE t1 SET col2 =col2 + 50 WHERE col2 > 0;
UPDATE t1 SET col1 =col1 / 0 WHERE col1 > 0;
--error 1365
UPDATE t1 SET col1= MOD(col1,0) WHERE col1 > 0;
--error 1264
--error 1366
INSERT INTO t1 (col1) VALUES ('');
--error 1264
--error 1366
INSERT INTO t1 (col1) VALUES ('a59b');
--error 1265
INSERT INTO t1 (col1) VALUES ('1a');
@ -710,9 +710,9 @@ INSERT INTO t1 (col2) VALUES(18446744073709551616.0);
UPDATE t1 SET col1 =col1 / 0 WHERE col1 > 0;
--error 1365
UPDATE t1 SET col1= MOD(col1,0) WHERE col1 > 0;
--error 1264
--error 1366
INSERT INTO t1 (col1) VALUES ('');
--error 1264
--error 1366
INSERT INTO t1 (col1) VALUES ('a59b');
--error 1265
INSERT INTO t1 (col1) VALUES ('1a');

View file

@ -360,3 +360,19 @@ select extractValue('<ns:element xmlns:ns="myns">a</ns:element>','/ns:element/@x
#
select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/foo.bar');
select extractValue('<foo><foo.bar>Data</foo.bar><something>Otherdata</something></foo>','/foo/something');
#
# Bug#20854 XML functions: wrong result in ExtractValue
#
--error 1105
select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','/zot/tim0/02');
select extractValue('<zot><tim0><01>10:39:15</01><02>140</02></tim0></zot>','//*');
# dot and dash are bad identtifier start character
select extractValue('<.>test</.>','//*');
select extractValue('<->test</->','//*');
# semicolon is good identifier start character
select extractValue('<:>test</:>','//*');
# underscore is good identifier start character
select extractValue('<_>test</_>','//*');
# dot, dash, underscore and semicolon are good identifier middle characters
select extractValue('<x.-_:>test</x.-_:>','//*');

View file

@ -2565,28 +2565,26 @@ int Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs)
ASSERT_COLUMN_MARKED_FOR_WRITE;
int not_used; // We can ignore result from str2int
char *end;
long tmp= my_strntol(cs, from, len, 10, &end, &not_used);
int error= 0;
int error;
if (unsigned_flag)
{
if (tmp < 0)
ulonglong tmp= cs->cset->strntoull10rnd(cs, from, len, 1, &end, &error);
if (error == MY_ERRNO_ERANGE || tmp > 255)
{
tmp=0; /* purecov: inspected */
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (tmp > 255)
{
tmp= 255;
set_if_smaller(tmp, 255);
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
error= 1;
else
error= 0;
ptr[0]= (char) tmp;
}
else
{
longlong tmp= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
if (tmp < -128)
{
tmp= -128;
@ -2601,8 +2599,10 @@ int Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs)
}
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
error= 1;
else
error= 0;
ptr[0]= (char) tmp;
}
ptr[0]= (char) tmp;
return error;
}
@ -2775,28 +2775,33 @@ int Field_short::store(const char *from,uint len,CHARSET_INFO *cs)
ASSERT_COLUMN_MARKED_FOR_WRITE;
int not_used; // We can ignore result from str2int
char *end;
long tmp= my_strntol(cs, from, len, 10, &end, &not_used);
int error= 0;
int error;
if (unsigned_flag)
{
if (tmp < 0)
ulonglong tmp= cs->cset->strntoull10rnd(cs, from, len, 1, &end, &error);
if (error == MY_ERRNO_ERANGE || tmp > UINT_MAX16)
{
tmp=0;
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (tmp > UINT_MAX16)
{
tmp=UINT_MAX16;
set_if_smaller(tmp, UINT_MAX16);
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
error= 1;
else
error= 0;
#ifdef WORDS_BIGENDIAN
if (table->s->db_low_byte_first)
{
int2store(ptr,tmp);
}
else
#endif
shortstore(ptr,(short) tmp);
}
else
{
longlong tmp= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
if (tmp < INT_MIN16)
{
tmp= INT_MIN16;
@ -2811,15 +2816,17 @@ int Field_short::store(const char *from,uint len,CHARSET_INFO *cs)
}
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
error= 1;
}
else
error= 0;
#ifdef WORDS_BIGENDIAN
if (table->s->db_low_byte_first)
{
int2store(ptr,tmp);
}
else
if (table->s->db_low_byte_first)
{
int2store(ptr,tmp);
}
else
#endif
shortstore(ptr,(short) tmp);
shortstore(ptr,(short) tmp);
}
return error;
}
@ -3055,28 +3062,26 @@ int Field_medium::store(const char *from,uint len,CHARSET_INFO *cs)
ASSERT_COLUMN_MARKED_FOR_WRITE;
int not_used; // We can ignore result from str2int
char *end;
long tmp= my_strntol(cs, from, len, 10, &end, &not_used);
int error= 0;
int error;
if (unsigned_flag)
{
if (tmp < 0)
ulonglong tmp= cs->cset->strntoull10rnd(cs, from, len, 1, &end, &error);
if (error == MY_ERRNO_ERANGE || tmp > UINT_MAX24)
{
tmp=0;
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (tmp >= (long) (1L << 24))
{
tmp=(long) (1L << 24)-1L;
set_if_smaller(tmp, UINT_MAX24);
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
error= 1;
else
error= 0;
int3store(ptr,tmp);
}
else
{
longlong tmp= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
if (tmp < INT_MIN24)
{
tmp= INT_MIN24;
@ -3091,9 +3096,10 @@ int Field_medium::store(const char *from,uint len,CHARSET_INFO *cs)
}
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
error= 1;
else
error= 0;
int3store(ptr,tmp);
}
int3store(ptr,tmp);
return error;
}
@ -3302,58 +3308,43 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
int error;
char *end;
tmp_scan= cs->cset->scan(cs, from, from+len, MY_SEQ_SPACES);
len-= tmp_scan;
from+= tmp_scan;
end= (char*) from+len;
tmp= cs->cset->strtoll10(cs, from, &end, &error);
if (error != MY_ERRNO_EDOM)
if (unsigned_flag)
{
if (unsigned_flag)
ulonglong tmp= cs->cset->strntoull10rnd(cs, from, len, 1, &end, &error);
if (error == MY_ERRNO_ERANGE || tmp > (ulonglong) UINT_MAX32)
{
if (error < 0)
{
error= 1;
tmp= 0;
}
else if ((ulonglong) tmp > (ulonglong) UINT_MAX32)
{
tmp= UINT_MAX32;
error= 1;
}
else
error= 0;
set_if_smaller(tmp, (ulonglong) UINT_MAX32);
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
error= 1;
else
{
if (error < 0)
{
error= 0;
if (tmp < INT_MIN32)
{
tmp= INT_MIN32;
error= 1;
}
}
else if (tmp > INT_MAX32)
{
tmp= INT_MAX32;
error= 1;
}
}
error= 0;
store_tmp= (long) tmp;
}
if (error)
else
{
error= error != MY_ERRNO_EDOM ? 1 : 2;
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
longlong tmp= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
if (tmp < INT_MIN32)
{
tmp= INT_MIN32;
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (tmp > INT_MAX32)
{
tmp=INT_MAX32;
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
error= 1;
else
error= 0;
store_tmp= (long) tmp;
}
else if (from+len != end && table->in_use->count_cuted_fields &&
check_int(from,len,end,cs))
error= 2;
store_tmp= (long) tmp;
#ifdef WORDS_BIGENDIAN
if (table->s->db_low_byte_first)
{
@ -3595,33 +3586,20 @@ void Field_long::sql_type(String &res) const
int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
{
ASSERT_COLUMN_MARKED_FOR_WRITE;
longlong tmp;
int error= 0;
char *end;
ulonglong tmp;
tmp= cs->cset->scan(cs, from, from+len, MY_SEQ_SPACES);
len-= (uint)tmp;
from+= tmp;
if (unsigned_flag)
{
if (!len || test_if_minus(cs, from, from + len))
{
tmp=0; // Set negative to 0
error= 1;
}
else
tmp=(longlong) my_strntoull(cs,from,len,10,&end,&error);
}
else
tmp=my_strntoll(cs,from,len,10,&end,&error);
if (error)
tmp= cs->cset->strntoull10rnd(cs,from,len,unsigned_flag,&end,&error);
if (error == MY_ERRNO_ERANGE)
{
set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1);
error= 1;
}
else if (from+len != end && table->in_use->count_cuted_fields &&
check_int(from,len,end,cs))
error= 2;
else if (table->in_use->count_cuted_fields && check_int(from,len,end,cs))
error= 1;
else
error= 0;
#ifdef WORDS_BIGENDIAN
if (table->s->db_low_byte_first)
{
@ -9172,7 +9150,7 @@ create_field::create_field(Field *old_field,Field *orig_field)
case 3: sql_type= FIELD_TYPE_MEDIUM_BLOB; break;
default: sql_type= FIELD_TYPE_LONG_BLOB; break;
}
length=(length+charset->mbmaxlen-1) / charset->mbmaxlen;
length/= charset->mbmaxlen;
key_length/= charset->mbmaxlen;
break;
case MYSQL_TYPE_STRING:

View file

@ -427,6 +427,21 @@ static void do_varstring2(Copy_field *copy)
length);
}
static void do_varstring2_mb(Copy_field *copy)
{
int well_formed_error;
CHARSET_INFO *cs= copy->from_field->charset();
uint char_length= (copy->to_length - HA_KEY_BLOB_LENGTH) / cs->mbmaxlen;
uint from_length= uint2korr(copy->from_ptr);
const char *from_beg= copy->from_ptr + HA_KEY_BLOB_LENGTH;
uint length= cs->cset->well_formed_len(cs, from_beg, from_beg + from_length,
char_length, &well_formed_error);
int2store(copy->to_ptr, length);
memcpy(copy->to_ptr+HA_KEY_BLOB_LENGTH, from_beg, length);
}
/***************************************************************************
** The different functions that fills in a Copy_field class
***************************************************************************/
@ -586,7 +601,8 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*)
return do_field_string;
if (to_length != from_length)
return (((Field_varstring*) to)->length_bytes == 1 ?
do_varstring1 : do_varstring2);
do_varstring1 : (from->charset()->mbmaxlen == 1 ?
do_varstring2 : do_varstring2_mb));
}
else if (to_length < from_length)
return (from->charset()->mbmaxlen == 1 ?

View file

@ -105,6 +105,7 @@ typedef struct my_xpath_st
String *context_cache; /* last context provider */
String *pxml; /* Parsed XML, an array of MY_XML_NODE */
CHARSET_INFO *cs; /* character set/collation string comparison */
int error;
} MY_XPATH;
@ -913,7 +914,9 @@ static Item *eq_func_reverse(int oper, Item *a, Item *b)
RETURN
The newly created item.
*/
static Item *create_comparator(MY_XPATH *xpath, int oper, Item *a, Item *b)
static Item *create_comparator(MY_XPATH *xpath,
int oper, MY_XPATH_LEX *context,
Item *a, Item *b)
{
if (a->type() != Item::XPATH_NODESET &&
b->type() != Item::XPATH_NODESET)
@ -923,6 +926,13 @@ static Item *create_comparator(MY_XPATH *xpath, int oper, Item *a, Item *b)
else if (a->type() == Item::XPATH_NODESET &&
b->type() == Item::XPATH_NODESET)
{
uint len= context->end - context->beg;
set_if_bigger(len, 32);
my_printf_error(ER_UNKNOWN_ERROR,
"XPATH error: "
"comparison of two nodesets is not supported: '%.*s'",
MYF(0), len, context->beg);
return 0; // TODO: Comparison of two nodesets
}
else
@ -1430,7 +1440,7 @@ my_xpath_lex_scan(MY_XPATH *xpath,
static int
my_xpath_parse_term(MY_XPATH *xpath, int term)
{
if (xpath->lasttok.term == term)
if (xpath->lasttok.term == term && !xpath->error)
{
xpath->prevtok= xpath->lasttok;
my_xpath_lex_scan(xpath, &xpath->lasttok,
@ -1558,8 +1568,9 @@ static int my_xpath_parse_AbsoluteLocationPath(MY_XPATH *xpath)
return my_xpath_parse_RelativeLocationPath(xpath);
}
return my_xpath_parse_term(xpath, MY_XPATH_LEX_EOF) ||
my_xpath_parse_RelativeLocationPath(xpath);
my_xpath_parse_RelativeLocationPath(xpath);
return (xpath->error == 0);
}
@ -1596,7 +1607,10 @@ static int my_xpath_parse_RelativeLocationPath(MY_XPATH *xpath)
"*", 1,
xpath->pxml, 1);
if (!my_xpath_parse_Step(xpath))
{
xpath->error= 1;
return 0;
}
}
return 1;
}
@ -1633,10 +1647,16 @@ my_xpath_parse_AxisSpecifier_NodeTest_opt_Predicate_list(MY_XPATH *xpath)
xpath->context_cache= context_cache;
if(!my_xpath_parse_PredicateExpr(xpath))
{
xpath->error= 1;
return 0;
}
if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_RB))
{
xpath->error= 1;
return 0;
}
xpath->item= nodeset2bool(xpath, xpath->item);
@ -1893,7 +1913,10 @@ static int my_xpath_parse_UnionExpr(MY_XPATH *xpath)
if (!my_xpath_parse_PathExpr(xpath)
|| xpath->item->type() != Item::XPATH_NODESET)
{
xpath->error= 1;
return 0;
}
xpath->item= new Item_nodeset_func_union(prev, xpath->item, xpath->pxml);
}
return 1;
@ -1929,6 +1952,7 @@ static int my_xpath_parse_PathExpr(MY_XPATH *xpath)
{
return my_xpath_parse_LocationPath(xpath) ||
my_xpath_parse_FilterExpr_opt_slashes_RelativeLocationPath(xpath);
}
@ -1975,7 +1999,10 @@ static int my_xpath_parse_OrExpr(MY_XPATH *xpath)
{
Item *prev= xpath->item;
if (!my_xpath_parse_AndExpr(xpath))
{
return 0;
xpath->error= 1;
}
xpath->item= new Item_cond_or(nodeset2bool(xpath, prev),
nodeset2bool(xpath, xpath->item));
}
@ -2003,7 +2030,10 @@ static int my_xpath_parse_AndExpr(MY_XPATH *xpath)
{
Item *prev= xpath->item;
if (!my_xpath_parse_EqualityExpr(xpath))
{
xpath->error= 1;
return 0;
}
xpath->item= new Item_cond_and(nodeset2bool(xpath,prev),
nodeset2bool(xpath,xpath->item));
@ -2057,17 +2087,26 @@ static int my_xpath_parse_EqualityOperator(MY_XPATH *xpath)
}
static int my_xpath_parse_EqualityExpr(MY_XPATH *xpath)
{
MY_XPATH_LEX operator_context;
if (!my_xpath_parse_RelationalExpr(xpath))
return 0;
operator_context= xpath->lasttok;
while (my_xpath_parse_EqualityOperator(xpath))
{
Item *prev= xpath->item;
int oper= xpath->extra;
if (!my_xpath_parse_RelationalExpr(xpath))
{
xpath->error= 1;
return 0;
}
if (!(xpath->item= create_comparator(xpath, oper, &operator_context,
prev, xpath->item)))
return 0;
if (!(xpath->item= create_comparator(xpath, oper, prev, xpath->item)))
return 0;
operator_context= xpath->lasttok;
}
return 1;
}
@ -2109,18 +2148,25 @@ static int my_xpath_parse_RelationalOperator(MY_XPATH *xpath)
}
static int my_xpath_parse_RelationalExpr(MY_XPATH *xpath)
{
MY_XPATH_LEX operator_context;
if (!my_xpath_parse_AdditiveExpr(xpath))
return 0;
operator_context= xpath->lasttok;
while (my_xpath_parse_RelationalOperator(xpath))
{
Item *prev= xpath->item;
int oper= xpath->extra;
if (!my_xpath_parse_AdditiveExpr(xpath))
{
xpath->error= 1;
return 0;
}
if (!(xpath->item= create_comparator(xpath, oper, prev, xpath->item)))
if (!(xpath->item= create_comparator(xpath, oper, &operator_context,
prev, xpath->item)))
return 0;
operator_context= xpath->lasttok;
}
return 1;
}
@ -2153,7 +2199,10 @@ static int my_xpath_parse_AdditiveExpr(MY_XPATH *xpath)
int oper= xpath->prevtok.term;
Item *prev= xpath->item;
if (!my_xpath_parse_MultiplicativeExpr(xpath))
{
xpath->error= 1;
return 0;
}
if (oper == MY_XPATH_LEX_PLUS)
xpath->item= new Item_func_plus(prev, xpath->item);
@ -2198,7 +2247,10 @@ static int my_xpath_parse_MultiplicativeExpr(MY_XPATH *xpath)
int oper= xpath->prevtok.term;
Item *prev= xpath->item;
if (!my_xpath_parse_UnaryExpr(xpath))
{
xpath->error= 1;
return 0;
}
switch (oper)
{
case MY_XPATH_LEX_ASTERISK:

View file

@ -6371,6 +6371,7 @@ static MY_CHARSET_HANDLER my_charset_big5_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -518,6 +518,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -5493,6 +5493,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -8712,6 +8712,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -8678,6 +8678,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -5763,6 +5763,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -10016,6 +10016,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -412,6 +412,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -17,6 +17,7 @@
#include <my_global.h>
#include "m_string.h"
#include "m_ctype.h"
#include "my_sys.h" /* Needed for MY_ERRNO_ERANGE */
#include <errno.h>
#include "stdarg.h"
@ -1367,6 +1368,341 @@ int my_mb_ctype_8bit(CHARSET_INFO *cs, int *ctype,
}
#undef ULONGLONG_MAX
/*
Needed under MetroWerks Compiler, since MetroWerks compiler does not
properly handle a constant expression containing a mod operator
*/
#if defined(__NETWARE__) && defined(__MWERKS__)
static ulonglong ulonglong_max= ~(ulonglong) 0;
#define ULONGLONG_MAX ulonglong_max
#else
#define ULONGLONG_MAX (~(ulonglong) 0)
#endif /* __NETWARE__ && __MWERKS__ */
#define CUTOFF (ULONGLONG_MAX / 10)
#define CUTLIM (ULONGLONG_MAX % 10)
#define DIGITS_IN_ULONGLONG 20
static ulonglong d10[DIGITS_IN_ULONGLONG]=
{
1,
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
10000000000ULL,
100000000000ULL,
1000000000000ULL,
10000000000000ULL,
100000000000000ULL,
1000000000000000ULL,
10000000000000000ULL,
100000000000000000ULL,
1000000000000000000ULL,
10000000000000000000ULL
};
/*
Convert a string to unsigned long long integer value
with rounding.
SYNOPSYS
my_strntoull10_8bit()
cs in pointer to character set
str in pointer to the string to be converted
length in string length
unsigned_flag in whether the number is unsigned
endptr out pointer to the stop character
error out returned error code
DESCRIPTION
This function takes the decimal representation of integer number
from string str and converts it to an signed or unsigned
long long integer value.
Space characters and tab are ignored.
A sign character might precede the digit characters.
The number may have any number of pre-zero digits.
The number may have decimal point and exponent.
Rounding is always done in "away from zero" style:
0.5 -> 1
-0.5 -> -1
The function stops reading the string str after "length" bytes
or at the first character that is not a part of correct number syntax:
<signed numeric literal> ::=
[ <sign> ] <exact numeric literal> [ E [ <sign> ] <unsigned integer> ]
<exact numeric literal> ::=
<unsigned integer> [ <period> [ <unsigned integer> ] ]
| <period> <unsigned integer>
<unsigned integer> ::= <digit>...
RETURN VALUES
Value of string as a signed/unsigned longlong integer
endptr cannot be NULL. The function will store the end pointer
to the stop character here.
The error parameter contains information how things went:
0 ok
ERANGE If the the value of the converted number is out of range
In this case the return value is:
- ULONGLONG_MAX if unsigned_flag and the number was too big
- 0 if unsigned_flag and the number was negative
- LONGLONG_MAX if no unsigned_flag and the number is too big
- LONGLONG_MIN if no unsigned_flag and the number it too big negative
EDOM If the string didn't contain any digits.
In this case the return value is 0.
*/
ulonglong
my_strntoull10rnd_8bit(CHARSET_INFO *cs __attribute__((unused)),
const char *str, uint length, int unsigned_flag,
char **endptr, int *error)
{
const char *dot, *end9, *beg, *end= str + length;
ulonglong ull;
ulong ul;
unsigned char ch;
int shift= 0, digits= 0, negative, addon;
/* Skip leading spaces and tabs */
for ( ; str < end && (*str == ' ' || *str == '\t') ; str++);
if (str >= end)
goto ret_edom;
if ((negative= (*str == '-')) || *str=='+') /* optional sign */
{
if (++str == end)
goto ret_edom;
}
beg= str;
end9= (str + 9) > end ? end : (str + 9);
/* Accumulate small number into ulong, for performance purposes */
for (ul= 0 ; str < end9 && (ch= (unsigned char) (*str - '0')) < 10; str++)
{
ul= ul * 10 + ch;
}
if (str >= end) /* Small number without dots and expanents */
{
*endptr= (char*) str;
if (negative)
{
if (unsigned_flag)
{
*error= ul ? MY_ERRNO_ERANGE : 0;
return 0;
}
else
{
*error= 0;
return (ulonglong) (longlong) (long) -ul;
}
}
else
{
*error=0;
return (ulonglong) ul;
}
}
digits= str - beg;
/* Continue to accumulate into ulonglong */
for (dot= NULL, ull= ul; str < end; str++)
{
if ((ch= (unsigned char) (*str - '0')) < 10)
{
if (ull < CUTOFF || (ull == CUTOFF && ch <= CUTLIM))
{
ull= ull * 10 + ch;
digits++;
continue;
}
/*
Adding the next digit would overflow.
Remember the next digit in "addon", for rounding.
Scan all digits with an optional single dot.
*/
if (ull == CUTOFF)
{
ull= ULONGLONG_MAX;
addon= 1;
str++;
}
else
addon= (*str >= '5');
for ( ; str < end && (ch= (unsigned char) (*str - '0')) < 10; str++)
{
if (!dot)
shift++;
}
if (str < end && *str == '.' && !dot)
{
str++;
for ( ; str < end && (ch= (unsigned char) (*str - '0')) < 10; str++);
}
goto exp;
}
if (*str == '.')
{
if (dot)
{
/* The second dot character */
addon= 0;
goto exp;
}
else
{
dot= str + 1;
}
continue;
}
/* Unknown character, exit the loop */
break;
}
shift= dot ? dot - str : 0; /* Right shift */
addon= 0;
exp: /* [ E [ <sign> ] <unsigned integer> ] */
if (!digits)
{
str= beg;
goto ret_edom;
}
if (str < end && (*str == 'e' || *str == 'E'))
{
str++;
if (str < end)
{
int negative_exp, exp;
if ((negative_exp= (*str == '-')) || *str=='+')
{
if (++str == end)
goto ret_sign;
}
for (exp= 0 ;
str < end && (ch= (unsigned char) (*str - '0')) < 10;
str++)
{
exp= exp * 10 + ch;
}
shift+= negative_exp ? -exp : exp;
}
}
if (shift == 0) /* No shift, check addon digit */
{
if (addon)
{
if (ull == ULONGLONG_MAX)
goto ret_too_big;
ull++;
}
goto ret_sign;
}
if (shift < 0) /* Right shift */
{
ulonglong d, r;
if (-shift >= DIGITS_IN_ULONGLONG)
goto ret_zero; /* Exponent is a big negative number, return 0 */
d= d10[-shift];
r= (ull % d) * 2;
ull /= d;
if (r >= d)
ull++;
goto ret_sign;
}
if (shift > DIGITS_IN_ULONGLONG) /* Huge left shift */
{
if (!ull)
goto ret_sign;
goto ret_too_big;
}
for ( ; shift > 0; shift--, ull*= 10) /* Left shift */
{
if (ull > CUTOFF)
goto ret_too_big; /* Overflow, number too big */
}
ret_sign:
*endptr= (char*) str;
if (!unsigned_flag)
{
if (negative)
{
if (ull > (ulonglong) LONGLONG_MIN)
{
*error= MY_ERRNO_ERANGE;
return (ulonglong) LONGLONG_MIN;
}
*error= 0;
return (ulonglong) -ull;
}
else
{
if (ull > (ulonglong) LONGLONG_MAX)
{
*error= MY_ERRNO_ERANGE;
return (ulonglong) LONGLONG_MAX;
}
*error= 0;
return ull;
}
}
/* Unsigned number */
if (negative && ull)
{
*error= MY_ERRNO_ERANGE;
return 0;
}
*error= 0;
return ull;
ret_zero:
*endptr= (char*) str;
*error= 0;
return 0;
ret_edom:
*endptr= (char*) str;
*error= MY_ERRNO_EDOM;
return 0;
ret_too_big:
*endptr= (char*) str;
*error= MY_ERRNO_ERANGE;
return unsigned_flag ?
ULONGLONG_MAX :
negative ? (ulonglong) LONGLONG_MIN : (ulonglong) LONGLONG_MAX;
}
/*
Check if a constant can be propagated
@ -1448,6 +1784,7 @@ MY_CHARSET_HANDLER my_charset_8bit_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -4664,6 +4664,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -892,6 +892,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -974,6 +974,35 @@ double my_strntod_ucs2(CHARSET_INFO *cs __attribute__((unused)),
}
ulonglong my_strntoull10rnd_ucs2(CHARSET_INFO *cs __attribute__((unused)),
const char *nptr, uint length, int unsign_fl,
char **endptr, int *err)
{
char buf[256], *b= buf;
ulonglong res;
const uchar *end, *s= (const uchar*) nptr;
my_wc_t wc;
int cnv;
/* Cut too long strings */
if (length >= sizeof(buf))
length= sizeof(buf)-1;
end= s + length;
while ((cnv= cs->cset->mb_wc(cs,&wc,s,end)) > 0)
{
s+= cnv;
if (wc > (int) (uchar) 'e' || !wc)
break; /* Can't be a number part */
*b++= (char) wc;
}
res= my_strntoull10rnd_8bit(cs, buf, b - buf, unsign_fl, endptr, err);
*endptr= (char*) nptr + 2 * (uint) (*endptr- buf);
return res;
}
/*
This is a fast version optimized for the case of radix 10 / -10
*/
@ -1630,6 +1659,7 @@ MY_CHARSET_HANDLER my_charset_ucs2_handler=
my_strntoull_ucs2,
my_strntod_ucs2,
my_strtoll10_ucs2,
my_strntoull10rnd_ucs2,
my_scan_ucs2
};

View file

@ -8546,6 +8546,7 @@ static MY_CHARSET_HANDLER my_charset_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -2551,6 +2551,7 @@ MY_CHARSET_HANDLER my_charset_utf8_handler=
my_strntoull_8bit,
my_strntod_8bit,
my_strtoll10_8bit,
my_strntoull10rnd_8bit,
my_scan_8bit
};

View file

@ -19,6 +19,7 @@
#include "my_xml.h"
#define MY_XML_UNKNOWN 'U'
#define MY_XML_EOF 'E'
#define MY_XML_STRING 'S'
#define MY_XML_IDENT 'I'
@ -39,6 +40,46 @@ typedef struct xml_attr_st
} MY_XML_ATTR;
/*
XML ctype:
*/
#define MY_XML_ID0 0x01 /* Identifier initial character */
#define MY_XML_ID1 0x02 /* Identifier medial character */
#define MY_XML_SPC 0x08 /* Spacing character */
/*
http://www.w3.org/TR/REC-xml/
[4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' |
CombiningChar | Extender
[5] Name ::= (Letter | '_' | ':') (NameChar)*
*/
static char my_xml_ctype[256]=
{
/*00*/ 0,0,0,0,0,0,0,0,0,8,8,0,0,8,0,0,
/*10*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
/*20*/ 8,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0, /* !"#$%&'()*+,-./ */
/*30*/ 2,2,2,2,2,2,2,2,2,2,3,0,0,0,0,0, /* 0123456789:;<=>? */
/*40*/ 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, /* @ABCDEFGHIJKLMNO */
/*50*/ 3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,3, /* PQRSTUVWXYZ[\]^_ */
/*60*/ 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, /* `abcdefghijklmno */
/*70*/ 3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0, /* pqrstuvwxyz{|}~ */
/*80*/ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
/*90*/ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
/*A0*/ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
/*B0*/ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
/*C0*/ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
/*D0*/ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
/*E0*/ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
/*F0*/ 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
};
#define my_xml_is_space(c) (my_xml_ctype[(uchar) (c)] & MY_XML_SPC)
#define my_xml_is_id0(c) (my_xml_ctype[(uchar) (c)] & MY_XML_ID0)
#define my_xml_is_id1(c) (my_xml_ctype[(uchar) (c)] & MY_XML_ID1)
static const char *lex2str(int lex)
{
switch(lex)
@ -56,13 +97,13 @@ static const char *lex2str(int lex)
case MY_XML_QUESTION: return "'?'";
case MY_XML_EXCLAM: return "'!'";
}
return "UNKNOWN";
return "unknown token";
}
static void my_xml_norm_text(MY_XML_ATTR *a)
{
for ( ; (a->beg < a->end) && strchr(" \t\r\n",a->beg[0]) ; a->beg++ );
for ( ; (a->beg < a->end) && strchr(" \t\r\n",a->end[-1]) ; a->end-- );
for ( ; (a->beg < a->end) && my_xml_is_space(a->beg[0]) ; a->beg++ );
for ( ; (a->beg < a->end) && my_xml_is_space(a->end[-1]) ; a->end-- );
}
@ -70,7 +111,7 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a)
{
int lex;
for( ; ( p->cur < p->end) && strchr(" \t\r\n",p->cur[0]) ; p->cur++);
for( ; ( p->cur < p->end) && my_xml_is_space(p->cur[0]) ; p->cur++);
if (p->cur >= p->end)
{
@ -124,16 +165,17 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a)
my_xml_norm_text(a);
lex=MY_XML_STRING;
}
else
else if (my_xml_is_id0(p->cur[0]))
{
for(;
(p->cur < p->end) && !strchr("?'\"=/<> \t\r\n", p->cur[0]);
p->cur++)
{}
p->cur++;
while (p->cur < p->end && my_xml_is_id1(p->cur[0]))
p->cur++;
a->end=p->cur;
my_xml_norm_text(a);
lex=MY_XML_IDENT;
}
else
lex= MY_XML_UNKNOWN;
#if 0
printf("LEX=%s[%d]\n",lex2str(lex),a->end-a->beg);