BUG #11335: an invalid prepare statement causes crash at log_statement = 'mod' or 'ddl'.

TAKATSUKA Haruka <harukat@sraoss.co.jp>

From: harukat@sraoss.co.jp
To: pgsql-bugs@postgresql.org
Date: 2014-09-02T11:16:53Z
Lists: pgsql-bugs
The following bug has been logged on the website:

Bug reference:      11335
Logged by:          invalid prepare statement causes crash at log_statement = &#39;mod&#39; or &#39;ddl&#39;.
Email address:      harukat@sraoss.co.jp
PostgreSQL version: 9.3.5
Operating system:   CentOS 6.2 (64bit / gcc 4.4.7)
Description:        


setting:
  log_statement = 'mod' # or 'ddl'

reproduction client code:
 <?php
 require_once 'MDB2.php';
 $con1 =& MDB2::connect("pgsql://postgres@localhost/db1");
 if (PEAR::isError($con1)) { die($con1->getMessage()); }
 $sth = $con1->prepare("");
 if (PEAR::isError($sth)) { die($sth->getMessage()); }
 $sth->execute();
 ?>

log messages:
 2014-09-02 19:41:57 JST 9453 LOG:  server process (PID 10372) was
 terminated by signal11: Segmentation fault
 2014-09-02 19:41:57 JST 9453 DETAIL:  Failed process was running:
 EXECUTE mdb2_statement_pgsql_9cc7dc53dfc30b3c2b937c650346f586

This occur in 9.3.5 and 9.1.14. (It probably occur at any versions.)
I tested that the following fix prevent this crash.

*** ./src/backend/tcop/utility.c	2014-09-02 19:32:44.735266203 +0900
--- ./src/backend/tcop/utility.c.ORG	2014-09-02 18:17:47.631854101 +0900
***************
*** 2307,2314 ****
  GetCommandLogLevel(Node *parsetree)
  {
  	LogStmtLevel lev;
- 	if (! parsetree)
- 		return LOGSTMT_ALL;
  
  	switch (nodeTag(parsetree))
  	{
--- 2307,2312 ----


Though we should throw ERROR for empty prepared statement,
I hope for a symptomatic treatment such as the above.
Because an application package use such wrong query.


----------------------------------------------------------
Haruka Takatsuka
harukat@sraoss.co.jp SRA OSS, Inc. http://www.sraoss.co.jp