!3180 重构@变量查询赋值功能,支持列数据输入,修复问题

Merge pull request !3180 from chenbd/fix_var_bugs
This commit is contained in:
opengauss-bot
2023-03-21 15:04:34 +00:00
committed by Gitee
6 changed files with 824 additions and 10 deletions

View File

@ -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:

View File

@ -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
@ -6166,6 +6327,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,

View File

@ -2707,6 +2707,7 @@ typedef struct RownumState {
typedef struct UserSetElemState {
ExprState xprstate;
UserSetElem* use;
ExprState* instate;
} UserSetElemState;
/* ----------------
* GroupingFuncExprState node

View File

@ -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 */

View File

@ -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<tab_1130965.a2 then tab_1130965.a1 else tab_1130965.a2 end) from tab_1130965;
?column?
----------
1
2
2
1
(4 rows)
--表字段与变量
set @asd1:=5;
select (@bq3:=case when tab_1130965.a1< @asd1 then tab_1130965.a1 else @asd1 end) from tab_1130965;
?column?
----------
1
2
3
4
(4 rows)
--变量与变量
set @asd2:=3;
select (@bq4:=case when @asd1> @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 ":="

View File

@ -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<tab_1130965.a2 then tab_1130965.a1 else tab_1130965.a2 end) from tab_1130965;
--
set @asd1:=5;
select (@bq3:=case when tab_1130965.a1< @asd1 then tab_1130965.a1 else @asd1 end) from tab_1130965;
--
set @asd2:=3;
select (@bq4:=case when @asd1> @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;