asyncpg
asyncpg copied to clipboard
text encoding of composite types error with schema and table name.
- asyncpg version: 0.23.0
- PostgreSQL version: 10.13
- Do you use a PostgreSQL SaaS? If so, which? Can you reproduce the issue with a local PostgreSQL install?: No. I ran PG on local machine.
- Python version: 3.8.2
- Platform: MacOs catalina 10.15.7
- Do you use pgbouncer?: No
- Did you install asyncpg with pip?: Yes
- If you built asyncpg locally, which version of Cython did you use?: No
- Can the issue be reproduced under both asyncio and uvloop?: Not tried
Hello!
I have table with ltree column:
create table product
(
product_id varchar(18) not null
constraint product_pkey
primary key,
category_path ltree
);
And trying execute this SQL query:
insert into product
(product_id, category_path)
(select r.product_id, r.category_path from unnest($1::product[]) as r)
Args:
[[{'category_path': 'A.B', 'product_id': '3912331'}]]
And i get this error:
File "/venv/lib/python3.8/site-packages/asyncpg/pool.py", line 530, in execute
return await con.execute(query, *args, timeout=timeout)
File "/venv/lib/python3.8/site-packages/asyncpg/connection.py", line 299, in execute
_, status, _ = await self._execute(
File "/venv/lib/python3.8/site-packages/asyncpg/connection.py", line 1623, in _execute
result, _ = await self.__execute(
File "/venv/lib/python3.8/site-packages/asyncpg/connection.py", line 1648, in __execute
return await self._do_execute(
File "/venv/lib/python3.8/site-packages/asyncpg/connection.py", line 1675, in _do_execute
stmt = await self._get_statement(
File "/venv/lib/python3.8/site-packages/asyncpg/connection.py", line 392, in _get_statement
settings.register_data_types(types)
File "asyncpg/protocol/settings.pyx", line 35, in asyncpg.protocol.protocol.ConnectionSettings.register_data_types
File "asyncpg/protocol/settings.pyx", line 36, in asyncpg.protocol.protocol.ConnectionSettings.register_data_types
File "asyncpg/protocol/codecs/base.pyx", line 506, in asyncpg.protocol.protocol.DataCodecConfig.add_types
File "asyncpg/protocol/codecs/base.pyx", line 371, in asyncpg.protocol.protocol.Codec.new_composite_codec
File "asyncpg/protocol/codecs/base.pyx", line 76, in asyncpg.protocol.protocol.Codec.init
asyncpg.exceptions._base.UnsupportedClientFeatureError: cannot decode type "public"."product": text encoding of composite types is not supported
But "public"."product" -- it's schema and table name.
If i create new table with category_path = text instead ltree, all ok.
This is because ltree doesn't support binary I/O, and asyncpg doesn't implement text I/O for composite types, so there isn't much we can do here unfortunately.