From 394ade63060a4c49e706c9e29c96ac4821d68bb4 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 21 Nov 2003 14:00:40 +0100 Subject: [PATCH 1/4] Made Item_splocal printable. sql/sp_head.cc: Fixed bug that showed up when using running with --debug. --- sql/item.h | 10 ++++++++-- sql/sp_head.cc | 21 ++++++++++++++++++--- sql/sql_class.cc | 2 +- sql/sql_yacc.yy | 9 +++++++-- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/sql/item.h b/sql/item.h index 413fcb1ca26..13b729095d8 100644 --- a/sql/item.h +++ b/sql/item.h @@ -230,11 +230,12 @@ class Item_splocal : public Item private: uint m_offset; + LEX_STRING m_name; public: - Item_splocal(uint offset) - : m_offset(offset) + Item_splocal(LEX_STRING name, uint offset) + : m_offset(offset), m_name(name) { Item::maybe_null= TRUE; } @@ -305,6 +306,11 @@ public: { return this_item()->save_in_field(field, no_conversions); } + + inline void print(String *str) + { + str->append(m_name.str, m_name.length); + } }; diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 41db1f6dd70..70810265926 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -70,22 +70,32 @@ sp_eval_func_item(THD *thd, Item *it, enum enum_field_types type) { longlong i= it->val_int(); - DBUG_PRINT("info", ("INT_RESULT: %d", i)); if (it->null_value) + { + DBUG_PRINT("info", ("INT_RESULT: null")); it= new Item_null(); + } else + { + DBUG_PRINT("info", ("INT_RESULT: %d", i)); it= new Item_int(it->val_int()); + } break; } case REAL_RESULT: { double d= it->val(); - DBUG_PRINT("info", ("REAL_RESULT: %g", d)); if (it->null_value) + { + DBUG_PRINT("info", ("REAL_RESULT: null")); it= new Item_null(); + } else + { + DBUG_PRINT("info", ("REAL_RESULT: %g", d)); it= new Item_real(it->val()); + } break; } default: @@ -94,12 +104,17 @@ sp_eval_func_item(THD *thd, Item *it, enum enum_field_types type) String tmp(buffer, sizeof(buffer), it->collation.collation); String *s= it->val_str(&tmp); - DBUG_PRINT("info",("default result: %*s",s->length(),s->c_ptr_quick())); if (it->null_value) + { + DBUG_PRINT("info", ("default result: null")); it= new Item_null(); + } else + { + DBUG_PRINT("info",("default result: %*s",s->length(),s->c_ptr_quick())); it= new Item_string(thd->strmake(s->c_ptr_quick(), s->length()), s->length(), it->collation.collation); + } break; } } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 919cf8b969b..1c0d3168f53 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1205,7 +1205,7 @@ int select_dumpvar::prepare(List &list, SELECT_LEX_UNIT *u) { my_var *mv= gl++; if (mv->local) - (void)local_vars.push_back(new Item_splocal(mv->offset)); + (void)local_vars.push_back(new Item_splocal(mv->s, mv->offset)); else { Item_func_set_user_var *xx = new Item_func_set_user_var(mv->s, item); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index b2cdeb1221c..8d61b910234 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1775,7 +1775,12 @@ sp_case: i= new sp_instr_jump_if_not(ip, $1); else { /* Simple case: = */ - Item *var= (Item*) new Item_splocal(ctx->current_framesize()-1); + LEX_STRING ivar; + + ivar.str= "_tmp_"; + ivar.length= 5; + Item *var= (Item*) new Item_splocal(ivar, + ctx->current_framesize()-1); Item *expr= new Item_func_eq(var, $1); i= new sp_instr_jump_if_not(ip, expr); @@ -5507,7 +5512,7 @@ simple_ident: YYABORT; } else - $$ = (Item*) new Item_splocal(spv->offset); + $$ = (Item*) new Item_splocal($1, spv->offset); } else { From f7f08b1237a1b86a108636ebbb02f20287b74c14 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 21 Nov 2003 17:22:54 +0300 Subject: [PATCH 2/4] unused variable handler_items removed --- sql/sql_class.cc | 1 - sql/sql_class.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 919cf8b969b..09fa8fff1f5 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -102,7 +102,6 @@ THD::THD():user_time(0), is_fatal_error(0), query_error= tmp_table_used= 0; next_insert_id=last_insert_id=0; open_tables= temporary_tables= handler_tables= derived_tables= 0; - handler_items=0; tmp_table=0; lock=locked_tables=0; used_tables=0; diff --git a/sql/sql_class.h b/sql/sql_class.h index 9a7b45c816b..bc5441dbab5 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -547,7 +547,7 @@ public: free_root(&mem_root,MYF(MY_KEEP_PREALLOC)); } } transaction; - Item *free_list, *handler_items; + Item *free_list; Field *dupp_field; #ifndef __WIN__ sigset_t signals,block_signals; From 1e0907c1c96600f4d7d4e6b41c782f14dbf596c3 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 21 Nov 2003 18:23:05 +0100 Subject: [PATCH 3/4] Translated 5.0 error codes into sql states. include/mysqld_error.h: Marked where 5.0 error codes begin. sql/sql_yacc.yy: Referring to an unitialized variable is a warning, not an error. --- include/mysqld_error.h | 1 + include/sql_state.h | 33 +++++++++++++++ mysql-test/r/sp-error.result | 80 ++++++++++++++++++------------------ mysql-test/t/sp-error.test | 2 +- sql/sql_yacc.yy | 8 ++-- 5 files changed, 80 insertions(+), 44 deletions(-) diff --git a/include/mysqld_error.h b/include/mysqld_error.h index 372ddc0787b..baf35687bb6 100644 --- a/include/mysqld_error.h +++ b/include/mysqld_error.h @@ -300,6 +300,7 @@ #define ER_WARN_QC_RESIZE 1281 #define ER_BAD_FT_COLUMN 1282 #define ER_UNKNOWN_KEY_CACHE 1283 +/* 5.0 */ #define ER_SP_NO_RECURSIVE_CREATE 1284 #define ER_SP_ALREADY_EXISTS 1285 #define ER_SP_DOES_NOT_EXIST 1286 diff --git a/include/sql_state.h b/include/sql_state.h index a514b1e59fc..2bca08f33fd 100644 --- a/include/sql_state.h +++ b/include/sql_state.h @@ -161,3 +161,36 @@ ER_WARN_DATA_OUT_OF_RANGE, "01000", "", ER_WARN_DATA_TRUNCATED, "01000", "", ER_WRONG_NAME_FOR_INDEX, "42000", "", ER_WRONG_NAME_FOR_CATALOG, "42000", "", +/* 5.0 */ +ER_SP_NO_RECURSIVE_CREATE, "2F003", "", +ER_SP_ALREADY_EXISTS, "42000", "", +ER_SP_DOES_NOT_EXIST, "42000", "", +/*ER_SP_DROP_FAILED*/ +/*ER_SP_STORE_FAILED*/ +ER_SP_LILABEL_MISMATCH, "42000", "", +ER_SP_LABEL_REDEFINE, "42000", "", +ER_SP_LABEL_MISMATCH, "42000", "", +ER_SP_UNINIT_VAR, "01000", "", +ER_SP_BADSELECT, "04000", "", +ER_SP_BADRETURN, "42000", "", +ER_SP_BADQUERY, "04000", "", +ER_UPDATE_LOG_DEPRECATED_IGNORED, "42000", "", +ER_UPDATE_LOG_DEPRECATED_TRANSLATED, "42000", "", +ER_QUERY_INTERRUPTED, "70100", "", +ER_SP_WRONG_NO_OF_ARGS, "42000", "", +ER_SP_COND_MISMATCH, "42000", "", +ER_SP_NORETURN, "42000", "", +ER_SP_NORETURNEND, "2F005", "", +ER_SP_BAD_CURSOR_QUERY, "42000", "", +ER_SP_BAD_CURSOR_SELECT, "42000", "", +ER_SP_CURSOR_MISMATCH, "42000", "", +ER_SP_CURSOR_ALREADY_OPEN, "24000", "", +ER_SP_CURSOR_NOT_OPEN, "24000", "", +ER_SP_UNDECLARED_VAR, "42000", "", +/*ER_SP_WRONG_NO_OF_FETCH_ARGS*/ +ER_SP_FETCH_NO_DATA, "02000", "", +ER_SP_DUP_PARAM, "42000", "", +ER_SP_DUP_VAR, "42000", "", +ER_SP_DUP_COND, "42000", "", +ER_SP_DUP_CURS, "42000", "", +/*ER_SP_CANT_ALTER*/ diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index af6a770ba81..738067898c9 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -11,96 +11,98 @@ create function func1() returns int return 42; create procedure foo() create procedure bar() set @x=3; -ERROR HY000: Can't create a PROCEDURE from within another stored routine +ERROR 2F003: Can't create a PROCEDURE from within another stored routine create procedure foo() create function bar() returns double return 2.3; -ERROR HY000: Can't create a FUNCTION from within another stored routine +ERROR 2F003: Can't create a FUNCTION from within another stored routine create procedure proc1() set @x = 42; -ERROR HY000: PROCEDURE proc1 already exists +ERROR 42000: PROCEDURE proc1 already exists create function func1() returns int return 42; -ERROR HY000: FUNCTION func1 already exists +ERROR 42000: FUNCTION func1 already exists drop procedure proc1; drop function func1; alter procedure foo; -ERROR HY000: PROCEDURE foo does not exist +ERROR 42000: PROCEDURE foo does not exist alter function foo; -ERROR HY000: FUNCTION foo does not exist +ERROR 42000: FUNCTION foo does not exist drop procedure foo; -ERROR HY000: PROCEDURE foo does not exist +ERROR 42000: PROCEDURE foo does not exist drop function foo; -ERROR HY000: FUNCTION foo does not exist +ERROR 42000: FUNCTION foo does not exist call foo(); -ERROR HY000: PROCEDURE foo does not exist +ERROR 42000: PROCEDURE foo does not exist drop procedure if exists foo; Warnings: Warning 1286 PROCEDURE foo does not exist show create procedure foo; -ERROR HY000: PROCEDURE foo does not exist +ERROR 42000: PROCEDURE foo does not exist create procedure foo() foo: loop leave bar; end loop; -ERROR HY000: LEAVE with no matching label: bar +ERROR 42000: LEAVE with no matching label: bar create procedure foo() foo: loop iterate bar; end loop; -ERROR HY000: ITERATE with no matching label: bar +ERROR 42000: ITERATE with no matching label: bar create procedure foo() foo: begin iterate foo; end; -ERROR HY000: ITERATE with no matching label: foo +ERROR 42000: ITERATE with no matching label: foo create procedure foo() foo: loop foo: loop set @x=2; end loop foo; end loop foo; -ERROR HY000: Redefining label foo +ERROR 42000: Redefining label foo create procedure foo() foo: loop set @x=2; end loop bar; -ERROR HY000: End-label bar without match +ERROR 42000: End-label bar without match create procedure foo(out x int) begin declare y int; set x = y; end; -ERROR HY000: Referring to uninitialized variable y +Warnings: +Warning 1292 Referring to uninitialized variable y +drop procedure foo; create procedure foo() begin select name from mysql.proc; select type from mysql.proc; end; call foo(); -ERROR HY000: SELECT in a stored procedure must have INTO +ERROR 04000: SELECT in a stored procedure must have INTO drop procedure foo; create procedure foo() return 42; -ERROR HY000: RETURN is only allowed in a FUNCTION +ERROR 42000: RETURN is only allowed in a FUNCTION create function foo() returns int begin declare x int; select max(c) into x from test.t; return x; end; -ERROR HY000: Queries, like SELECT, INSERT, UPDATE (and others), are not allowed in a FUNCTION +ERROR 04000: Queries, like SELECT, INSERT, UPDATE (and others), are not allowed in a FUNCTION create procedure p(x int) insert into test.t1 values (x); create function f(x int) returns int return x+42; call p(); -ERROR HY000: Wrong number of arguments for PROCEDURE p, expected 1, got 0 +ERROR 42000: Wrong number of arguments for PROCEDURE p, expected 1, got 0 call p(1, 2); -ERROR HY000: Wrong number of arguments for PROCEDURE p, expected 1, got 2 +ERROR 42000: Wrong number of arguments for PROCEDURE p, expected 1, got 2 select f(); -ERROR HY000: Wrong number of arguments for FUNCTION f, expected 1, got 0 +ERROR 42000: Wrong number of arguments for FUNCTION f, expected 1, got 0 select f(1, 2); -ERROR HY000: Wrong number of arguments for FUNCTION f, expected 1, got 2 +ERROR 42000: Wrong number of arguments for FUNCTION f, expected 1, got 2 drop procedure p; drop function f; create procedure p(val int, out res int) @@ -114,7 +116,7 @@ else set res = 1; end if; end; -ERROR HY000: Undefined CONDITION: foo +ERROR 42000: Undefined CONDITION: foo create procedure p(val int, out res int) begin declare x int default 0; @@ -127,13 +129,13 @@ else set res = 1; end if; end; -ERROR HY000: Undefined CONDITION: bar +ERROR 42000: Undefined CONDITION: bar create function f(val int) returns int begin declare x int; set x = val+3; end; -ERROR HY000: No RETURN found in FUNCTION f +ERROR 42000: No RETURN found in FUNCTION f create function f(val int) returns int begin declare x int; @@ -143,7 +145,7 @@ return x; end if; end; select f(10); -ERROR HY000: FUNCTION f ended without RETURN +ERROR 2F005: FUNCTION f ended without RETURN drop function f; create procedure p() begin @@ -151,7 +153,7 @@ declare c cursor for insert into test.t1 values ("foo", 42); open c; close c; end; -ERROR HY000: Cursor statement must be a SELECT +ERROR 42000: Cursor statement must be a SELECT create procedure p() begin declare x int; @@ -159,14 +161,14 @@ declare c cursor for select * into x from test.t limit 1; open c; close c; end; -ERROR HY000: Cursor SELECT must not have INTO +ERROR 42000: Cursor SELECT must not have INTO create procedure p() begin declare c cursor for select * from test.t; open cc; close c; end; -ERROR HY000: Undefined CURSOR: cc +ERROR 42000: Undefined CURSOR: cc drop table if exists t1; create table t1 (val int); create procedure p() @@ -177,7 +179,7 @@ open c; close c; end; call p(); -ERROR HY000: Cursor is already open +ERROR 24000: Cursor is already open drop procedure p; create procedure p() begin @@ -187,10 +189,10 @@ close c; close c; end; call p(); -ERROR HY000: Cursor is not open +ERROR 24000: Cursor is not open drop procedure p; alter procedure bar3 sql security invoker; -ERROR HY000: PROCEDURE bar3 does not exist +ERROR 42000: PROCEDURE bar3 does not exist alter procedure bar3 name AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; ERROR 42000: Identifier name 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' is too long @@ -206,7 +208,7 @@ open c; fetch c into x, y; close c; end; -ERROR HY000: Undeclared variable: y +ERROR 42000: Undeclared variable: y create procedure p() begin declare c cursor for select * from t1; @@ -234,27 +236,27 @@ drop procedure p; create procedure p(in x int, x char(10)) begin end; -ERROR HY000: Duplicate parameter: x +ERROR 42000: Duplicate parameter: x create function p(x int, x char(10)) begin end; -ERROR HY000: Duplicate parameter: x +ERROR 42000: Duplicate parameter: x create procedure p() begin declare x float; declare x int; end; -ERROR HY000: Duplicate variable: x +ERROR 42000: Duplicate variable: x create procedure p() begin declare c condition for 1064; declare c condition for 1065; end; -ERROR HY000: Duplicate condition: c +ERROR 42000: Duplicate condition: c create procedure p() begin declare c cursor for select * from t1; declare c cursor for select field from t1; end; -ERROR HY000: Duplicate cursor: c +ERROR 42000: Duplicate cursor: c drop table t1; diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index 3973e343812..211c4a63b8f 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -99,12 +99,12 @@ foo: loop end loop bar| # Referring to undef variable ---error 1292 create procedure foo(out x int) begin declare y int; set x = y; end| +drop procedure foo| # We require INTO in SELECTs for some older clients (as mysql and mysqltest, # for now). diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 8d61b910234..b83f1488fb1 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -5508,11 +5508,11 @@ simple_ident: { /* We're compiling a stored procedure and found a variable */ if (lex->sql_command != SQLCOM_CALL && ! spv->isset) { - net_printf(YYTHD, ER_SP_UNINIT_VAR, $1.str); - YYABORT; + push_warning_printf(YYTHD, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_SP_UNINIT_VAR, ER(ER_SP_UNINIT_VAR), + $1.str); } - else - $$ = (Item*) new Item_splocal($1, spv->offset); + $$ = (Item*) new Item_splocal($1, spv->offset); } else { From a6abfc4ebba6c665342095a4968534a884e91ccd Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 21 Nov 2003 20:52:18 +0200 Subject: [PATCH 4/4] warning number changed --- mysql-test/r/variables.result | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index 82701dc338c..88f796f8c4e 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -360,7 +360,7 @@ set sql_log_bin=1; set sql_log_off=1; set sql_log_update=1; Warnings: -Note 1292 The update log is deprecated and replaced by the binary log. SET SQL_LOG_UPDATE has been ignored. +Note 1296 The update log is deprecated and replaced by the binary log. SET SQL_LOG_UPDATE has been ignored. set sql_low_priority_updates=1; set sql_max_join_size=200; select @@sql_max_join_size,@@max_join_size;