summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2001-03-12 20:18:16 -0700
committerunknown <sasha@mysql.sashanet.com>2001-03-12 20:18:16 -0700
commit49e73e6f2069f021600d39c964babfcf4e165297 (patch)
treeeae6ce17036177571f150abef4027475b6aaaedd /sql
parent0d70b929833aeee50535343fde6ab77a15c24083 (diff)
parenta4c63857aa511cfa6b086cd0c83333eac7804572 (diff)
downloadmariadb-git-49e73e6f2069f021600d39c964babfcf4e165297.tar.gz
Merge work:/home/bk/mysql
into mysql.sashanet.com:/home/sasha/src/bk/mysql Docs/manual.texi: Auto merged sql/sql_parse.cc: Auto merged sql/sql_class.h: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/gen_lex_hash.cc8
-rw-r--r--sql/lex.h1
-rw-r--r--sql/mysql_priv.h2
-rw-r--r--sql/sql_class.h5
-rw-r--r--sql/sql_lex.cc56
-rw-r--r--sql/sql_parse.cc4
-rw-r--r--sql/sql_yacc.yy23
7 files changed, 68 insertions, 31 deletions
diff --git a/sql/gen_lex_hash.cc b/sql/gen_lex_hash.cc
index 78ffb266366..ca105257f19 100644
--- a/sql/gen_lex_hash.cc
+++ b/sql/gen_lex_hash.cc
@@ -254,7 +254,7 @@ you have to change 'main' to print out the new function\n");
if (write_warning)
fprintf (stderr,"Fatal error when generating hash for symbols\n\
Didn't find suitable values for perfect hashing:\n\
-You have to edit gen_lex_hase.cc to generate a new hashing function.\n\
+You have to edit gen_lex_hash.cc to generate a new hashing function.\n\
You can try running gen_lex_hash with --search to find a suitable value\n\
Symbol array size = %d\n",function_mod);
return -1;
@@ -472,8 +472,10 @@ int main(int argc,char **argv)
int error;
MY_INIT(argv[0]);
- start_value=5315771L; best_t1=6916833L; best_t2=3813748L; best_type=3; /* mode=5839 add=5 type: 0 */
- if (get_options(argc,(char **) argv))
+ start_value=4934807L; best_t1=5181754L; best_t2=1469522L; best_type=0;
+ /* mode=4999 add=7 type: 0 */
+
+ if (get_options(argc,(char **) argv))
exit(1);
make_max_length_table();
diff --git a/sql/lex.h b/sql/lex.h
index 6f030aa524d..6d676a39755 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -270,6 +270,7 @@ static SYMBOL symbols[] = {
{ "SLAVE", SYM(SLAVE),0,0},
{ "SMALLINT", SYM(SMALLINT),0,0},
{ "SONAME", SYM(UDF_SONAME_SYM),0,0},
+ { "SQL_ANSI_MODE", SYM(SQL_ANSI_MODE),0,0},
{ "SQL_AUTO_IS_NULL", SYM(SQL_AUTO_IS_NULL),0,0},
{ "SQL_BIG_RESULT", SYM(SQL_BIG_RESULT),0,0},
{ "SQL_BIG_SELECTS", SYM(SQL_BIG_SELECTS),0,0},
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index a975cab3c7c..1f41e0a0d2e 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -539,6 +539,8 @@ extern struct show_var_st init_vars[];
extern struct show_var_st status_vars[];
extern enum db_type default_table_type;
+extern uchar global_state_map[256];
+
#ifndef __WIN__
extern pthread_t signal_thread;
#endif
diff --git a/sql/sql_class.h b/sql/sql_class.h
index d1b870852ee..3fd166ebc5a 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -286,7 +286,10 @@ public:
ulong slave_proxy_id; // in slave thread we need to know in behalf of which
// thread the query is being run to replicate temp tables properly
-
+
+ // thread-specific state map for lex parser
+ uchar state_map[256];
+
THD();
~THD();
bool store_globals();
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index b8d2ee13b0e..f0357b99d70 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -75,7 +75,7 @@ inline int lex_casecmp(const char *s, const char *t, uint len)
#include "lex_hash.h"
-static uchar state_map[256];
+uchar global_state_map[256];
void lex_init(void)
@@ -89,42 +89,49 @@ void lex_init(void)
VOID(pthread_key_create(&THR_LEX,NULL));
- /* Fill state_map with states to get a faster parser */
+ /* Fill global_state_map with states to get a faster parser */
for (i=0; i < 256 ; i++)
{
if (isalpha(i))
- state_map[i]=(uchar) STATE_IDENT;
+ global_state_map[i]=(uchar) STATE_IDENT;
else if (isdigit(i))
- state_map[i]=(uchar) STATE_NUMBER_IDENT;
+ global_state_map[i]=(uchar) STATE_NUMBER_IDENT;
#if defined(USE_MB) && defined(USE_MB_IDENT)
else if (use_mb(default_charset_info) && my_ismbhead(default_charset_info, i))
- state_map[i]=(uchar) STATE_IDENT;
+ global_state_map[i]=(uchar) STATE_IDENT;
#endif
else if (!isgraph(i))
- state_map[i]=(uchar) STATE_SKIP;
+ global_state_map[i]=(uchar) STATE_SKIP;
else
- state_map[i]=(uchar) STATE_CHAR;
+ global_state_map[i]=(uchar) STATE_CHAR;
}
- state_map[(uchar)'_']=state_map[(uchar)'$']=(uchar) STATE_IDENT;
- state_map[(uchar)'\'']=state_map[(uchar)'"']=(uchar) STATE_STRING;
- state_map[(uchar)'-']=state_map[(uchar)'+']=(uchar) STATE_SIGNED_NUMBER;
- state_map[(uchar)'.']=(uchar) STATE_REAL_OR_POINT;
- state_map[(uchar)'>']=state_map[(uchar)'=']=state_map[(uchar)'!']= (uchar) STATE_CMP_OP;
- state_map[(uchar)'<']= (uchar) STATE_LONG_CMP_OP;
- state_map[(uchar)'&']=state_map[(uchar)'|']=(uchar) STATE_BOOL;
- state_map[(uchar)'#']=(uchar) STATE_COMMENT;
- state_map[(uchar)';']=(uchar) STATE_COLON;
- state_map[(uchar)':']=(uchar) STATE_SET_VAR;
- state_map[0]=(uchar) STATE_EOL;
- state_map[(uchar)'\\']= (uchar) STATE_ESCAPE;
- state_map[(uchar)'/']= (uchar) STATE_LONG_COMMENT;
- state_map[(uchar)'*']= (uchar) STATE_END_LONG_COMMENT;
- state_map[(uchar)'@']= (uchar) STATE_USER_END;
- state_map[(uchar) '`']= (uchar) STATE_USER_VARIABLE_DELIMITER;
+ global_state_map[(uchar)'_']=
+ global_state_map[(uchar)'$']=(uchar) STATE_IDENT;
+ global_state_map[(uchar)'\'']=
+ global_state_map[(uchar)'"']=(uchar) STATE_STRING;
+ global_state_map[(uchar)'-']=
+ global_state_map[(uchar)'+']=(uchar) STATE_SIGNED_NUMBER;
+ global_state_map[(uchar)'.']=(uchar) STATE_REAL_OR_POINT;
+ global_state_map[(uchar)'>']=
+ global_state_map[(uchar)'=']=
+ global_state_map[(uchar)'!']= (uchar) STATE_CMP_OP;
+ global_state_map[(uchar)'<']= (uchar) STATE_LONG_CMP_OP;
+ global_state_map[(uchar)'&']=global_state_map[(uchar)'|']=(uchar) STATE_BOOL;
+ global_state_map[(uchar)'#']=(uchar) STATE_COMMENT;
+ global_state_map[(uchar)';']=(uchar) STATE_COLON;
+ global_state_map[(uchar)':']=(uchar) STATE_SET_VAR;
+ global_state_map[0]=(uchar) STATE_EOL;
+ global_state_map[(uchar)'\\']= (uchar) STATE_ESCAPE;
+ global_state_map[(uchar)'/']= (uchar) STATE_LONG_COMMENT;
+ global_state_map[(uchar)'*']= (uchar) STATE_END_LONG_COMMENT;
+ global_state_map[(uchar)'@']= (uchar) STATE_USER_END;
+ global_state_map[(uchar) '`']= (uchar) STATE_USER_VARIABLE_DELIMITER;
+
if (thd_startup_options & OPTION_ANSI_MODE)
{
- state_map[(uchar) '"'] = STATE_USER_VARIABLE_DELIMITER;
+ global_state_map[(uchar) '"'] = STATE_USER_VARIABLE_DELIMITER;
}
+
DBUG_VOID_RETURN;
}
@@ -418,6 +425,7 @@ int yylex(void *arg)
uint length;
enum lex_states state,prev_state;
LEX *lex=current_lex;
+ uchar *state_map = lex->thd->state_map;
YYSTYPE *yylval=(YYSTYPE*) arg;
lex->yylval=yylval; // The global state
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 1884a8825ba..6ddb3b45864 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -512,6 +512,10 @@ pthread_handler_decl(handle_one_connection,arg)
return 0;
}
+ // copy global state map into thread
+ for(int x=0; x < 256; x++)
+ thd->state_map[x] = global_state_map[x];
+
do
{
int error;
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index fa44e7799fa..9a0badda099 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -394,6 +394,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token END
%token THEN_SYM
+%token SQL_ANSI_MODE
%token SQL_BIG_TABLES
%token SQL_BIG_SELECTS
%token SQL_SELECT_LIMIT
@@ -2603,6 +2604,18 @@ option_value:
else
Lex->options|= OPTION_NOT_AUTO_COMMIT;
}
+ | SQL_ANSI_MODE equal NUM
+ {
+ if(atoi($3.str) == 0)
+ {
+ Lex->options &= ~(OPTION_ANSI_MODE);
+ Lex->thd->state_map[(uchar) '"'] = STATE_STRING;
+ } else {
+ Lex->options |= OPTION_ANSI_MODE;
+ Lex->thd->state_map[(uchar) '"'] = STATE_USER_VARIABLE_DELIMITER;
+ }
+ }
+
| SQL_SELECT_LIMIT equal ULONG_NUM
{
Lex->select_limit= $3;
@@ -2697,16 +2710,20 @@ text_or_password:
}
set_option:
- SQL_BIG_TABLES { $$= OPTION_BIG_TABLES; }
+ SQL_BIG_TABLES { $$= OPTION_BIG_TABLES; }
| SQL_BIG_SELECTS { $$= OPTION_BIG_SELECTS; }
| SQL_LOG_OFF { $$= OPTION_LOG_OFF; }
| SQL_LOG_UPDATE
{
- $$= (opt_sql_bin_update)? OPTION_UPDATE_LOG|OPTION_BIN_LOG: OPTION_UPDATE_LOG ;
+ $$= (opt_sql_bin_update)?
+ OPTION_UPDATE_LOG|OPTION_BIN_LOG:
+ OPTION_UPDATE_LOG ;
}
| SQL_LOG_BIN
{
- $$= (opt_sql_bin_update)? OPTION_UPDATE_LOG|OPTION_BIN_LOG: OPTION_BIN_LOG ;
+ $$= (opt_sql_bin_update)?
+ OPTION_UPDATE_LOG|OPTION_BIN_LOG:
+ OPTION_BIN_LOG ;
}
| SQL_WARNINGS { $$= OPTION_WARNINGS; }
| SQL_LOW_PRIORITY_UPDATES { $$= OPTION_LOW_PRIORITY_UPDATES; }