!927 在(+)表示的外连接中支持is null
Merge pull request !927 from scarbor_fair/is_null
This commit is contained in:
@ -143,7 +143,7 @@ static void insert_jointerm(OperatorPlusProcessContext* ctx, Expr* expr, RangeTb
|
|||||||
ListCell* lc = NULL;
|
ListCell* lc = NULL;
|
||||||
JoinTerm* jterm = NULL;
|
JoinTerm* jterm = NULL;
|
||||||
|
|
||||||
Assert(IsA(expr, A_Expr));
|
Assert(IsA(expr, A_Expr) || IsA(expr, NullTest));
|
||||||
|
|
||||||
/* lrte is the RTE with operator "(+)", it couldn't be NULL */
|
/* lrte is the RTE with operator "(+)", it couldn't be NULL */
|
||||||
Assert(lrte != NULL);
|
Assert(lrte != NULL);
|
||||||
@ -567,8 +567,8 @@ bool plus_outerjoin_precheck(const OperatorPlusProcessContext* ctx, Node* expr,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Only support A_Expr with "(+)" for now */
|
/* Only support A_Expr and NullTest with "(+)" for now */
|
||||||
if (list_length(lhasplus) && !IsA(expr, A_Expr)) {
|
if (list_length(lhasplus) && !IsA(expr, A_Expr) && !IsA(expr, NullTest)) {
|
||||||
ereport(
|
ereport(
|
||||||
ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("Operator \"(+)\" can only be used in common expression.")));
|
ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("Operator \"(+)\" can only be used in common expression.")));
|
||||||
}
|
}
|
||||||
|
@ -4,11 +4,15 @@ create table t11(c1 int, c2 int, c3 int);
|
|||||||
create table t12(c1 int, c2 int, c3 int);
|
create table t12(c1 int, c2 int, c3 int);
|
||||||
create table t13(c1 int, c2 int, c3 int);
|
create table t13(c1 int, c2 int, c3 int);
|
||||||
create table t14(A4 int, B4 int, c4 int);
|
create table t14(A4 int, B4 int, c4 int);
|
||||||
|
create table t_a (id int, name varchar(10), code int);
|
||||||
|
create table t_b (id int, name varchar(10), code int);
|
||||||
-- insert base
|
-- insert base
|
||||||
insert into t11 select v,v,v from generate_series(1,10) as v;
|
insert into t11 select v,v,v from generate_series(1,10) as v;
|
||||||
insert into t12 select * from t11;
|
insert into t12 select * from t11;
|
||||||
insert into t13 select * from t11;
|
insert into t13 select * from t11;
|
||||||
insert into t14 select v,v,v from generate_series(1,30) as v;
|
insert into t14 select v,v,v from generate_series(1,30) as v;
|
||||||
|
insert into t_a values (1, 'tom', 3);
|
||||||
|
insert into t_b values (1, 'bat', 6);
|
||||||
-- insert t11 t12, t13's not match values
|
-- insert t11 t12, t13's not match values
|
||||||
insert into t11 select v,v,v from generate_series(11,15) as v;
|
insert into t11 select v,v,v from generate_series(11,15) as v;
|
||||||
insert into t12 select v,v,v from generate_series(16,20) as v;
|
insert into t12 select v,v,v from generate_series(16,20) as v;
|
||||||
@ -1463,9 +1467,28 @@ select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t1
|
|||||||
|
|
||||||
-------used (+) with un common expression, like is null, is not null--------
|
-------used (+) with un common expression, like is null, is not null--------
|
||||||
select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t11.c3 = t13.c1(+) and t13.c2(+) is not null;
|
select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t11.c3 = t13.c1(+) and t13.c2(+) is not null;
|
||||||
ERROR: Operator "(+)" can only be used in common expression.
|
c1 | c2 | c2
|
||||||
|
----+----+----
|
||||||
|
1 | 1 | 1
|
||||||
|
2 | 2 | 2
|
||||||
|
3 | 3 | 3
|
||||||
|
4 | 4 | 4
|
||||||
|
5 | 5 | 5
|
||||||
|
6 | 6 | 6
|
||||||
|
7 | 7 | 7
|
||||||
|
8 | 8 | 8
|
||||||
|
9 | 9 | 9
|
||||||
|
10 | 10 | 10
|
||||||
|
(10 rows)
|
||||||
|
|
||||||
select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t11.c3 = t13.c1(+) and (t13.c2(+) > t12.c1)::bool;
|
select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t11.c3 = t13.c1(+) and (t13.c2(+) > t12.c1)::bool;
|
||||||
ERROR: Operator "(+)" can only be used in common expression.
|
ERROR: Operator "(+)" can only be used in common expression.
|
||||||
|
select * from t_a a,t_b b where b.id=a.id(+) and a.code(+) + 1 * 2 + a.code(+) IS NOT NULL ;
|
||||||
|
id | name | code | id | name | code
|
||||||
|
----+------+------+----+------+------
|
||||||
|
1 | tom | 3 | 1 | bat | 6
|
||||||
|
(1 row)
|
||||||
|
|
||||||
drop view plus_v;
|
drop view plus_v;
|
||||||
drop function plus_join_test_1();
|
drop function plus_join_test_1();
|
||||||
drop table t1;
|
drop table t1;
|
||||||
@ -1475,4 +1498,6 @@ drop table t12;
|
|||||||
drop table t13;
|
drop table t13;
|
||||||
drop table t14;
|
drop table t14;
|
||||||
drop table t15;
|
drop table t15;
|
||||||
|
drop table t_a;
|
||||||
|
drop table t_b;
|
||||||
drop schema plus_outerjoin;
|
drop schema plus_outerjoin;
|
||||||
|
@ -4,12 +4,16 @@ create table t11(c1 int, c2 int, c3 int);
|
|||||||
create table t12(c1 int, c2 int, c3 int);
|
create table t12(c1 int, c2 int, c3 int);
|
||||||
create table t13(c1 int, c2 int, c3 int);
|
create table t13(c1 int, c2 int, c3 int);
|
||||||
create table t14(A4 int, B4 int, c4 int);
|
create table t14(A4 int, B4 int, c4 int);
|
||||||
|
create table t_a (id int, name varchar(10), code int);
|
||||||
|
create table t_b (id int, name varchar(10), code int);
|
||||||
|
|
||||||
-- insert base
|
-- insert base
|
||||||
insert into t11 select v,v,v from generate_series(1,10) as v;
|
insert into t11 select v,v,v from generate_series(1,10) as v;
|
||||||
insert into t12 select * from t11;
|
insert into t12 select * from t11;
|
||||||
insert into t13 select * from t11;
|
insert into t13 select * from t11;
|
||||||
insert into t14 select v,v,v from generate_series(1,30) as v;
|
insert into t14 select v,v,v from generate_series(1,30) as v;
|
||||||
|
insert into t_a values (1, 'tom', 3);
|
||||||
|
insert into t_b values (1, 'bat', 6);
|
||||||
|
|
||||||
-- insert t11 t12, t13's not match values
|
-- insert t11 t12, t13's not match values
|
||||||
insert into t11 select v,v,v from generate_series(11,15) as v;
|
insert into t11 select v,v,v from generate_series(11,15) as v;
|
||||||
@ -357,6 +361,7 @@ select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t1
|
|||||||
-------used (+) with un common expression, like is null, is not null--------
|
-------used (+) with un common expression, like is null, is not null--------
|
||||||
select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t11.c3 = t13.c1(+) and t13.c2(+) is not null;
|
select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t11.c3 = t13.c1(+) and t13.c2(+) is not null;
|
||||||
select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t11.c3 = t13.c1(+) and (t13.c2(+) > t12.c1)::bool;
|
select t11.c1, t12.c2, t13.c2 from t11, t12, t13 where t11.c2 = t12.c3(+) and t11.c3 = t13.c1(+) and (t13.c2(+) > t12.c1)::bool;
|
||||||
|
select * from t_a a,t_b b where b.id=a.id(+) and a.code(+) + 1 * 2 + a.code(+) IS NOT NULL ;
|
||||||
|
|
||||||
drop view plus_v;
|
drop view plus_v;
|
||||||
drop function plus_join_test_1();
|
drop function plus_join_test_1();
|
||||||
@ -367,4 +372,6 @@ drop table t12;
|
|||||||
drop table t13;
|
drop table t13;
|
||||||
drop table t14;
|
drop table t14;
|
||||||
drop table t15;
|
drop table t15;
|
||||||
|
drop table t_a;
|
||||||
|
drop table t_b;
|
||||||
drop schema plus_outerjoin;
|
drop schema plus_outerjoin;
|
||||||
|
Reference in New Issue
Block a user