pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Andrey Lepikhov <a.lepikhov@postgrespro.ru>
To: PostgreSQL-Dev <pgsql-hackers@postgresql.org>
Subject: Clarification of nodeToString() use cases
Date: Sun, 16 Sep 2018 16:43:05 +0500
Message-ID: <3690074f-abd2-56a9-144a-aa5545d7a291@postgrespro.ru> (raw)

Hi, Hackers!

In the AQO project (Adaptive Query Optimization) [1] the nodeToString() 
function is used by the planner to convert an query parse tree into a 
string to generate a hash value [2].
In PostgreSQL v.11 call nodeToString(parse) segfaulted.
The reason is: parse tree node for XMLNAMESPACES clause has null pointer 
in the case of DEFAULT namespace (the pointer will be initialized at 
executor on the first call). Function _outValue() uses value->val.str[0] 
[3] without checking of value->val.str.

I want to know, which of next options is correct:
1. Converting a parse tree into string with nodeToString() is illegal 
operation. We need to add a comment to the description of nodeToString().
2. We can use nodeToString() for parse tree convertation. In this case 
we need to check node variable 'value->val.str' to NULL pointer (Now I 
use this approach, see attachment).

[1] https://github.com/postgrespro/aqo
[2] hash.c, line 55.
[3] outfuncs.c, line 3312.

-- 
Andrey Lepikhov
Postgres Professional
https://postgrespro.com
The Russian Postgres Company

Attachments:

0001-XML-Bug-fix.patch (text/x-patch, 824B) download From 26bfe91a4901b3b342e1b3ed58252ac750773207 Mon Sep 17 00:00:00 2001 From: "Andrey V. Lepikhov" <a.lepikhov@postgrespro.ru> Date: Sun, 16 Sep 2018 08:30:19 +0500 Subject: [PATCH] XML Bug fix --- src/backend/nodes/outfuncs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 744a8b91b8..20eb033eac 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -3310,7 +3310,7 @@ _outValue(StringInfo str, const Value *value) * but we don't want it to do anything with an empty string. */ appendStringInfoChar(str, '"'); - if (value->val.str[0] != '\0') + if ((value->val.str) && (value->val.str[0] != '\0')) outToken(str, value->val.str); appendStringInfoChar(str, '"'); break; -- 2.17.1

Message-ID: <3690074f-abd2-56a9-144a-aa5545d7a291@postgrespro.ru>
Permalink:  ../3690074f-abd2-56a9-144a-aa5545d7a291@postgrespro.ru/
Also on:    postgresql.org/message-id/3690074f-abd2-56a9-144a-aa5545d7a291@postgrespro.ru

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: a.lepikhov@postgrespro.ru
  Subject: Re: Clarification of nodeToString() use cases
  In-Reply-To: <3690074f-abd2-56a9-144a-aa5545d7a291@postgrespro.ru>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox