From:             adam at vektah dot net
Operating system: Linux
PHP version:      5.4.16
Package:          PostgreSQL related
Bug Type:         Bug
Bug description:pg_send_query 

Description:
------------
When sending asynchronous postgres queries using pg_send_query() a notice
will 
be raised for large queries:
PHP Notice:  pg_send_query(): Cannot set connection to blocking mode in 
longquery.php on line 6

This only seems to happen on databases NOT hosted on the local machine.

pg_send_query() roughly does:
 PQ_SETNONBLOCKING(1)
 PQsendQuery()
 PQ_SETNONBLOCKING(0)

PQ_SETNONBLOCKING will do this towards the end:
 if (pqFlush(conn))
  return -1;

and fail raising the notice if the connection still has data left in the
send 
buffer.

http://www.postgresql.org/docs/8.3/static/libpq-async.html mentions that: 
After sending any command or data on a non-blocking connection, call
PQflush. If 
it returns 1, wait for the socket to be write-ready and call it again;
repeat 
until it returns 0. Once PQflush returns 0, wait for the socket to be
read-ready 
and then read the response as described above.

The attached patch adds a loop that waits for the buffer to empty before
calling 
PQ_SETNONBLOCKING(0), and raises a notice on any errors.

PHP Versions tested:
 - 5.4.9  (ubuntu package)
 - 5.4.13 (source)
 - 5.4.16 (source)

Postgres configurations tested:
 - 9.1.9 client with 2.2.4 server
 - 9.2.4 client and server

Operating systems tested:
 - Ubuntu 13.04
 - Centos 6

Test script:
---------------
$len = 100000;  // This may need to be increased, depending on db server.
$sql = "select 1" . str_repeat(' ', $len - 8);
$con = pg_connect('host=db-host.example.com dbname=postgres user=postgres
password=password');

pg_send_query($con, $sql);
pg_get_result($con);


Expected result:
----------------
The query should run, no notices should be rasied and the connection should
be 
put back into blocking mode again.

Actual result:
--------------
PHP Notice:  pg_send_query(): Cannot set connection to blocking mode in 
longquery.php on line 6
PHP Stack trace:
PHP   1. {main}()        longquery.php:0
PHP   2. pg_send_query() longquery.php:6


-- 
Edit bug report at https://bugs.php.net/bug.php?id=65015&edit=1
-- 
Try a snapshot (PHP 5.4):   
https://bugs.php.net/fix.php?id=65015&r=trysnapshot54
Try a snapshot (PHP 5.3):   
https://bugs.php.net/fix.php?id=65015&r=trysnapshot53
Try a snapshot (trunk):     
https://bugs.php.net/fix.php?id=65015&r=trysnapshottrunk
Fixed in SVN:               https://bugs.php.net/fix.php?id=65015&r=fixed
Fixed in release:           https://bugs.php.net/fix.php?id=65015&r=alreadyfixed
Need backtrace:             https://bugs.php.net/fix.php?id=65015&r=needtrace
Need Reproduce Script:      https://bugs.php.net/fix.php?id=65015&r=needscript
Try newer version:          https://bugs.php.net/fix.php?id=65015&r=oldversion
Not developer issue:        https://bugs.php.net/fix.php?id=65015&r=support
Expected behavior:          https://bugs.php.net/fix.php?id=65015&r=notwrong
Not enough info:            
https://bugs.php.net/fix.php?id=65015&r=notenoughinfo
Submitted twice:            
https://bugs.php.net/fix.php?id=65015&r=submittedtwice
register_globals:           https://bugs.php.net/fix.php?id=65015&r=globals
PHP 4 support discontinued: https://bugs.php.net/fix.php?id=65015&r=php4
Daylight Savings:           https://bugs.php.net/fix.php?id=65015&r=dst
IIS Stability:              https://bugs.php.net/fix.php?id=65015&r=isapi
Install GNU Sed:            https://bugs.php.net/fix.php?id=65015&r=gnused
Floating point limitations: https://bugs.php.net/fix.php?id=65015&r=float
No Zend Extensions:         https://bugs.php.net/fix.php?id=65015&r=nozend
MySQL Configuration Error:  https://bugs.php.net/fix.php?id=65015&r=mysqlcfg

Reply via email to