From cc0f1f15cddb29386ff691adc1712369ee8cee0c Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 30 Mar 2003 13:25:43 +0200 Subject: [PATCH] Implemented DEFAULT for DECLARE variables. BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + mysql-test/r/sp.result | 15 +++++---------- mysql-test/t/sp.test | 16 ++++++---------- sql/sql_yacc.yy | 24 ++++++++++++++++++++---- 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index d4328f49e42..3fafa15cece 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -72,6 +72,7 @@ papa@gbichot.local paul@central.snake.net paul@teton.kitebird.com pem@mysql.com +pem@per-erik-martins-dator.local peter@linux.local peter@mysql.com pgulutzan@linux.local diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 3fe175b10c3..4833b152f07 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -117,8 +117,7 @@ drop procedure inc2; drop procedure inc; create procedure cbv1() begin -declare y int; -set y = 3; +declare y int default 3; call cbv2(y+1, y); insert into test.t1 values ("cbv1", y); end; @@ -354,8 +353,7 @@ append("foo", "bar") foobar create function fac(n int unsigned) returns bigint unsigned begin -declare f bigint unsigned; -set f = 1; +declare f bigint unsigned default 1; while n > 1 do set f = f * n; set n = n - 1; @@ -396,8 +394,7 @@ drop table if exists fac; create table fac (n int unsigned not null primary key, f bigint unsigned); create procedure ifac(n int unsigned) begin -declare i int unsigned; -set i = 1; +declare i int unsigned default 1; if n > 20 then set n = 20; # bigint overflow otherwise end if; @@ -452,8 +449,7 @@ insert into primes values create procedure opp(n bigint unsigned, out pp bool) begin declare r double; -declare b, s bigint unsigned; -set b = 0, s = 0; +declare b, s bigint unsigned default 0; set r = sqrt(n); again: loop @@ -483,8 +479,7 @@ declare i int unsigned; set i=45, p=201; while i < m do begin -declare pp bool; -set pp = 0; +declare pp bool default 0; call opp(p, pp); if pp then insert into test.primes values (i, p); diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 3908561b6b0..95b3e4732a9 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -153,9 +153,8 @@ drop procedure inc| # ("cbv1", 4711) create procedure cbv1() begin - declare y int; + declare y int default 3; - set y = 3; call cbv2(y+1, y); insert into test.t1 values ("cbv1", y); end| @@ -428,9 +427,8 @@ select append("foo", "bar")| # A function with flow control create function fac(n int unsigned) returns bigint unsigned begin - declare f bigint unsigned; + declare f bigint unsigned default 1; - set f = 1; while n > 1 do set f = f * n; set n = n - 1; @@ -479,8 +477,8 @@ create table fac (n int unsigned not null primary key, f bigint unsigned)| create procedure ifac(n int unsigned) begin - declare i int unsigned; - set i = 1; + declare i int unsigned default 1; + if n > 20 then set n = 20; # bigint overflow otherwise end if; @@ -524,9 +522,8 @@ insert into primes values create procedure opp(n bigint unsigned, out pp bool) begin declare r double; - declare b, s bigint unsigned; + declare b, s bigint unsigned default 0; - set b = 0, s = 0; set r = sqrt(n); again: @@ -561,9 +558,8 @@ begin while i < m do begin - declare pp bool; + declare pp bool default 0; - set pp = 0; call opp(p, pp); if pp then insert into test.primes values (i, p); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 8aecb62f51c..3ff214272a1 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -622,7 +622,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); table_wild opt_pad no_in_expr expr_expr simple_expr no_and_expr using_list expr_or_default set_expr_or_default interval_expr param_marker singlerow_subselect singlerow_subselect_init - exists_subselect exists_subselect_init + exists_subselect exists_subselect_init sp_opt_default %type expr_list udf_expr_list when_list ident_list ident_list_arg @@ -1082,15 +1082,26 @@ sp_decls: ; sp_decl: - DECLARE_SYM sp_decl_idents type + DECLARE_SYM sp_decl_idents type sp_opt_default { LEX *lex= Lex; uint max= lex->spcont->current_framesize(); + enum enum_field_types type= (enum enum_field_types)$3; + Item *it= $4; for (uint i = max-$2 ; i < max ; i++) { - lex->spcont->set_type(i, (enum enum_field_types)$3); - lex->spcont->set_isset(i, FALSE); + lex->spcont->set_type(i, type); + if (! it) + lex->spcont->set_isset(i, FALSE); + else + { + sp_instr_set *in= new sp_instr_set(lex->sphead->instructions(), + i, it, type); + + lex->sphead->add_instr(in); + lex->spcont->set_isset(i, TRUE); + } } $$= $2; } @@ -1109,6 +1120,11 @@ sp_decl_idents: } ; +sp_opt_default: + /* Empty */ { $$ = NULL; } + | DEFAULT expr { $$ = $2; } + ; + sp_proc_stmt: { Lex->sphead->reset_lex(YYTHD);