From: | Yulin PEI <ypeiae(at)connect(dot)ust(dot)hk> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | "pgsql-hackers(at)lists(dot)postgresql(dot)org" <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | 回覆: 回复: Core dump happens when execute sql CREATE VIEW v1(c1) AS (SELECT ('4' COLLATE "C")::INT FROM generate_series(1, 10)); |
Date: | 2021-04-19 15:19:29 |
Message-ID: | HK0PR01MB227473FB7164AECC8C948F73F4499@HK0PR01MB2274.apcprd01.prod.exchangelabs.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Consider the SQL statement 'SELECT (('1' COLLATE "C") ||(B'1'));' . Intuitively, the result will be '11' and the result is '11' in pg 13.2 release as well.
The function stack is make_fn_arguments -> coerce_type, which means that the param "Node *node" of function coerce_type could be a CollateExpr Node.
Let's look at your patch:
```
// node is ('1' COLLATE "C")
// targetType is varbit and it is non-collatable
if (IsA(node, CollateExpr) && type_is_collatable(targetTypeId))
{
// we will not reach here.
CollateExpr *coll = (CollateExpr *) node;
CollateExpr *newcoll = makeNode(CollateExpr);
....
// An error will be generated. "failed to find conversion function"
}
```
So I suggest:
```
// node is ('1' COLLATE "C")
if (IsA(node, CollateExpr))
{
CollateExpr *coll = (CollateExpr *) node;
CollateExpr *newcoll = makeNode(CollateExpr);
//targetType is varbit and it is non-collatable
if (!type_is_collatable(targetTypeId)) {
// try to convert '1'(string) to varbit
// We do not make a new CollateExpr here, but don't forget to coerce coll->arg.
return coerce_type(pstate, (Node *) coll->arg,
inputTypeId, targetTypeId, targetTypeMod,
ccontext, cformat, location);
}
...
}
```
________________________________
寄件者: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
寄件日期: 2021年4月19日 1:46
收件者: Yulin PEI <ypeiae(at)connect(dot)ust(dot)hk>
副本: pgsql-hackers(at)lists(dot)postgresql(dot)org <pgsql-hackers(at)lists(dot)postgresql(dot)org>
主旨: Re: 回复: Core dump happens when execute sql CREATE VIEW v1(c1) AS (SELECT ('4' COLLATE "C")::INT FROM generate_series(1, 10));
Yulin PEI <ypeiae(at)connect(dot)ust(dot)hk> writes:
> After several tests, I found that this patch do not fix the bug well.
What do you think is wrong with it?
> So the attachment is my patch and it works well as far as I tested.
This seems equivalent to the already-committed patch [1] except that
it wastes a makeNode call in the coerce-to-uncollatable-type case.
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Haas | 2021-04-19 15:53:18 | Re: [HACKERS] [PATCH] Caching for stable expressions with constant arguments v3 |
Previous Message | Tom Lane | 2021-04-19 15:07:58 | Re: Commit 86dc90056 - Rework planning and execution of UPDATE and DELETE |