!5773 concat、concat_ws函数支持simplify;字段引用表达式兼容
Merge pull request !5773 from laishenghao/concat
This commit is contained in:
@ -247,6 +247,31 @@ static Const* BuildColumnBaseValue(Form_pg_attribute attTup)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static bool IsConstDefaultValue(FuncExpr* expr)
|
||||
{
|
||||
if (expr->funcformat != COERCE_IMPLICIT_CAST) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ListCell* cell = NULL;
|
||||
List* args = expr->args;
|
||||
bool isFirstArg = true;
|
||||
|
||||
foreach (cell, args) {
|
||||
Node* arg = (Node*)lfirst(cell);
|
||||
if (isFirstArg) {
|
||||
isFirstArg = false;
|
||||
if (!IsA(arg, Const) &&
|
||||
!(IsA(arg, FuncExpr) && ((FuncExpr*)arg)->funcformat == COERCE_IMPLICIT_CAST)) {
|
||||
return false;
|
||||
}
|
||||
} else if (!IsA(arg, Const)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static void AddDefaultExprNode(ParseState* pstate)
|
||||
{
|
||||
RightRefState* refState = pstate->rightRefState;
|
||||
@ -280,7 +305,7 @@ static void AddDefaultExprNode(ParseState* pstate)
|
||||
refState->constValues[i] = nullptr;
|
||||
} else if (IsA(node, Const)) {
|
||||
refState->constValues[i] = (Const*)node;
|
||||
} else if (IsA(node, FuncExpr)) {
|
||||
} else if (IsA(node, FuncExpr) && IsConstDefaultValue((FuncExpr*)node)) {
|
||||
FuncExpr* expr = (FuncExpr*)node;
|
||||
List* args = expr->args;
|
||||
Expr* simple = simplify_function(expr->funcid, expr->funcresulttype, exprTypmod((const Node*)expr),
|
||||
|
||||
@ -4197,7 +4197,7 @@ static Oid pre_evaluate_func[] = {CURRENTSCHEMAFUNCOID,
|
||||
CURRENTDATABASEFUNCOID,
|
||||
PGCLIENTENCODINGFUNCOID};
|
||||
|
||||
static bool is_safe_simplify_func(Oid funcid)
|
||||
static bool is_safe_simplify_func(Oid funcid, List *args)
|
||||
{
|
||||
if (funcid == InvalidOid) {
|
||||
return false;
|
||||
@ -4207,6 +4207,56 @@ static bool is_safe_simplify_func(Oid funcid)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/* handle some special func */
|
||||
if (funcid == CONCATFUNCOID || funcid == CONCATWSFUNCOID) {
|
||||
ListCell* arg = NULL;
|
||||
foreach (arg, args) {
|
||||
Oid typ = exprType((Node*)lfirst(arg));
|
||||
/*
|
||||
* binary: not ok, bytea_output will affect the result. raw, etc...
|
||||
* binary: BINARY, VARBINARY, BLOB, TINYBLOB, MEDIUMBLOB, LONGBLOB, bit. althought the concat_internal treat
|
||||
* them specially, but the concat result is blob, so the result still affect by bytea_output.
|
||||
* time: not ok, DateStyle will affect the result. time, timestamp, date, etc...
|
||||
* num: ok, integer, float, numeric
|
||||
* bool: ok
|
||||
* string: ok, char/varchar/text/xml/json/set/enum/xml/unknown, etc...
|
||||
*/
|
||||
switch (typ) {
|
||||
case BOOLOID:
|
||||
case CHAROID:
|
||||
case NAMEOID:
|
||||
case INT1OID:
|
||||
case INT2OID:
|
||||
case INT4OID:
|
||||
case INT8OID:
|
||||
case INT16OID:
|
||||
case TEXTOID:
|
||||
case OIDOID:
|
||||
case CLOBOID:
|
||||
case JSONOID:
|
||||
case XMLOID:
|
||||
case UNKNOWNOID:
|
||||
case VARCHAROID:
|
||||
case VARBITOID:
|
||||
case CSTRINGOID:
|
||||
case JSONBOID:
|
||||
case NVARCHAR2OID:
|
||||
case XIDOID:
|
||||
case SHORTXIDOID:
|
||||
break;
|
||||
default:
|
||||
if (type_is_set(typ) || type_is_enum(typ)) {
|
||||
break;
|
||||
}
|
||||
/* other case, return false directly */
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/* all args outfunc are immutable, return true */
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -4295,7 +4345,7 @@ static Expr* evaluate_function(Oid funcid, Oid result_type, int32 result_typmod,
|
||||
/* okay */;
|
||||
else if (context->estimate && funcform->provolatile == PROVOLATILE_STABLE)
|
||||
/* okay */;
|
||||
else if (is_safe_simplify_func(funcid))
|
||||
else if (is_safe_simplify_func(funcid, args))
|
||||
/* okay */;
|
||||
else
|
||||
return NULL;
|
||||
|
||||
@ -778,3 +778,471 @@ explain (costs off, verbose on) select * from test where date_trunc('year', b) >
|
||||
|
||||
--clean up
|
||||
drop table test;
|
||||
create table concat_ws_t(a text);
|
||||
-- test concat
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1', '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::bool, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%t%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::"char", '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::name, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int1, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int2, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int4, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int8, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int16, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::text, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::oid, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::clob, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '{"a":1}'::json, '%');
|
||||
QUERY PLAN
|
||||
------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%{"a":1}%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::xml, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::varchar, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::varbit, '%')::text;
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::cstring, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '{"a":1}'::jsonb, '%');
|
||||
QUERY PLAN
|
||||
-------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%{"a": 1}%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::nvarchar2, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::xid, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::xid32, '%');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '%1%'::text)
|
||||
(2 rows)
|
||||
|
||||
-- some can't do simply func
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::money, '%');
|
||||
QUERY PLAN
|
||||
---------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', '$1.00'::money, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::raw, '%');
|
||||
QUERY PLAN
|
||||
----------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', '01'::raw, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::bytea, '%');
|
||||
QUERY PLAN
|
||||
--------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', '\x31'::bytea, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '2022-11-11'::date, '%');
|
||||
QUERY PLAN
|
||||
------------------------------------------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', '2022-11-11 00:00:00'::timestamp(0) without time zone, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '2022-11-11 11:11:11'::timestamp, '%');
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', '2022-11-11 11:11:11'::timestamp without time zone, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '11:11:11'::time, '%');
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', '11:11:11'::time without time zone, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::numeric, '%');
|
||||
QUERY PLAN
|
||||
-----------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', 1::numeric, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::bpchar, '%');
|
||||
QUERY PLAN
|
||||
------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', '1'::bpchar, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::float4, '%');
|
||||
QUERY PLAN
|
||||
--------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', 1::real, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::float8, '%');
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', 1::double precision, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::blob, '%')::text;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', '01'::blob, '%'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::bit(8), '%')::text;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat('%', B'10000000'::bit(8), '%'))
|
||||
(2 rows)
|
||||
|
||||
-- -- test concat_ws
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1', '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::bool, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ 't23'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::"char", '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::name, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int1, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int2, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int4, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int8, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int16, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::text, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::oid, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::clob, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '{"a":1}'::json, '3');
|
||||
QUERY PLAN
|
||||
------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '{"a":1}23'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::xml, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::varchar, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::varbit, '3')::text;
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::cstring, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '{"a":1}'::jsonb, '3');
|
||||
QUERY PLAN
|
||||
-------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '{"a": 1}23'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::nvarchar2, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::xid, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::xid32, '3');
|
||||
QUERY PLAN
|
||||
------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ '123'::text)
|
||||
(2 rows)
|
||||
|
||||
-- some can't do simply func
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::money, '3');
|
||||
QUERY PLAN
|
||||
------------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, '$1.00'::money, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::raw, '3');
|
||||
QUERY PLAN
|
||||
-------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, '01'::raw, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::bytea, '3');
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, '\x31'::bytea, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '2022-11-11'::date, '3');
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, '2022-11-11 00:00:00'::timestamp(0) without time zone, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '2022-11-11 11:11:11'::timestamp, '3');
|
||||
QUERY PLAN
|
||||
------------------------------------------------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, '2022-11-11 11:11:11'::timestamp without time zone, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '11:11:11'::time, '3');
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, '11:11:11'::time without time zone, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::numeric, '3');
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, 1::numeric, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::bpchar, '3');
|
||||
QUERY PLAN
|
||||
---------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, '1'::bpchar, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::float4, '3');
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, 1::real, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::float8, '3');
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, 1::double precision, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::blob, '3')::text;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, '01'::blob, '3'))
|
||||
(2 rows)
|
||||
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::bit(8), '3')::text;
|
||||
QUERY PLAN
|
||||
-----------------------------------------------------------------
|
||||
Seq Scan on concat_ws_t
|
||||
Filter: (a ~~ concat_ws('2'::text, B'10000000'::bit(8), '3'))
|
||||
(2 rows)
|
||||
|
||||
drop table concat_ws_t;
|
||||
|
||||
@ -183,7 +183,7 @@ select (c6 is not null) as c6_is_not_null,
|
||||
(c12 is not null) as c12_is_not_null
|
||||
from time_default_t where n = 1 or n = 3;
|
||||
|
||||
select (c6 is not null) c6_is_not_null,
|
||||
select (c6 is null) as c6_is_null,
|
||||
(c8 is null) as c8_is_null,
|
||||
(c10 is null) as c10_is_null,
|
||||
(c12 is null) as c12_is_null
|
||||
|
||||
@ -215,8 +215,8 @@ from num_default_t;
|
||||
?column? | c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c9 | c10 | c11 | c12 | c13 | c14 | c15 | c16 | c17 | c18 | c19 | c20 | c21
|
||||
----------+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+--------+-----+-------+-----+-----+-----+------
|
||||
3 | 1 | | 3 | | 5 | | 7 | | 9 | 10 | | t | | 14 | 15.000 | 16 | 17.00 | 18 | | 10 | 2037
|
||||
3 | 1 | | 3 | | 5 | | 7 | | 9 | 10 | | t | | 14 | 15.000 | 16 | 17.00 | 18 | | | 2037
|
||||
3 | 1 | | 3 | | 5 | | 7 | | 9 | 10 | | t | | 14 | 15.000 | 16 | 17.00 | 18 | | | 2037
|
||||
3 | 1 | | 3 | | 5 | | 7 | | 9 | 10 | | t | | 14 | 15.000 | 16 | 17.00 | 18 | | |
|
||||
3 | 1 | | 3 | | 5 | | 7 | | 9 | 10 | | t | | 14 | 15.000 | 16 | 17.00 | 18 | | |
|
||||
3 | 1 | | 3 | | 5 | | 7 | | 9 | 10 | | t | | 14 | 15.000 | 16 | 17.00 | 18 | | 10 | 2037
|
||||
(4 rows)
|
||||
|
||||
@ -308,14 +308,14 @@ from time_default_t where n = 1 or n = 3;
|
||||
t | t | t | t
|
||||
(2 rows)
|
||||
|
||||
select (c6 is not null) c6_is_not_null,
|
||||
select (c6 is null) as c6_is_null,
|
||||
(c8 is null) as c8_is_null,
|
||||
(c10 is null) as c10_is_null,
|
||||
(c12 is null) as c12_is_null
|
||||
from time_default_t where n = 2;
|
||||
c6_is_not_null | c8_is_null | c10_is_null | c12_is_null
|
||||
----------------+------------+-------------+-------------
|
||||
t | t | t | t
|
||||
c6_is_null | c8_is_null | c10_is_null | c12_is_null
|
||||
------------+------------+-------------+-------------
|
||||
t | t | t | t
|
||||
(1 row)
|
||||
|
||||
select (c1=c2) as c1c2,
|
||||
|
||||
@ -329,3 +329,80 @@ explain (costs off, verbose on) select * from test where date_trunc('year', b) >
|
||||
|
||||
--clean up
|
||||
drop table test;
|
||||
|
||||
create table concat_ws_t(a text);
|
||||
-- test concat
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1', '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::bool, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::"char", '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::name, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int1, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int2, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int4, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int8, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::int16, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::text, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::oid, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::clob, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '{"a":1}'::json, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::xml, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::varchar, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::varbit, '%')::text;
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::cstring, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '{"a":1}'::jsonb, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::nvarchar2, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::xid, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::xid32, '%');
|
||||
|
||||
-- some can't do simply func
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::money, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::raw, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::bytea, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '2022-11-11'::date, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '2022-11-11 11:11:11'::timestamp, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '11:11:11'::time, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::numeric, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::bpchar, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::float4, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::float8, '%');
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::blob, '%')::text;
|
||||
explain(costs off) select * from concat_ws_t where a like concat('%', '1'::bit(8), '%')::text;
|
||||
|
||||
-- -- test concat_ws
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1', '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::bool, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::"char", '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::name, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int1, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int2, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int4, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int8, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::int16, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::text, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::oid, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::clob, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '{"a":1}'::json, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::xml, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::varchar, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::varbit, '3')::text;
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::cstring, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '{"a":1}'::jsonb, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::nvarchar2, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::xid, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::xid32, '3');
|
||||
|
||||
-- some can't do simply func
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::money, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::raw, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::bytea, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '2022-11-11'::date, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '2022-11-11 11:11:11'::timestamp, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '11:11:11'::time, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::numeric, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::bpchar, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::float4, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::float8, '3');
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::blob, '3')::text;
|
||||
explain(costs off) select * from concat_ws_t where a like concat_ws('2', '1'::bit(8), '3')::text;
|
||||
|
||||
drop table concat_ws_t;
|
||||
|
||||
Reference in New Issue
Block a user