<div dir="ltr"><div>Hello!</div><div><br></div><div>We are experiencing random failures when calling Connection.proc() with set returning functions through pgpool2.<br>I use py-postgresql-1.1.0 with commented out CloseStatement in line 1490 in postgresql/driver/pq3.py, to use it with pgpool2 (3.1.3 and 3.3.2) and postgresql 9.3.5.<br>And it looks like, that there are protocol errors.<br><br>Here is code that fails:<br><br><font face="courier new, monospace">import postgresql<br> <br>URL = &quot;pq://hr:hr@localhost:5434/hr&quot; //using pgpool2 (3.3.2)<br> <br>def main():<br>    db = postgresql.open(URL)<br>    db.execute(&quot;&quot;&quot;<br>        CREATE OR REPLACE FUNCTION foo()<br>          RETURNS SETOF boolean AS<br>        $BODY$<br>           select true;<br>        $BODY$<br>          LANGUAGE sql VOLATILE<br>          COST 100<br>          ROWS 1000;<br>        ALTER FUNCTION foo() OWNER TO hr;<br> <br>    &quot;&quot;&quot;)<br>    # db.query(&quot;select foo()&quot;) # works<br>    # v = db.proc(&quot;foo()&quot;)() #works<br>    db.proc(&quot;foo()&quot;)() # does not work<br> <br>    for i in range(200):<br>        db.query(&quot;select 1&quot;) //error comes here<br> <br> <br>if __name__ == &quot;__main__&quot;:<br>    main()</font><br><br> <br>And I get one of two errors:<br><br><font face="courier new, monospace"> Traceback (most recent call last):<br>  File &quot;/home/sergey/projects/emply/sitelib/sitelib/tests/error.py&quot;, line 28, in &lt;module&gt;<br>    main()<br>  File &quot;/home/sergey/projects/emply/sitelib/sitelib/tests/error.py&quot;, line 24, in main<br>    db.query(&quot;select 1&quot;)<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/driver/pq3.py&quot;, line 1233, in __call__<br>    return self._prepare(query)(*parameters)<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/driver/pq3.py&quot;, line 2329, in prepare<br>    ps._fini()<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/driver/pq3.py&quot;, line 1521, in _fini<br>    (*head, argtypes, tupdesc, last) = self._xact.messages_received()<br>ValueError: need more than 0 values to unpack</font><br> <br>Or:<br><br><font face="courier new, monospace">Traceback (most recent call last):<br>  File &quot;/home/sergey/projects/emply/sitelib/sitelib/tests/error.py&quot;, line 28, in &lt;module&gt;<br>    main()<br>  File &quot;/home/sergey/projects/emply/sitelib/sitelib/tests/error.py&quot;, line 24, in main<br>    db.query(&quot;select 1&quot;)<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/driver/pq3.py&quot;, line 1233, in __call__<br>    return self._prepare(query)(*parameters)<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/driver/pq3.py&quot;, line 1573, in __call__<br>    c = SingleXactFetch(self, parameters)<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/driver/pq3.py&quot;, line 868, in __init__<br>    Output.__init__(self, &#39;&#39;)<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/driver/pq3.py&quot;, line 655, in __init__<br>    self._init()<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/driver/pq3.py&quot;, line 885, in _init<br>    STEP()<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/driver/pq3.py&quot;, line 2615, in _pq_step<br>    pq.step()<br>  File &quot;/home/sergey/projects/emply/.venv/sitelib/lib/python3.4/site-packages/py_postgresql-1.1.0-py3.4-linux-x86_64.egg/postgresql/protocol/client3.py&quot;, line 420, in step<br>    &quot;unexpected PQ transaction state: &quot; + repr(dir)<br>RuntimeError: unexpected PQ transaction state: None</font><div style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:12.7272720336914px"><font face="courier new, monospace"><br></font></div>We got rid of errors, by making some minor changes in pq3.py:<div style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:12.7272720336914px"><br></div><div style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:12.7272720336914px"><a href="https://github.com/C-Pro/fe/commit/26a360be216975229215d458b27c644e1bd1893b" target="_blank">https://github.com/C-Pro/fe/commit/26a360be216975229215d458b27c644e1bd1893b</a><br></div><div style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:12.7272720336914px"><a href="https://github.com/C-Pro/fe/commit/a69da2b05048e7d801cece6a75e4c80a53cc27d4" target="_blank">https://github.com/C-Pro/fe/commit/a69da2b05048e7d801cece6a75e4c80a53cc27d4</a><br></div><div style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:12.7272720336914px"><br></div>and<div style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:12.7272720336914px"><br></div><div style="color:rgb(80,0,80);font-family:arial,sans-serif;font-size:12.7272720336914px"><a href="https://github.com/C-Pro/fe/commit/adb4d98240eeaf250543d2350a5d3c71fb58c5f8" target="_blank">https://github.com/C-Pro/fe/commit/adb4d98240eeaf250543d2350a5d3c71fb58c5f8</a><br></div>to return list, and changed version to automatically pull new version as an app dependency on deployment.<br><br>All existing tests pass.<br><br>It would be perfect if you could review changes, because I think tere is misunderstanding of extended protocol between pgpool2 and py-postgresql.<br><br>With best regards, Sergey Melekhin</div><div><br></div>
</div>