Support sql_mode "ANSI_QUOTES".
This commit is contained in:
		
							
								
								
									
										5
									
								
								deps/oblib/src/common/sql_mode/ob_sql_mode.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								deps/oblib/src/common/sql_mode/ob_sql_mode.h
									
									
									
									
										vendored
									
									
								
							@ -135,6 +135,11 @@ typedef uint64_t ObSQLMode;
 | 
				
			|||||||
    is_true = (SMO_NO_BACKSLASH_ESCAPES & mode); \
 | 
					    is_true = (SMO_NO_BACKSLASH_ESCAPES & mode); \
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define IS_ANSI_QUOTES(mode, is_true)   \
 | 
				
			||||||
 | 
					  {                                     \
 | 
				
			||||||
 | 
					    is_true = (SMO_ANSI_QUOTES & mode); \
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -70,7 +70,8 @@ ObSQLMode SUPPORT_MODE = SMO_STRICT_ALL_TABLES
 | 
				
			|||||||
  | SMO_NO_KEY_OPTIONS
 | 
					  | SMO_NO_KEY_OPTIONS
 | 
				
			||||||
  | SMO_NO_TABLE_OPTIONS
 | 
					  | SMO_NO_TABLE_OPTIONS
 | 
				
			||||||
  | SMO_NO_FIELD_OPTIONS
 | 
					  | SMO_NO_FIELD_OPTIONS
 | 
				
			||||||
  | SMO_NO_BACKSLASH_ESCAPES;
 | 
					  | SMO_NO_BACKSLASH_ESCAPES
 | 
				
			||||||
 | 
					  | SMO_ANSI_QUOTES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool is_sql_mode_supported(ObSQLMode mode)
 | 
					bool is_sql_mode_supported(ObSQLMode mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -34,6 +34,8 @@ extern void obsql_mysql_parser_fatal_error(yyconst char *msg, yyscan_t yyscanner
 | 
				
			|||||||
%x sq
 | 
					%x sq
 | 
				
			||||||
%x dq
 | 
					%x dq
 | 
				
			||||||
%x bt
 | 
					%x bt
 | 
				
			||||||
 | 
					/* the adq is used to process dq in ANSI_QUOTES sql_mode*/
 | 
				
			||||||
 | 
					%x adq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
U  [\x80-\xbf]
 | 
					U  [\x80-\xbf]
 | 
				
			||||||
U_2  [\xc2-\xdf]
 | 
					U_2  [\xc2-\xdf]
 | 
				
			||||||
@ -79,6 +81,7 @@ dqbegin       {dquote}
 | 
				
			|||||||
dqend         {dquote}
 | 
					dqend         {dquote}
 | 
				
			||||||
dqdouble      {dquote}{dquote}
 | 
					dqdouble      {dquote}{dquote}
 | 
				
			||||||
dqcontent     [^\\\n\r"]+
 | 
					dqcontent     [^\\\n\r"]+
 | 
				
			||||||
 | 
					adqcontent    [^"]+
 | 
				
			||||||
dqnewline     {dquote}{whitespace}{dquote}
 | 
					dqnewline     {dquote}{whitespace}{dquote}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
backtick      `
 | 
					backtick      `
 | 
				
			||||||
@ -631,8 +634,28 @@ FALSE {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{dqbegin} {
 | 
					{dqbegin} {
 | 
				
			||||||
  BEGIN(dq);
 | 
					 | 
				
			||||||
  ParseResult *p = (ParseResult *)yyextra;
 | 
					  ParseResult *p = (ParseResult *)yyextra;
 | 
				
			||||||
 | 
					  ObSQLMode mode = p->sql_mode_;
 | 
				
			||||||
 | 
					  bool is_ansi_quotes = false;
 | 
				
			||||||
 | 
					  IS_ANSI_QUOTES(mode, is_ansi_quotes);
 | 
				
			||||||
 | 
					  if (is_ansi_quotes) {
 | 
				
			||||||
 | 
					    BEGIN(adq); 
 | 
				
			||||||
 | 
					    if (IS_FAST_PARAMETERIZE) {
 | 
				
			||||||
 | 
					      COPY_WRITE();
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      check_value(yylval);
 | 
				
			||||||
 | 
					      p->start_col_ = yylloc->first_column;
 | 
				
			||||||
 | 
					      char **tmp_literal = &p->tmp_literal_;
 | 
				
			||||||
 | 
					      if (*tmp_literal == NULL)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        *tmp_literal = (char*) parse_malloc(p->input_sql_len_ + 1, p->malloc_pool_);
 | 
				
			||||||
 | 
					        check_value(*tmp_literal);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      malloc_new_node(yylval->node, p->malloc_pool_, T_IDENT, 0);
 | 
				
			||||||
 | 
					      yylval->node->str_len_ = 0;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    BEGIN(dq);
 | 
				
			||||||
    p->start_col_ = yylloc->first_column;
 | 
					    p->start_col_ = yylloc->first_column;
 | 
				
			||||||
    char **tmp_literal = &p->tmp_literal_;
 | 
					    char **tmp_literal = &p->tmp_literal_;
 | 
				
			||||||
    if (*tmp_literal == NULL)
 | 
					    if (*tmp_literal == NULL)
 | 
				
			||||||
@ -646,6 +669,7 @@ FALSE {
 | 
				
			|||||||
    if (IS_FAST_PARAMETERIZE && !IS_NEED_PARAMETERIZE) {
 | 
					    if (IS_FAST_PARAMETERIZE && !IS_NEED_PARAMETERIZE) {
 | 
				
			||||||
      return OUTLINE_DEFAULT_TOKEN;
 | 
					      return OUTLINE_DEFAULT_TOKEN;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<dq>{dqend} {
 | 
					<dq>{dqend} {
 | 
				
			||||||
@ -745,6 +769,56 @@ FALSE {
 | 
				
			|||||||
  return PARSER_SYNTAX_ERROR;
 | 
					  return PARSER_SYNTAX_ERROR;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<adq>{dqdouble} {
 | 
				
			||||||
 | 
					  if (IS_FAST_PARAMETERIZE) {
 | 
				
			||||||
 | 
					    COPY_WRITE();
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    check_value(yylval);
 | 
				
			||||||
 | 
					    ((ParseResult *)yyextra)->tmp_literal_[yylval->node->str_len_++] = '"';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<adq>{adqcontent} {
 | 
				
			||||||
 | 
					  if (IS_FAST_PARAMETERIZE) {
 | 
				
			||||||
 | 
					    COPY_WRITE();
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    check_value(yylval);
 | 
				
			||||||
 | 
					    memmove(((ParseResult *)yyextra)->tmp_literal_ + yylval->node->str_len_, yytext, yyleng);
 | 
				
			||||||
 | 
					    yylval->node->str_len_ += yyleng;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<adq>{dqend} {
 | 
				
			||||||
 | 
					  BEGIN(INITIAL);
 | 
				
			||||||
 | 
					  if (IS_FAST_PARAMETERIZE) {
 | 
				
			||||||
 | 
					    COPY_WRITE();
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    ParseResult *p = (ParseResult *)yyextra;
 | 
				
			||||||
 | 
					    check_value(yylval);
 | 
				
			||||||
 | 
					    yylloc->first_column = p->start_col_;
 | 
				
			||||||
 | 
					    char *tmp_literal = p->tmp_literal_;
 | 
				
			||||||
 | 
					    tmp_literal[yylval->node->str_len_] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    char *dup_value = NULL;
 | 
				
			||||||
 | 
					    if (p->is_not_utf8_connection_) {
 | 
				
			||||||
 | 
					      dup_value = parse_str_convert_utf8(p->charset_info_, tmp_literal, p->malloc_pool_, &(yylval->node->str_len_), &(p->extra_errno_));
 | 
				
			||||||
 | 
					      check_identifier_convert_result(p->extra_errno_);
 | 
				
			||||||
 | 
					      //fprintf(stderr, "parse identifier result, str=%s, str_len=%ld\n", node->str_value_, node->str_len_);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      dup_value = parse_strndup(tmp_literal, yylval->node->str_len_ + 1, p->malloc_pool_);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    check_value(dup_value);
 | 
				
			||||||
 | 
					    yylval->node->str_value_ = dup_value;
 | 
				
			||||||
 | 
					    setup_token_pos_info(yylval->node, yylloc->first_column, yylval->node->str_len_);
 | 
				
			||||||
 | 
					    return NAME_OB;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<adq><<EOF>> {
 | 
				
			||||||
 | 
					  yyerror(yylloc, yyextra, "unterminated backtick string\n");
 | 
				
			||||||
 | 
					  return PARSER_SYNTAX_ERROR;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{btbegin} {
 | 
					{btbegin} {
 | 
				
			||||||
  BEGIN(bt); /*fast parameterize don't handle connent in ``*/
 | 
					  BEGIN(bt); /*fast parameterize don't handle connent in ``*/
 | 
				
			||||||
  if (IS_FAST_PARAMETERIZE) {
 | 
					  if (IS_FAST_PARAMETERIZE) {
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user