!3180 重构@变量查询赋值功能,支持列数据输入,修复问题
Merge pull request !3180 from chenbd/fix_var_bugs
This commit is contained in:
@ -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:
|
||||
|
@ -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,
|
||||
|
@ -2707,6 +2707,7 @@ typedef struct RownumState {
|
||||
typedef struct UserSetElemState {
|
||||
ExprState xprstate;
|
||||
UserSetElem* use;
|
||||
ExprState* instate;
|
||||
} UserSetElemState;
|
||||
/* ----------------
|
||||
* GroupingFuncExprState node
|
||||
|
@ -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 */
|
||||
|
@ -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 ":="
|
||||
|
@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user