BUG #16752: ODBC driver makes the input SQL query invalid

From: PG Bug reporting form <noreply(at)postgresql(dot)org>
To: pgsql-bugs(at)lists(dot)postgresql(dot)org
Cc: bogdan(dot)gureev(at)gmail(dot)com
Subject: BUG #16752: ODBC driver makes the input SQL query invalid
Date: 2020-11-30 09:09:51
Message-ID: 16752-8b1c831fd94a7d3f@postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 16752
Logged by: Bogdan Gureev
Email address: bogdan(dot)gureev(at)gmail(dot)com
PostgreSQL version: 13.0
Operating system: Windows 10 x64
Description:

The driver makes the input SQL SELECT query invalid when the concurrency
mode is set to SQL_CONCUR_LOCK and FOR UPDATE is unused:
==========
Case #1:
SELECT * FROM bogu_unique_column FOR UPDATE

ODBC logs:
[0.126]PQsendQuery: 000002452083F2E0 'PREPARE
"_KEYSET_0000024520867A70"(tid,tid) as SELECT * , "ctid" FROM
bogu_unique_column FOR UPDATE where ctid in ($1,$2)'
[0.127] (ERROR) 42601 'syntax error at or near "where"'

Expected:
The query is modified without syntax error
==========
Case #2:
SELECT table_for_update.col_integer FROM table_for_update FOR UPDATE

ODBC logs:
[0.162]PQsendQuery: 000002524D530790 'SELECT table_for_update.col_integer ,
"ctid", "oid" FROM table_for_update FOR UPDATE where ctid = '(0,0)';select
"ctid", "oid" from table_for_update FOR UPDATE'
[0.163] (ERROR) 42601 'syntax error at or near "where"'

Expected:
The query is modified without syntax error
==========
The exact set of attributes that are set from the source code (in the
following order):

SQLSetEnvAttr( environment, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER*)SQL_OV_ODBC3, 0 );

SQLSetConnectAttr( connection, SQL_ATTR_ASYNC_ENABLE, SQL_ASYNC_ENABLE_OFF,
SQL_IS_INTEGER );
SQLSetConnectAttr( connection, SQL_ATTR_CONNECTION_TIMEOUT, (SQLPOINTER)0,
SQL_IS_INTEGER );
SQLSetConnectAttr( connection, SQL_LOGIN_TIMEOUT, (SQLPOINTER)0,
SQL_IS_INTEGER );
SQLSetConnectAttr( connection, SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)SQL_AUTOCOMMIT_ON, SQL_IS_INTEGER );

SQLSetStmtAttr( statement, SQL_ATTR_ASYNC_ENABLE, SQL_ASYNC_ENABLE_OFF,
SQL_IS_INTEGER );
SQLSetStmtAttr( statement, SQL_ATTR_CURSOR_TYPE,
(SQLPOINTER)SQL_CURSOR_DYNAMIC, SQL_IS_INTEGER );
SQLSetStmtAttr( statement, SQL_ATTR_CONCURRENCY,
(SQLPOINTER)SQL_CONCUR_LOCK, SQL_IS_INTEGER );
SQLSetStmtAttr( statement, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER)0,
SQL_IS_INTEGER );
==========
DDL for tables extracted from DBeaver:
CREATE TABLE public.bogu_unique_column (
c int4 NULL,
CONSTRAINT bogu_unique_column_c_key UNIQUE (c)
);
CREATE TABLE public.table_for_update (
id int4 NULL,
col_integer int4 NULL,
col_decimal numeric(10,2) NULL,
col_char bpchar(20) NULL,
col_date date NULL
)
WITH (
OIDS=TRUE
);
==========
I have the ODBC logs and C++ minimized source code to reproduce this problem
if you need it.
==========
No error appears without the SQL_ATTR_CONCURRENCY attribute

Browse pgsql-bugs by date

  From Date Subject
Next Message Dave Page 2020-11-30 11:29:06 Re: [External] Re: pgadmin--pgagent---the process hang by unknow reasons
Previous Message EffiSYS / Martin Querleu 2020-11-30 09:04:30 Re: Update on