From c81300691327066b954fb34116f6d1f88e0d49d6 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 24 Oct 2002 22:59:29 +0300 Subject: fixed update with subselect (FOR REVIEW) mysql-test/r/subselect.result: update with subselect test mysql-test/t/subselect.test: update with subselect test sql/mysql_priv.h: fixed update with subselect sql/sql_base.cc: fixed update with subselect sql/sql_lex.cc: fixed update with subselect sql/sql_select.cc: fixed update with subselect sql/sql_update.cc: fixed update with subselect sql/sql_yacc.yy: fixed update with subselect --- sql/sql_lex.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sql/sql_lex.cc') diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 9f09afc78a6..132c760267f 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -148,6 +148,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->select_lex.expr_list.empty(); lex->select_lex.ftfunc_list_alloc.empty(); lex->select_lex.ftfunc_list= &lex->select->ftfunc_list_alloc; + lex->select= &lex->select_lex; lex->convert_set= (lex->thd= thd)->variables.convert_set; lex->yacc_yyss=lex->yacc_yyvs=0; lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); @@ -956,6 +957,7 @@ void st_select_lex::init_query() table_list.next= (byte**) &table_list.first; item_list.empty(); join= 0; + having_fix_field= 0; } void st_select_lex::init_select() @@ -973,7 +975,7 @@ void st_select_lex::init_select() ftfunc_list_alloc.empty(); ftfunc_list= &ftfunc_list_alloc; linkage= UNSPECIFIED_TYPE; - depended= having_fix_field= 0; + depended= 0; } /* -- cgit v1.2.1 From f980950bb3b19df3de3030c531ecff99ecb323e1 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 9 Nov 2002 15:40:46 +0200 Subject: Some code optimisations related to EXPLAIN of derived tables and the resulting code cleanup in our main loop. --- sql/sql_lex.cc | 1 + 1 file changed, 1 insertion(+) (limited to 'sql/sql_lex.cc') diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 5327801bf9c..0865e6da05f 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -959,6 +959,7 @@ void st_select_lex::init_query() table_list.next= (byte**) &table_list.first; item_list.empty(); join= 0; + olap= UNSPECIFIED_OLAP_TYPE; } void st_select_lex::init_select() -- cgit v1.2.1 From 2723dbdb5e2c60162ca464f65f68fdd13b7c9cef Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 21 Nov 2002 02:07:14 +0200 Subject: Automatic conversion from CHAR(length) to BLOB when length > 255 New operators MOD and DIV SELECT ... FROM DUAL TRUE = 1 and FALSE = 0 include/mysqld_error.h: New warning message mysql-test/r/func_system.result: Added testing of new functions mysql-test/r/func_test.result: Added testing of new functions mysql-test/r/type_blob.result: Added testing of new functions mysql-test/t/func_system.test: Added testing of new functions mysql-test/t/func_test.test: Added testing of new functions mysql-test/t/type_blob.test: Added testing of new functions sql/item_func.cc: Added function DIV sql/item_func.h: Added function DIV sql/lex.h: New keywords sql/share/czech/errmsg.txt: New warning message sql/share/danish/errmsg.txt: New warning message sql/share/dutch/errmsg.txt: New warning message sql/share/english/errmsg.txt: New warning message sql/share/estonian/errmsg.txt: New warning message sql/share/french/errmsg.txt: New warning message sql/share/german/errmsg.txt: New warning message sql/share/greek/errmsg.txt: New warning message sql/share/hungarian/errmsg.txt: New warning message sql/share/italian/errmsg.txt: New warning message sql/share/japanese/errmsg.txt: New warning message sql/share/korean/errmsg.txt: New warning message sql/share/norwegian-ny/errmsg.txt: New warning message sql/share/norwegian/errmsg.txt: New warning message sql/share/polish/errmsg.txt: New warning message sql/share/portuguese/errmsg.txt: New warning message sql/share/romanian/errmsg.txt: New warning message sql/share/russian/errmsg.txt: New warning message sql/share/serbian/errmsg.txt: New warning message sql/share/slovak/errmsg.txt: New warning message sql/share/spanish/errmsg.txt: New warning message sql/share/swedish/errmsg.txt: New warning message Translated a lot of error messages sql/share/ukrainian/errmsg.txt: New warning message sql/sql_class.cc: Added support for warnings during parsing sql/sql_class.h: Added support for warnings during parsing sql/sql_error.cc: Added support for warnings during parsing sql/sql_lex.cc: Fixed comment sql/sql_parse.cc: Added automatic conversion from CHAR(length) to BLOB when length > 255 Added support for BLOB(length) sql/sql_yacc.yy: New operators MOD and DIV SELECT ... FROM DUAL TRUE = 1 and FALSE = 0 --- sql/sql_lex.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'sql/sql_lex.cc') diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 0865e6da05f..975c3cfcf2b 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -855,9 +855,8 @@ int yylex(void *arg) case STATE_END: lex->next_state=STATE_END; return(0); // We found end of input last time - - // Actually real shouldn't start - // with . but allow them anyhow + + /* Actually real shouldn't start with . but allow them anyhow */ case STATE_REAL_OR_POINT: if (my_isdigit(system_charset_info,yyPeek())) state = STATE_REAL; // Real -- cgit v1.2.1 From c58d9d9a9dda3037db574bbf97b22e7c1c274e02 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 21 Nov 2002 22:25:53 +0200 Subject: Fixes after merge with 4.0 mysql-test/r/heap_btree.result: Updated results mysql-test/r/heap_hash.result: Updated results mysql-test/r/merge.result: Updated results mysql-test/r/rpl_log.result: Updated results mysql-test/r/select.result: Updated results mysql-test/r/subselect.result: Updated results sql/item_cmpfunc.h: Fix after merge sql/log_event.cc: Fix after merge sql/mysql_priv.h: Fix after merge sql/sql_acl.cc: Fix after merge sql/sql_class.cc: Fix after merge sql/sql_db.cc: Fix after merge sql/sql_delete.cc: Fix after merge sql/sql_lex.cc: Fix after merge sql/sql_lex.h: Fix after merge sql/sql_parse.cc: Fix after merge sql/sql_update.cc: Fix after merge sql/sql_yacc.yy: Fix after merge --- sql/sql_lex.cc | 1 - 1 file changed, 1 deletion(-) (limited to 'sql/sql_lex.cc') diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 975c3cfcf2b..9ed66aede6f 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1180,7 +1180,6 @@ bool st_select_lex_unit::create_total_list_n_last_return(THD *thd, st_lex *lex, if (!cursor) { /* Add not used table to the total table list */ - aux->lock_type= lex->lock_option; if (!(cursor= (TABLE_LIST *) thd->memdup((char*) aux, sizeof(*aux)))) { -- cgit v1.2.1 From 0e9a75a4f7151ea7930a5eaddfc91fd210873f16 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 22 Nov 2002 14:50:53 +0100 Subject: Moved safe_to_cache_query from thd to lex. This is required for prepared statements and stored procedures. BitKeeper/etc/ignore: Added bkpull.log bkpull.log.2 bkpull.log.3 build.log sql/safe_to_cache_query.txt to the ignore list sql/item_create.cc: Moved safe_to_cache_query from thd to lex. sql/item_func.cc: Moved safe_to_cache_query from thd to lex. sql/sql_cache.cc: Moved safe_to_cache_query from thd to lex. Note: Query_cache::is_cacheable() has both a thd and lex argument. We assumed that it's the lex->safe_to_cache_query we should test. sql/sql_class.cc: Moved safe_to_cache_query from thd to lex. sql/sql_class.h: Moved safe_to_cache_query from thd to lex. sql/sql_lex.cc: Moved safe_to_cache_query from thd to lex. We set it to 1 initially. It's then set to 0 in cases where it's know not to be safe. (Before this change, it was set to 0 in thd, and then set to 1 before parsing.) sql/sql_lex.h: Moved safe_to_cache_query from thd to lex. sql/sql_parse.cc: Moved safe_to_cache_query from thd to lex. No point in setting it here now, it's set in lex_start() later. sql/sql_prepare.cc: Moved safe_to_cache_query from thd to lex. Must set it after lex_start() has been called. sql/sql_yacc.yy: Moved safe_to_cache_query from thd to lex. --- sql/sql_lex.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'sql/sql_lex.cc') diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 9ed66aede6f..e3ffe2a8120 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -154,6 +154,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); lex->slave_thd_opt=0; lex->sql_command=SQLCOM_END; + lex->safe_to_cache_query= 1; bzero(&lex->mi,sizeof(lex->mi)); return lex; } @@ -182,7 +183,7 @@ static int find_keyword(LEX *lex, uint len, bool function) udf_func *udf; if (function && using_udf_functions && (udf=find_udf((char*) tok, len))) { - lex->thd->safe_to_cache_query=0; + lex->safe_to_cache_query=0; lex->yylval->udf=udf; switch (udf->returns) { case STRING_RESULT: -- cgit v1.2.1 From b7bcb96508604ca639103279d0de749bc6f4afa9 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 23 Nov 2002 18:54:15 +0200 Subject: lock option in table list sql/sql_lex.cc: note about methods location --- sql/sql_lex.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'sql/sql_lex.cc') diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 9ed66aede6f..286cec87424 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1282,4 +1282,7 @@ List* st_select_lex::get_ignore_index() return ignore_index_ptr; } -// There are st_select_lex::add_table_to_list in sql_parse.cc +/* + There are st_select_lex::add_table_to_list & + st_select_lex::set_lock_for_tables in sql_parse.cc +*/ -- cgit v1.2.1 From b99dec07b08cc6c54d91b7ee6b0607abc62b9a8c Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 23 Nov 2002 20:40:16 +0200 Subject: after merging fix (update SCRUM?) mysql-test/t/subselect.test: after merging fix sql/sql_lex.cc: after merging fix sql/sql_update.cc: after merging fix sql/sql_yacc.yy: after merging fix --- sql/sql_lex.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sql/sql_lex.cc') diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 5adc1bec539..cf7d866915e 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -149,7 +149,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->select_lex.expr_list.empty(); lex->select_lex.ftfunc_list_alloc.empty(); lex->select_lex.ftfunc_list= &lex->select_lex.ftfunc_list_alloc; - lex->select= &lex->select_lex; + lex->current_select= &lex->select_lex; lex->convert_set= (lex->thd= thd)->variables.convert_set; lex->yacc_yyss=lex->yacc_yyvs=0; lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); -- cgit v1.2.1 From 895e3dbbf831cfc6698f1f1f57586224351458b7 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 25 Nov 2002 12:11:16 +0200 Subject: Faster parsing of identifiers Compatibility syntax: SERIAL, [PRIMARY] KEY and VALUE sql/sql_lex.cc: Faster handling of identifiers sql/sql_lex.h: Faster handling of identifiers sql/sql_yacc.yy: Added SERIAL (alias for bigint auto_increment) Make PRIMARY optional in field specification Make VALUE alias for VALUES --- sql/sql_lex.cc | 54 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 22 deletions(-) (limited to 'sql/sql_lex.cc') diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 9ed66aede6f..e5d8ddf8067 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -76,7 +76,7 @@ inline int lex_casecmp(const char *s, const char *t, uint len) #include "lex_hash.h" -static uchar state_map[256]; +static uchar state_map[256], ident_map[256]; void lex_init(void) @@ -91,7 +91,7 @@ void lex_init(void) VOID(pthread_key_create(&THR_LEX,NULL)); /* Fill state_map with states to get a faster parser */ - for (i=0; i < 256 ; i++) + for (i=0; i < sizeof(state_map) ; i++) { if (my_isalpha(system_charset_info,i)) state_map[i]=(uchar) STATE_IDENT; @@ -126,6 +126,20 @@ void lex_init(void) { state_map[(uchar) '"'] = STATE_USER_VARIABLE_DELIMITER; } + + /* + Create a second map to make it faster to find identifiers + */ + for (i=0; i < sizeof(ident_map) ; i++) + { + ident_map[i]= (uchar) (state_map[i] == STATE_IDENT || + state_map[i] == STATE_NUMBER_IDENT); + } + + /* Special handling of hex and binary strings */ + state_map[(uchar)'x']= state_map[(uchar)'X']= (uchar) STATE_IDENT_OR_HEX; + state_map[(uchar)'b']= state_map[(uchar)'b']= (uchar) STATE_IDENT_OR_BIN; + DBUG_VOID_RETURN; } @@ -459,7 +473,7 @@ int yylex(void *arg) } case STATE_CHAR: // Unknown or single char token case STATE_SKIP: // This should not happen - yylval->lex_str.str=(char*) (lex->ptr=lex->tok_start);// Set to first char + yylval->lex_str.str=(char*) (lex->ptr=lex->tok_start);// Set to first chr yylval->lex_str.length=1; c=yyGet(); if (c != ')') @@ -468,12 +482,15 @@ int yylex(void *arg) lex->tok_start=lex->ptr; // Let tok_start point at next item return((int) c); - case STATE_IDENT: // Incomplete keyword or ident - if ((c == 'x' || c == 'X') && yyPeek() == '\'') + case STATE_IDENT_OR_HEX: + if (yyPeek() == '\'') { // Found x'hex-number' - state=STATE_HEX_NUMBER; + state= STATE_HEX_NUMBER; break; } + /* Fall through */ + case STATE_IDENT_OR_BIN: // TODO: Add binary string handling + case STATE_IDENT: #if defined(USE_MB) && defined(USE_MB_IDENT) if (use_mb(system_charset_info)) { @@ -488,8 +505,7 @@ int yylex(void *arg) } lex->ptr += l - 1; } - while (state_map[c=yyGet()] == STATE_IDENT || - state_map[c] == STATE_NUMBER_IDENT) + while (ident_map[c=yyGet()]) { if (my_ismbhead(system_charset_info, c)) { @@ -504,15 +520,13 @@ int yylex(void *arg) } else #endif - while (state_map[c=yyGet()] == STATE_IDENT || - state_map[c] == STATE_NUMBER_IDENT) ; + while (ident_map[c=yyGet()]) ; length= (uint) (lex->ptr - lex->tok_start)-1; if (lex->ignore_space) { for (; state_map[c] == STATE_SKIP ; c= yyGet()); } - if (c == '.' && (state_map[yyPeek()] == STATE_IDENT || - state_map[yyPeek()] == STATE_NUMBER_IDENT)) + if (c == '.' && ident_map[yyPeek()]) lex->next_state=STATE_IDENT_SEP; else { // '(' must follow directly if function @@ -550,7 +564,7 @@ int yylex(void *arg) case STATE_NUMBER_IDENT: // number or ident which num-start while (my_isdigit(system_charset_info,(c = yyGet()))) ; - if (state_map[c] != STATE_IDENT) + if (!ident_map[c]) { // Can't be identifier state=STATE_INT_OR_REAL; break; @@ -575,7 +589,7 @@ int yylex(void *arg) lex->tok_start[0] == '0' ) { // Varbinary while (my_isxdigit(system_charset_info,(c = yyGet()))) ; - if ((lex->ptr - lex->tok_start) >= 4 && state_map[c] != STATE_IDENT) + if ((lex->ptr - lex->tok_start) >= 4 && !ident_map[c]) { yylval->lex_str=get_token(lex,yyLength()); yylval->lex_str.str+=2; // Skip 0x @@ -602,8 +616,7 @@ int yylex(void *arg) } lex->ptr += l - 1; } - while (state_map[c=yyGet()] == STATE_IDENT || - state_map[c] == STATE_NUMBER_IDENT) + while (ident_map[c=yyGet()]) { if (my_ismbhead(system_charset_info, c)) { @@ -618,11 +631,9 @@ int yylex(void *arg) } else #endif - while (state_map[c = yyGet()] == STATE_IDENT || - state_map[c] == STATE_NUMBER_IDENT) ; + while (ident_map[c = yyGet()]) ; - if (c == '.' && (state_map[yyPeek()] == STATE_IDENT || - state_map[yyPeek()] == STATE_NUMBER_IDENT)) + if (c == '.' && ident_map[yyPeek()]) lex->next_state=STATE_IDENT_SEP;// Next is '.' // fall through @@ -900,8 +911,7 @@ int yylex(void *arg) [(global | local | session) .]variable_name */ - while (state_map[c=yyGet()] == STATE_IDENT || - state_map[c] == STATE_NUMBER_IDENT) ; + while (ident_map[c=yyGet()]) ; if (c == '.') lex->next_state=STATE_IDENT_SEP; length= (uint) (lex->ptr - lex->tok_start)-1; -- cgit v1.2.1