mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 15:50:51 +03:00 
			
		
		
		
	 a508260b85
			
		
	
	a508260b85
	
	
	
		
			
			Bug 28127 (Some valid identifiers names are not parsed correctly) Bug 26302 (MySQL server cuts off trailing "*/" from comments in SP/func) This patch is the second part of a major cleanup, required to fix Bug 25411 (trigger code truncated). The root cause of the issue stems from the function skip_rear_comments, which was a work around to remove "extra" "*/" characters from the query text, when parsing a query and reusing the text fragments to represent a view, trigger, function or stored procedure. The reason for this work around is that "special comments", like /*!50002 XXX */, were not parsed properly, so that a query like: AAA /*!50002 BBB */ CCC would be seen by the parser as "AAA BBB */ CCC" when the current version is greater or equal to 5.0.2 The root cause of this stems from how special comments are parsed. Special comments are really out-of-bound text that appear inside a query, that affects how the parser behave. In nature, /*!50002 XXX */ in MySQL is similar to the C concept of preprocessing : #if VERSION >= 50002 XXX #endif Depending on the current VERSION of the server, either the special comment should be expanded or it should be ignored, but in all cases the "text" of the query should be re-written to strip the "/*!50002" and "*/" markers, which does not belong to the SQL language itself. Prior to this fix, these markers would leak into : - the storage format for VIEW, - the storage format for FUNCTION, - the storage format for FUNCTION parameters, in mysql.proc (param_list), - the storage format for PROCEDURE, - the storage format for PROCEDURE parameters, in mysql.proc (param_list), - the storage format for TRIGGER, - the binary log used for replication. In all cases, not only this cause format corruption, but also provide a vector for dormant security issues, by allowing to tunnel code that will be activated after an upgrade. The proper solution is to deal with special comments strictly during parsing, when accepting a query from the outside world. Once a query is parsed and an object is created with a persistant representation, this object should not arbitrarily mutate after an upgrade. In short, special comments are a useful but limited feature for MYSQLdump, when used at an *interface* level to facilitate import/export, but bloating the server *internal* storage format is *not* the proper way to deal with configuration management of the user logic. With this fix: - the Lex_input_stream class now acts as a comment pre-processor, and either expands or ignore special comments on the fly. - MYSQLlex and sql_yacc.yy have been cleaned up to strictly use the public interface of Lex_input_stream. In particular, how the input stream accepts or rejects a character is private to Lex_input_stream, and the internal buffer pointers of that class are strictly private, and should not be tempered with during parsing. This caused many changes mostly in sql_lex.cc. During the code cleanup in case MY_LEX_NUMBER_IDENT, Bug 28127 (Some valid identifiers names are not parsed correctly) was found and fixed. By parsing special comments properly, and removing the function 'skip_rear_comments' [sic], Bug 26302 (MySQL server cuts off trailing "*/" from comments in SP/func) has been fixed as well.
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| drop table if exists t1;
 | |
| select 0x41,0x41+0,0x41 | 0x7fffffffffffffff | 0,0xffffffffffffffff | 0 ;
 | |
| 0x41	0x41+0	0x41 | 0x7fffffffffffffff | 0	0xffffffffffffffff | 0
 | |
| A	65	9223372036854775807	18446744073709551615
 | |
| select 0x31+1,concat(0x31)+1,-0xf;
 | |
| 0x31+1	concat(0x31)+1	-0xf
 | |
| 50	2	-15
 | |
| select x'31',X'ffff'+0;
 | |
| x'31'	X'ffff'+0
 | |
| 1	65535
 | |
| create table t1 (ID int(8) unsigned zerofill not null auto_increment,UNIQ bigint(21) unsigned zerofill not null,primary key (ID),unique (UNIQ) );
 | |
| insert into t1 set UNIQ=0x38afba1d73e6a18a;
 | |
| insert into t1 set UNIQ=123;
 | |
| explain extended select * from t1 where UNIQ=0x38afba1d73e6a18a;
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 | |
| 1	SIMPLE	t1	const	UNIQ	UNIQ	8	const	1	100.00	
 | |
| Warnings:
 | |
| Note	1003	select '00000001' AS `ID`,'004084688022709641610' AS `UNIQ` from `test`.`t1` where 1
 | |
| drop table t1;
 | |
| select x'hello';
 | |
| ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'x'hello'' at line 1
 | |
| select 0xfg;
 | |
| ERROR 42S22: Unknown column '0xfg' in 'field list'
 | |
| create table t1 select 1 as x, 2 as xx;
 | |
| select x,xx from t1;
 | |
| x	xx
 | |
| 1	2
 | |
| drop table t1;
 | |
| show create table t1;
 | |
| Table	Create Table
 | |
| t1	CREATE TABLE `t1` (
 | |
|   `a` varbinary(255) DEFAULT NULL,
 | |
|   `b` varchar(255) DEFAULT NULL
 | |
| ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 | |
| select length(a), length(b) from t1;
 | |
| length(a)	length(b)
 | |
| 255	3
 | |
| 255	3
 | |
| CHECK TABLE t1 FOR UPGRADE;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	check	error	Table upgrade required. Please do "REPAIR TABLE `t1`" to fix it!
 | |
| REPAIR TABLE t1;
 | |
| Table	Op	Msg_type	Msg_text
 | |
| test.t1	repair	status	OK
 | |
| show create table t1;
 | |
| Table	Create Table
 | |
| t1	CREATE TABLE `t1` (
 | |
|   `a` varbinary(255) DEFAULT NULL,
 | |
|   `b` varchar(255) DEFAULT NULL
 | |
| ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 | |
| select length(a), length(b) from t1;
 | |
| length(a)	length(b)
 | |
| 3	3
 | |
| 3	3
 | |
| insert into t1 values("ccc", "ddd");
 | |
| select length(a), length(b) from t1;
 | |
| length(a)	length(b)
 | |
| 3	3
 | |
| 3	3
 | |
| 3	3
 | |
| select hex(a), hex(b) from t1;
 | |
| hex(a)	hex(b)
 | |
| 616161	636363
 | |
| 626262	646464
 | |
| 636363	646464
 | |
| select concat("'", a, "'"), concat("'", b, "'") from t1;
 | |
| concat("'", a, "'")	concat("'", b, "'")
 | |
| 'aaa'	'ccc'
 | |
| 'bbb'	'ddd'
 | |
| 'ccc'	'ddd'
 | |
| drop table t1;
 | |
| create table t1(a varbinary(255));
 | |
| insert into t1 values("aaa   ");
 | |
| select length(a) from t1;
 | |
| length(a)
 | |
| 6
 | |
| alter table t1 modify a varchar(255);
 | |
| select length(a) from t1;
 | |
| length(a)
 | |
| 6
 | |
| drop table t1;
 | |
| drop table if exists table_28127_a;
 | |
| drop table if exists table_28127_b;
 | |
| create table table_28127_a(0b02 int);
 | |
| show create table table_28127_a;
 | |
| Table	Create Table
 | |
| table_28127_a	CREATE TABLE `table_28127_a` (
 | |
|   `0b02` int(11) DEFAULT NULL
 | |
| ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 | |
| create table table_28127_b(0b2 int);
 | |
| show create table table_28127_b;
 | |
| Table	Create Table
 | |
| table_28127_b	CREATE TABLE `table_28127_b` (
 | |
|   `0b2` int(11) DEFAULT NULL
 | |
| ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 | |
| drop table table_28127_a;
 | |
| drop table table_28127_b;
 |