Merge branch 'fix-788' into maint_2_7

This commit is contained in:
Daniele Varrazzo 2018-10-30 01:47:09 +00:00
commit fcc4cd6734
3 changed files with 23 additions and 1 deletions

1
NEWS
View File

@ -8,6 +8,7 @@ What's new in psycopg 2.7.6
(:ticket:`#746`). (:ticket:`#746`).
- Fixed building on modern FreeBSD versions with Python 3.7 (:ticket:`#755`). - Fixed building on modern FreeBSD versions with Python 3.7 (:ticket:`#755`).
- Fixed hang trying to :sql:`COPY` via `~cursor.execute()` (:ticket:`#781`). - Fixed hang trying to :sql:`COPY` via `~cursor.execute()` (:ticket:`#781`).
- Fixed adaptation of arrays of empty arrays (:ticket:`#788`).
- Fixed segfault accessing the `connection.readonly` and - Fixed segfault accessing the `connection.readonly` and
`connection.deferrable` repeatedly (:ticket:`#790`). `connection.deferrable` repeatedly (:ticket:`#790`).
- `~psycopg2.extras.execute_values()` accepts `~psycopg2.sql.Composable` - `~psycopg2.extras.execute_values()` accepts `~psycopg2.sql.Composable`

View File

@ -55,6 +55,8 @@ list_quote(listObject *self)
/* empty arrays are converted to NULLs (still searching for a way to /* empty arrays are converted to NULLs (still searching for a way to
insert an empty array in postgresql */ insert an empty array in postgresql */
if (len == 0) { if (len == 0) {
/* it cannot be ARRAY[] because it would make empty lists unusable
* in any() without a cast. But we may convert it into ARRAY[] below */
res = Bytes_FromString("'{}'"); res = Bytes_FromString("'{}'");
goto exit; goto exit;
} }
@ -79,7 +81,19 @@ list_quote(listObject *self)
/* Lists of arrays containing only nulls are also not supported /* Lists of arrays containing only nulls are also not supported
* by the ARRAY construct so we should do some special casing */ * by the ARRAY construct so we should do some special casing */
if (!PyList_Check(wrapped) || Bytes_AS_STRING(qs[i])[0] == 'A') { if (PyList_Check(wrapped)) {
if (Bytes_AS_STRING(qs[i])[0] == 'A') {
all_nulls = 0;
}
else if (0 == strcmp(Bytes_AS_STRING(qs[i]), "'{}'")) {
/* case of issue #788: '{{}}' is not supported but
* array[array[]] is */
all_nulls = 0;
Py_CLEAR(qs[i]);
qs[i] = Bytes_FromString("ARRAY[]");
}
}
else {
all_nulls = 0; all_nulls = 0;
} }
} }

View File

@ -166,6 +166,13 @@ class TypesBasicTests(ConnectingTestCase):
curs.execute("select col from array_test where id = 2") curs.execute("select col from array_test where id = 2")
self.assertEqual(curs.fetchone()[0], []) self.assertEqual(curs.fetchone()[0], [])
@testutils.skip_before_postgres(8, 4)
def testNestedEmptyArray(self):
# issue #788
curs = self.conn.cursor()
curs.execute("select 10 = any(%s::int[])", ([[]], ))
self.assertFalse(curs.fetchone()[0])
def testEmptyArrayNoCast(self): def testEmptyArrayNoCast(self):
s = self.execute("SELECT '{}' AS foo") s = self.execute("SELECT '{}' AS foo")
self.assertEqual(s, '{}') self.assertEqual(s, '{}')