From c3a93df89666a8bd3f48035b4bce0eedf765e185 Mon Sep 17 00:00:00 2001 From: chenbd Date: Fri, 17 Mar 2023 11:53:26 -0400 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84@=E5=8F=98=E9=87=8F=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=B5=8B=E5=80=BC=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=88=97=E6=95=B0=E6=8D=AE=E8=BE=93=E5=85=A5=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/nodes/nodeFuncs.cpp | 5 +- src/gausskernel/runtime/executor/execQual.cpp | 172 +++++- src/include/nodes/execnodes.h | 1 + src/include/rewrite/rewriteHandler.h | 1 + .../regress/expected/mysql_compatibility.out | 510 +++++++++++++++++- src/test/regress/sql/mysql_compatibility.sql | 145 +++++ 6 files changed, 824 insertions(+), 10 deletions(-) diff --git a/src/common/backend/nodes/nodeFuncs.cpp b/src/common/backend/nodes/nodeFuncs.cpp index 481b6267a..e50e5aeaf 100644 --- a/src/common/backend/nodes/nodeFuncs.cpp +++ b/src/common/backend/nodes/nodeFuncs.cpp @@ -2023,8 +2023,10 @@ bool expression_tree_walker(Node* node, bool (*walker)(), void* context) return p2walker(((AutoIncrement*)node)->expr, context); case T_PrefixKey: return p2walker(((PrefixKey*)node)->arg, context); - case T_UserSetElem: + case T_UserSetElem: { + p2walker(((UserSetElem*)node)->val, context); return true; + } default: ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("expression_tree_walker:unrecognized node type: %d", (int)nodeTag(node)))); @@ -2787,6 +2789,7 @@ Node* expression_tree_mutator(Node* node, Node* (*mutator)(Node*, void*), void* UserSetElem* use = (UserSetElem*)node; UserSetElem* newnode = NULL; FLATCOPY(newnode, use, UserSetElem, isCopy); + MUTATE(newnode->val, use->val, Expr*); return (Node*)newnode; } break; default: diff --git a/src/gausskernel/runtime/executor/execQual.cpp b/src/gausskernel/runtime/executor/execQual.cpp index 7b3ecb409..b7b86d649 100644 --- a/src/gausskernel/runtime/executor/execQual.cpp +++ b/src/gausskernel/runtime/executor/execQual.cpp @@ -1142,6 +1142,126 @@ static Datum ExecEvalRownum(RownumState* exprstate, ExprContext* econtext, bool* } } +/*---------------------------------------------------------------- +* find_uservar_in_expr: A recursive function +* For UserSetElemnt like @var := sin(@var), already remember root +* as Sin's exprState, and this function is used to find wheter @var +* is used in here. +* if_use : true means this @var is used inside a correct expression +*/ +static void find_uservar_in_expr(ExprState *root, char *return_name, bool *if_use) +{ + if(root == NULL) { + return; + } + switch(root->type) { + case T_FuncExprState: { + FuncExprState* parent = (FuncExprState*)root; + ListCell* arg = NULL; + foreach(arg,parent->args) { + ExprState* child = (ExprState*)lfirst(arg); + find_uservar_in_expr(child, return_name, if_use); + } + } break; + case T_ExprState: { + if (root->expr != NULL && root->expr->type == T_UserVar) { + UserVar* temp = (UserVar*)root->expr; + char* usename = temp->name; + if(strcmp(return_name, usename) == 0) { + *if_use = true; + } + } + } break; + case T_AggrefExprState: { + AggrefExprState* parent = (AggrefExprState*)root; + ListCell* arg = NULL; + foreach(arg, parent->args) { + ExprState* child = (ExprState*)lfirst(arg); + find_uservar_in_expr(child, return_name, if_use); + } + } break; + case T_MinMaxExprState: { + MinMaxExprState* parent = (MinMaxExprState*)root; + ListCell* arg = NULL; + foreach(arg, parent->args) { + ExprState* child = (ExprState*)lfirst(arg); + find_uservar_in_expr(child, return_name, if_use); + } + } break; + case T_GenericExprState: { + GenericExprState* parent = (GenericExprState*)root; + find_uservar_in_expr(parent->arg, return_name, if_use); + } break; + case T_CaseExprState: { + CaseExprState* parent = (CaseExprState*)root; + ListCell* arg = NULL; + foreach(arg, parent->args) { + ExprState* child = (ExprState*)lfirst(arg); + find_uservar_in_expr(child, return_name, if_use); + } + } break; + case T_CaseWhenState: { + CaseWhenState* parent = (CaseWhenState*)root; + find_uservar_in_expr(parent->expr, return_name, if_use); + find_uservar_in_expr(parent->result, return_name, if_use); + } break; + case T_WindowFuncExprState: { + WindowFuncExprState* parent = (WindowFuncExprState*)root; + ListCell* arg = NULL; + foreach(arg, parent->args) { + ExprState* child =(ExprState*)lfirst(arg); + find_uservar_in_expr(child, return_name, if_use); + } + } break; + case T_BoolExprState: { + BoolExprState* parent = (BoolExprState*)root; + ListCell* arg = NULL; + foreach(arg, parent->args) { + ExprState* child = (ExprState*)lfirst(arg); + find_uservar_in_expr(child, return_name, if_use); + } + } break; + case T_CoalesceExprState: { + CoalesceExprState* parent = (CoalesceExprState*)root; + ListCell* arg = NULL; + foreach(arg, parent->args) { + ExprState* child = (ExprState*)lfirst(arg); + find_uservar_in_expr(child, return_name, if_use); + } + } break; + case T_List: { + List* parent = (List*)root; + ListCell* arg = NULL; + foreach(arg, parent) { + ExprState* child = (ExprState*)lfirst(arg); + find_uservar_in_expr(child, return_name, if_use); + } + } break; + case T_NullTestState: { + NullTestState* parent = (NullTestState*)root; + find_uservar_in_expr(parent->arg,return_name, if_use); + } break; + case T_SubPlanState: + break; + default: { + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmodule(MOD_DFS), + errmsg("Unsupported expr type for select @i:= expr."))); + } + } +} + + +static char* CStringFromDatum(Oid typeoid, Datum d) +{ + bool isVarlena; + Oid outOid = InvalidOid; + getTypeOutputInfo(typeoid, &outOid, &isVarlena); + char* outStr = OidOutputFunctionCall(outOid, d); + if (outStr == NULL) + return ""; + return outStr; +} + /* ---------------------------------------------------------------- * ExecEvalUserSetElm: set and Returns the user_define variable value * ---------------------------------------------------------------- @@ -1160,16 +1280,57 @@ static Datum ExecEvalUserSetElm(ExprState* exprstate, ExprContext* econtext, boo Assert(isNull); *isNull = false; - node = eval_const_expression_value(NULL, (Node*)elem->val, NULL); - if (nodeTag(node) == T_Const) { - elemcopy.val = (Expr*)const_expression_to_const(node); + bool is_in_table = false; + if (econtext->ecxt_innertuple != NULL || econtext->ecxt_outertuple != NULL || + econtext->ecxt_scantuple != NULL) { + is_in_table = true; + } + + Const* con = NULL; + Node* res = NULL; + char* value = NULL; + + Datum result = ExecEvalExpr(usestate->instate, econtext, isNull, isDone); + + if (*isNull) { + con = makeConst(UNKNOWNOID, -1, InvalidOid, -2, result, true, false); + res = (Node*)con; + elemcopy.val = (Expr*)const_expression_to_const(res); } else { - elemcopy.val = (Expr*)const_expression_to_const(QueryRewriteNonConstant(node)); + bool found = false; + GucUserParamsEntry *entry = NULL; + if (u_sess->utils_cxt.set_user_params_htab != NULL) { + UserVar *uservar = (UserVar*)linitial(elem->name); + entry = (GucUserParamsEntry*)hash_search(u_sess->utils_cxt.set_user_params_htab, + uservar->name, HASH_FIND, &found); + if (found) { + Const* expr = entry->value; + bool if_use = false; + if (expr->consttype != (usestate->xprstate).resultType && is_in_table) { + find_uservar_in_expr(usestate->instate, uservar->name, &if_use); + if (if_use) { + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("Can not change type of user defined variable when use relations."))); + } + } + } + } + + Oid atttypid = exprType((Node*)elem->val); + + value = CStringFromDatum(atttypid, result); + con = processResToConst(value, atttypid); + if (atttypid == BOOLOID) + res = (Node*)con; + else + res = type_transfer((Node *)con, atttypid, true); + elemcopy.val = (Expr*)const_expression_to_const(res); } check_set_user_message(&elemcopy); - return ((Const*)elemcopy.val)->constvalue; + return result; } /* ---------------------------------------------------------------- * ExecEvalParamExec @@ -6203,6 +6364,7 @@ ExprState* ExecInitExprByRecursion(Expr* node, PlanState* parent) usestate->use = useexpr; state = (ExprState*)usestate; state->evalfunc = (ExprStateEvalFunc)ExecEvalUserSetElm; + usestate->instate = ExecInitExpr((Expr *)useexpr->val, parent); } break; default: ereport(ERROR, diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 6b1107fc3..fc6d418ce 100755 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -2707,6 +2707,7 @@ typedef struct RownumState { typedef struct UserSetElemState { ExprState xprstate; UserSetElem* use; + ExprState* instate; } UserSetElemState; /* ---------------- * GroupingFuncExprState node diff --git a/src/include/rewrite/rewriteHandler.h b/src/include/rewrite/rewriteHandler.h index 4c5558781..b21f3db15 100644 --- a/src/include/rewrite/rewriteHandler.h +++ b/src/include/rewrite/rewriteHandler.h @@ -36,5 +36,6 @@ extern List* QueryRewriteRefresh(Query *parsetree); extern List* QueryRewritePrepareStmt(Query *parsetree); extern Node* QueryRewriteNonConstant(Node *node); extern List* QueryRewriteSelectIntoVarList(Node *node, int res_len); +extern Const* processResToConst(char* value, Oid atttypid); #endif /* REWRITEHANDLER_H */ diff --git a/src/test/regress/expected/mysql_compatibility.out b/src/test/regress/expected/mysql_compatibility.out index f9be614d1..0652ba0ef 100644 --- a/src/test/regress/expected/mysql_compatibility.out +++ b/src/test/regress/expected/mysql_compatibility.out @@ -865,11 +865,21 @@ WHERE rowno = 2; --test in error SELECT salary, (@rowno := salary) AS rowno FROM employee ; -ERROR: bogus varno: 1 -CONTEXT: referenced column: rowno + salary | rowno +--------+------- + 100 | 100 + 200 | 200 + 300 | 300 +(3 rows) + SELECT salary, (@rowno := salary + 1) AS rowno FROM employee ; -ERROR: bogus varno: 1 -CONTEXT: referenced column: rowno + salary | rowno +--------+------- + 100 | 101 + 200 | 201 + 300 | 301 +(3 rows) + --test in order by set @rowno = 0; SELECT salary, (@rowno := @rowno + 1) AS rowno FROM employee order by @rowno; @@ -1140,6 +1150,498 @@ select * from test_trigger_des_tbl; 100 | | (1 row) +--@var retest +--select +select @a1:=cast(1 as int2); + ?column? +---------- + 1 +(1 row) + +select @a2:=cast(2 as int4); + ?column? +---------- + 2 +(1 row) + +select @a3:=cast(3 as int8); + ?column? +---------- + 3 +(1 row) + +select @a4:=cast(4 as number); + ?column? +---------- + 4 +(1 row) + +select @a5:=cast(5.5 as numeric); + ?column? +---------- + 5.5 +(1 row) + +select @a6:=cast(6.76 as number(5)); + ?column? +---------- + 7 +(1 row) + +select @a7:=cast(0.54 as number(3,3)); + ?column? +---------- + .540 +(1 row) + +select @a8:=cast(8.0 as number(4,1)); + ?column? +---------- + 8.0 +(1 row) + +select @a9:=cast(9.66 as float4); + ?column? +---------- + 9.66 +(1 row) + +select @a10:=cast(10.33 as float8); + ?column? +---------- + 10.33 +(1 row) + +select @a11:=cast(11.2 as real); + ?column? +---------- + 11.2 +(1 row) + +select @a1,@a2,@a3,@a4,@a5,@a6,@a7,@a8,@a9,@a10,@a11; + @a1 | @a2 | @a3 | @a4 | @a5 | @a6 | @a7 | @a8 | @a9 | @a10 | @a11 +-----+-----+-----+-----+-----+-----+-----+-----+------+-------+------ + 1 | 2 | 3 | 4 | 5.5 | 7 | .54 | 8 | 9.66 | 10.33 | 11.2 +(1 row) + +--select +select @a1:=cast(1 as char); + ?column? +---------- + 1 +(1 row) + +select @a2:=cast(2 as varchar); + ?column? +---------- + 2 +(1 row) + +select @a3:=cast(3 as clob); + ?column? +---------- + 3 +(1 row) + +select @a4:=cast(4 as text); + ?column? +---------- + 4 +(1 row) + +select @a5:=cast(5.5 as name); + ?column? +---------- + 5.5 +(1 row) + +select @a6:=cast(6.76 as nchar); + ?column? +---------- + 6 +(1 row) + +select @a7:=cast(7.54 as char(4)); + ?column? +---------- + 7.54 +(1 row) + +select @a8:=cast(8.0 as nchar(4)); + ?column? +---------- + 8.0 +(1 row) + +select @a9:=cast(9.66 as varchar(4)); + ?column? +---------- + 9.66 +(1 row) + +select @a10:=cast(10.33 as varchar2(4)); + ?column? +---------- + 10.3 +(1 row) + +select @a11:=cast(11.2 as nvarchar2(4)); + ?column? +---------- + 11.2 +(1 row) + +select @a1,@a2,@a3,@a4,@a5,@a6,@a7,@a8,@a9,@a10,@a11; + @a1 | @a2 | @a3 | @a4 | @a5 | @a6 | @a7 | @a8 | @a9 | @a10 | @a11 +-----+-----+-----+-----+-----+-----+------+------+------+------+------ + 1 | 2 | 3 | 4 | 5.5 | 6 | 7.54 | 8.0 | 9.66 | 10.3 | 11.2 +(1 row) + +--select +select @a1:=cast('2012-12-12' as date); + ?column? +------------ + 12-12-2012 +(1 row) + +select @a2:=cast('10:25:32' as time); + ?column? +---------- + 10:25:32 +(1 row) + +select @a3:=cast('2023-01-22' as timestamp); + ?column? +-------------------------- + Sun Jan 22 00:00:00 2023 +(1 row) + +select @a4:=cast('2003-04-12 04:05:06' as smalldatetime); + ?column? +-------------------------- + Sat Apr 12 04:05:00 2003 +(1 row) + +select @a5:=cast(INTERVAL '3' year as interval year); + ?column? +----------- + @ 3 years +(1 row) + +select @a6:=cast(INTERVAL '3' DAY as interval day to second); + ?column? +---------- + @ 3 days +(1 row) + +select @a7:=cast('90' as reltime); + ?column? +---------- + @ 3 mons +(1 row) + +select @a1,@a2,@a3,@a4,@a5,@a6,@a7; + @a1 | @a2 | @a3 | @a4 | @a5 | @a6 | @a7 +------------+----------+--------------------------+--------------------------+-----------+----------+---------- + 12-12-2012 | 10:25:32 | Sun Jan 22 00:00:00 2023 | Sat Apr 12 04:05:00 2003 | @ 3 years | @ 3 days | @ 3 mons +(1 row) + +--select +select @a1:='[1,2,3]'; + ?column? +---------- + [1,2,3] +(1 row) + +select @a2:='[1,[2,4,6],3]'; + ?column? +--------------- + [1,[2,4,6],3] +(1 row) + +select @a3:='[1,{"aa":"ss","bb":4},3]'; + ?column? +-------------------------- + [1,{"aa":"ss","bb":4},3] +(1 row) + +select @a4:='{"aa":"ss","bb":4}'; + ?column? +-------------------- + {"aa":"ss","bb":4} +(1 row) + +select @a5:='{"aa":"ss","bb":4,"cc":{"dd":9}}'; + ?column? +---------------------------------- + {"aa":"ss","bb":4,"cc":{"dd":9}} +(1 row) + +select @a6:='{"aa":[2,3,4],"bb":4}'; + ?column? +----------------------- + {"aa":[2,3,4],"bb":4} +(1 row) + +select @a1,@a2,@a3,@a4,@a5,@a6; + @a1 | @a2 | @a3 | @a4 | @a5 | @a6 +---------+---------------+--------------------------+--------------------+----------------------------------+----------------------- + [1,2,3] | [1,[2,4,6],3] | [1,{"aa":"ss","bb":4},3] | {"aa":"ss","bb":4} | {"aa":"ss","bb":4,"cc":{"dd":9}} | {"aa":[2,3,4],"bb":4} +(1 row) + +--外表 +create table tt_1130949(a1 text PRIMARY KEY); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tt_1130949_pkey" for table "tt_1130949" +insert into tt_1130949 values('d'),('r'),('i'),('j'); +--建表 +create table tab_1130949(a1 int not null,a2 char(8) unique,a3 text primary key,a4 date default '2023-02-03',a5 varchar(16) check(a5 is not null),a6 text REFERENCES tt_1130949(a1)); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tab_1130949_pkey" for table "tab_1130949" +NOTICE: CREATE TABLE / UNIQUE will create implicit index "tab_1130949_a2_key" for table "tab_1130949" +--index +create index on tab_1130949(a1); +create index on tab_1130949 using btree(a2); +create index on tab_1130949 using gin(to_tsvector('ngram', a4)); +--insert +insert into tab_1130949 values(1,'a','b','2012-12-14','c','d'); +insert into tab_1130949 values(2,'q','w','2013-12-14','e','r'); +insert into tab_1130949 values(3,'t','y','2014-12-14','u','i'); +insert into tab_1130949 values(4,'f','g','2015-12-14','h','j'); +--select 变量 +select @b1:=a1 from tab_1130949; + ?column? +---------- + 1 + 2 + 3 + 4 +(4 rows) + +select @b2:=a2 from tab_1130949; + ?column? +---------- + a + q + t + f +(4 rows) + +select @b3:=a3 from tab_1130949; + ?column? +---------- + b + w + y + g +(4 rows) + +select @b4:=a4 from tab_1130949; + ?column? +------------ + 12-14-2012 + 12-14-2013 + 12-14-2014 + 12-14-2015 +(4 rows) + +select @b5:=a5 from tab_1130949; + ?column? +---------- + c + e + u + h +(4 rows) + +select @b6:=a6 from tab_1130949; + ?column? +---------- + d + r + i + j +(4 rows) + +select @b1,@b2,@b3,@b4,@b5,@b6; + @b1 | @b2 | @b3 | @b4 | @b5 | @b6 +-----+----------+-----+------------+-----+----- + 4 | f | g | 12-14-2015 | h | j +(1 row) + +drop table if exists tt_1130949 cascade; +NOTICE: drop cascades to constraint tab_1130949_a6_fkey on table tab_1130949 +drop table if exists tab_1130956 cascade; +NOTICE: table "tab_1130956" does not exist, skipping +--建表 +create table tab_1130965(a1 int,a2 int); +--插入数据 +insert into tab_1130965 values(1,1),(2,3),(3,2),(4,1); +--select +--表字段与常量 +select (@bq1:=case when tab_1130965.a1<3 then tab_1130965.a1 +3 else tab_1130965.a1 end) from tab_1130965; + ?column? +---------- + 4 + 5 + 3 + 4 +(4 rows) + +--表字段与表字段 +select (@bq2:=case when tab_1130965.a1 @asd2 then @asd2 else @asd1 end); + ?column? +---------- + 3 +(1 row) + +--变量与常量 +set @asd2:=2; +select (@bq5:=case when @asd1>3 then @asd2 else @asd1 end); + ?column? +---------- + 2 +(1 row) + +select @bq1,@bq2,@bq3,@bq4,@bq5; + @bq1 | @bq2 | @bq3 | @bq4 | @bq5 +------+------+------+------+------ + 4 | 1 | 4 | 3 | 2 +(1 row) + +--创建函数 +create or replace function fun_1131007(b1 in int,b2 in int,b3 out int)return int +as +begin +select @bb:=b1>b2 into b3; +raise notice '%',b3; +return @bb; +end; +/ +select fun_1131007(1,2); +NOTICE: 0 +CONTEXT: referenced column: fun_1131007 + fun_1131007 +------------- + 0 +(1 row) + +--建表 +create table tab_1131021(id int,aa char(8)); +insert into tab_1131021 values(1,'name'); +--select +set @a_1131021:=1; +select @a_1131021:=@a_1131021+id from tab_1131021; + ?column? +---------- + 2 +(1 row) + +select @a_1131021:=@a_1131021+aa from tab_1131021;--报错 + ?column? +---------- + 2 +(1 row) + +drop table if exists tab_1131021 cascade; +--建表 +create table tab_1131027(id int,aa char(8)); +insert into tab_1131027 values(1,'name'),(2,'ss'),(3,'dd'); +--select +select @a_1131027:=min(id) from tab_1131027; + ?column? +---------- + 1 +(1 row) + +select @a_1131027:=max(id) from tab_1131027; + ?column? +---------- + 3 +(1 row) + +select @a_1131027:=sum(id) from tab_1131027; + ?column? +---------- + 6 +(1 row) + +select @a_1131027:=avg(id) from tab_1131027; + ?column? +-------------------- + 2.0000000000000000 +(1 row) + +select @a_1131027:=count(id) from tab_1131027; + ?column? +---------- + 3 +(1 row) + +drop table if exists tab_1131027 cascade; +--select +select @a_1131028:=cast('x' as char(4)); + ?column? +---------- + x +(1 row) + +select @a_1131028:=cast('x' as varchar(4)); + ?column? +---------- + x +(1 row) + +select @a_1131028:=cast('x' as nchar(4)); + ?column? +---------- + x +(1 row) + +select @a_1131028:=cast('x' as varchar2(4)); + ?column? +---------- + x +(1 row) + +select @a_1131028:=cast('x' as text); + ?column? +---------- + x +(1 row) + +select @a_1131028:=cast(2 as int); + ?column? +---------- + 2 +(1 row) + +select @a_1131028:=cast(2 as number); + ?column? +---------- + 2 +(1 row) + set enable_set_variable_b_format = 0; select @var_t_1 := 2; ERROR: syntax error at or near ":=" diff --git a/src/test/regress/sql/mysql_compatibility.sql b/src/test/regress/sql/mysql_compatibility.sql index a907a964b..97cbd6aca 100644 --- a/src/test/regress/sql/mysql_compatibility.sql +++ b/src/test/regress/sql/mysql_compatibility.sql @@ -390,6 +390,151 @@ select @va; select * from test_trigger_src_tbl; select * from test_trigger_des_tbl; +--@var retest +--select +select @a1:=cast(1 as int2); +select @a2:=cast(2 as int4); +select @a3:=cast(3 as int8); +select @a4:=cast(4 as number); +select @a5:=cast(5.5 as numeric); +select @a6:=cast(6.76 as number(5)); +select @a7:=cast(0.54 as number(3,3)); +select @a8:=cast(8.0 as number(4,1)); +select @a9:=cast(9.66 as float4); +select @a10:=cast(10.33 as float8); +select @a11:=cast(11.2 as real); +select @a1,@a2,@a3,@a4,@a5,@a6,@a7,@a8,@a9,@a10,@a11; + +--select +select @a1:=cast(1 as char); +select @a2:=cast(2 as varchar); +select @a3:=cast(3 as clob); +select @a4:=cast(4 as text); +select @a5:=cast(5.5 as name); +select @a6:=cast(6.76 as nchar); +select @a7:=cast(7.54 as char(4)); +select @a8:=cast(8.0 as nchar(4)); +select @a9:=cast(9.66 as varchar(4)); +select @a10:=cast(10.33 as varchar2(4)); +select @a11:=cast(11.2 as nvarchar2(4)); +select @a1,@a2,@a3,@a4,@a5,@a6,@a7,@a8,@a9,@a10,@a11; + +--select +select @a1:=cast('2012-12-12' as date); +select @a2:=cast('10:25:32' as time); +select @a3:=cast('2023-01-22' as timestamp); +select @a4:=cast('2003-04-12 04:05:06' as smalldatetime); +select @a5:=cast(INTERVAL '3' year as interval year); +select @a6:=cast(INTERVAL '3' DAY as interval day to second); +select @a7:=cast('90' as reltime); +select @a1,@a2,@a3,@a4,@a5,@a6,@a7; + + +--select +select @a1:='[1,2,3]'; +select @a2:='[1,[2,4,6],3]'; +select @a3:='[1,{"aa":"ss","bb":4},3]'; +select @a4:='{"aa":"ss","bb":4}'; +select @a5:='{"aa":"ss","bb":4,"cc":{"dd":9}}'; +select @a6:='{"aa":[2,3,4],"bb":4}'; +select @a1,@a2,@a3,@a4,@a5,@a6; + +--外表 +create table tt_1130949(a1 text PRIMARY KEY); +insert into tt_1130949 values('d'),('r'),('i'),('j'); +--建表 +create table tab_1130949(a1 int not null,a2 char(8) unique,a3 text primary key,a4 date default '2023-02-03',a5 varchar(16) check(a5 is not null),a6 text REFERENCES tt_1130949(a1)); +--index +create index on tab_1130949(a1); +create index on tab_1130949 using btree(a2); +create index on tab_1130949 using gin(to_tsvector('ngram', a4)); +--insert +insert into tab_1130949 values(1,'a','b','2012-12-14','c','d'); +insert into tab_1130949 values(2,'q','w','2013-12-14','e','r'); +insert into tab_1130949 values(3,'t','y','2014-12-14','u','i'); +insert into tab_1130949 values(4,'f','g','2015-12-14','h','j'); + +--select 变量 +select @b1:=a1 from tab_1130949; +select @b2:=a2 from tab_1130949; +select @b3:=a3 from tab_1130949; +select @b4:=a4 from tab_1130949; +select @b5:=a5 from tab_1130949; +select @b6:=a6 from tab_1130949; +select @b1,@b2,@b3,@b4,@b5,@b6; + + +drop table if exists tt_1130949 cascade; + +drop table if exists tab_1130956 cascade; + +--建表 +create table tab_1130965(a1 int,a2 int); +--插入数据 +insert into tab_1130965 values(1,1),(2,3),(3,2),(4,1); + +--select +--表字段与常量 +select (@bq1:=case when tab_1130965.a1<3 then tab_1130965.a1 +3 else tab_1130965.a1 end) from tab_1130965; +--表字段与表字段 +select (@bq2:=case when tab_1130965.a1 @asd2 then @asd2 else @asd1 end); +--变量与常量 +set @asd2:=2; +select (@bq5:=case when @asd1>3 then @asd2 else @asd1 end); +select @bq1,@bq2,@bq3,@bq4,@bq5; + +--创建函数 +create or replace function fun_1131007(b1 in int,b2 in int,b3 out int)return int +as +begin +select @bb:=b1>b2 into b3; +raise notice '%',b3; +return @bb; +end; +/ + +select fun_1131007(1,2); + +--建表 +create table tab_1131021(id int,aa char(8)); +insert into tab_1131021 values(1,'name'); +--select +set @a_1131021:=1; +select @a_1131021:=@a_1131021+id from tab_1131021; +select @a_1131021:=@a_1131021+aa from tab_1131021;--报错 + +drop table if exists tab_1131021 cascade; + +--建表 +create table tab_1131027(id int,aa char(8)); +insert into tab_1131027 values(1,'name'),(2,'ss'),(3,'dd'); + +--select +select @a_1131027:=min(id) from tab_1131027; +select @a_1131027:=max(id) from tab_1131027; +select @a_1131027:=sum(id) from tab_1131027; +select @a_1131027:=avg(id) from tab_1131027; +select @a_1131027:=count(id) from tab_1131027; + +drop table if exists tab_1131027 cascade; + +--select +select @a_1131028:=cast('x' as char(4)); +select @a_1131028:=cast('x' as varchar(4)); +select @a_1131028:=cast('x' as nchar(4)); +select @a_1131028:=cast('x' as varchar2(4)); +select @a_1131028:=cast('x' as text); +select @a_1131028:=cast(2 as int); +select @a_1131028:=cast(2 as number); + + + set enable_set_variable_b_format = 0; select @var_t_1 := 2;