summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <konstantin@mysql.com>2005-07-15 00:31:09 +0400
committerunknown <konstantin@mysql.com>2005-07-15 00:31:09 +0400
commitb0641a3bdd518439a2bf8d5f66dda663942e40b6 (patch)
tree67dc52609b50b369c1fe7c45c4b20109d1c9bff2 /sql
parent7750905037e9c1e64d5172819b746815ed268152 (diff)
parent73386c15a6698234d287525c2271b64756eb3354 (diff)
downloadmariadb-git-b0641a3bdd518439a2bf8d5f66dda663942e40b6.tar.gz
Merge mysql.com:/opt/local/work/mysql-4.1-root
into mysql.com:/opt/local/work/mysql-5.0-root regex/regerror.c: Auto merged sql/sql_lex.cc: Auto merged mysql-test/r/ps.result: Manual merge mysql-test/t/ps.test: Manual merge sql/sql_yacc.yy: Manual merge
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_lex.cc9
-rw-r--r--sql/sql_yacc.yy19
2 files changed, 15 insertions, 13 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 218410eed81..a4293fa76bd 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -556,6 +556,15 @@ int yylex(void *arg, void *yythd)
lex->next_state= MY_LEX_START; // Allow signed numbers
if (c == ',')
lex->tok_start=lex->ptr; // Let tok_start point at next item
+ /*
+ Check for a placeholder: it should not precede a possible identifier
+ because of binlogging: when a placeholder is replaced with
+ its value in a query for the binlog, the query must stay
+ grammatically correct.
+ */
+ else if (c == '?' && ((THD*) yythd)->command == COM_PREPARE &&
+ !ident_map[cs, yyPeek()])
+ return(PARAM_MARKER);
return((int) c);
case MY_LEX_IDENT_OR_NCHAR:
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 84de06d5604..f0ad035ed5a 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -465,6 +465,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
%token PACK_KEYS_SYM
%token PARTIAL
%token PASSWORD
+%token PARAM_MARKER
%token PHASE_SYM
%token POINTFROMTEXT
%token POINT_SYM
@@ -6933,23 +6934,15 @@ text_string:
;
param_marker:
- '?'
+ PARAM_MARKER
{
THD *thd=YYTHD;
LEX *lex= thd->lex;
- if (thd->command == COM_STMT_PREPARE)
- {
- Item_param *item= new Item_param((uint) (lex->tok_start -
- (uchar *) thd->query));
- if (!($$= item) || lex->param_list.push_back(item))
- {
- my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
- YYABORT;
- }
- }
- else
+ Item_param *item= new Item_param((uint) (lex->tok_start -
+ (uchar *) thd->query));
+ if (!($$= item) || lex->param_list.push_back(item))
{
- yyerror(ER(ER_SYNTAX_ERROR));
+ my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
YYABORT;
}
}