1 @message |
firebird.driver.types.DatabaseError: SQL error code = -104
-Datatypes are not comparable in expression
LOG DETAILS:
2025-06-26 17:29:28.674
2025-06-26 17:29:28.674 act = <firebird.qa.plugin.Action object at [hex]>
2025-06-26 17:29:28.674 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-06-26 17:29:28.674
2025-06-26 17:29:28.674 @pytest.mark.version('>=2.5')
2025-06-26 17:29:28.674 def test_1(act: Action, capsys):
2025-06-26 17:29:28.674 with act.db.connect() as con:
2025-06-26 17:29:28.674 con.execute_immediate(proc_ddl)
2025-06-26 17:29:28.674 con.commit()
2025-06-26 17:29:28.674 c = con.cursor()
2025-06-26 17:29:28.674 > for row in c.execute("select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )", [3]):
2025-06-26 17:29:28.674
2025-06-26 17:29:28.675 tests\bugs\core_6108_test.py:37:
2025-06-26 17:29:28.675 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-06-26 17:29:28.675
2025-06-26 17:29:28.675 self = <firebird.driver.core.Cursor object at [hex]>
2025-06-26 17:29:28.675 operation = "select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )"
2025-06-26 17:29:28.675 parameters = [3]
2025-06-26 17:29:28.675
2025-06-26 17:29:28.675 def execute(self, operation: Union[str, Statement], parameters: Sequence[Any]=None) -> Cursor:
2025-06-26 17:29:28.675 """Executes SQL command or prepared `Statement`.
2025-06-26 17:29:28.675
2025-06-26 17:29:28.675 Starts new transaction if transaction manager associated with cursor is not active.
2025-06-26 17:29:28.675
2025-06-26 17:29:28.675 Arguments:
2025-06-26 17:29:28.675 operation: SQL command or prepared `Statement`.
2025-06-26 17:29:28.675 parameters: Sequence of parameters. Must contain one entry for each argument
2025-06-26 17:29:28.675 that the operation expects.
2025-06-26 17:29:28.675
2025-06-26 17:29:28.675 Returns:
2025-06-26 17:29:28.675 `self` so call to execute could be used as iterator over returned rows.
2025-06-26 17:29:28.676
2025-06-26 17:29:28.676 Note:
2025-06-26 17:29:28.676 If `operation` is a string with SQL command that is exactly the same as the
2025-06-26 17:29:28.676 last executed command, the internally prepared `Statement` from last execution
2025-06-26 17:29:28.676 is reused.
2025-06-26 17:29:28.676
2025-06-26 17:29:28.676 If cursor is open, it's closed before new statement is executed.
2025-06-26 17:29:28.676 """
2025-06-26 17:29:28.676 > self._execute(operation, parameters)
2025-06-26 17:29:28.676
2025-06-26 17:29:28.676 C:\Python3x\Lib\site-packages\firebird\driver\core.py:3862:
2025-06-26 17:29:28.676 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-06-26 17:29:28.676
2025-06-26 17:29:28.676 self = <firebird.driver.core.Cursor object at [hex]>
2025-06-26 17:29:28.676 operation = "select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )"
2025-06-26 17:29:28.676 parameters = [3], flags = <CursorFlag.NONE: 0>
2025-06-26 17:29:28.676
2025-06-26 17:29:28.676 def _execute(self, operation: Union[str, Statement],
2025-06-26 17:29:28.676 parameters: Sequence=None, flags: CursorFlag=CursorFlag.NONE) -> None:
2025-06-26 17:29:28.676 if not self._transaction.is_active():
2025-06-26 17:29:28.677 self._transaction.begin()
2025-06-26 17:29:28.677 if isinstance(operation, Statement):
2025-06-26 17:29:28.677 if operation._connection() is not self._connection:
2025-06-26 17:29:28.677 raise InterfaceError('Cannot execute Statement that was created by different Connection.')
2025-06-26 17:29:28.677 self.close()
2025-06-26 17:29:28.677 self._stmt = operation
2025-06-26 17:29:28.677 self.__internal = False
2025-06-26 17:29:28.677 elif self._stmt is not None and self._stmt.sql == operation:
2025-06-26 17:29:28.677 # We should execute the same SQL string again
2025-06-26 17:29:28.677 self._clear()
2025-06-26 17:29:28.677 else:
2025-06-26 17:29:28.677 self.close()
2025-06-26 17:29:28.677 > self._stmt = self._connection._prepare(operation, self._transaction)
2025-06-26 17:29:28.677
2025-06-26 17:29:28.677 C:\Python3x\Lib\site-packages\firebird\driver\core.py:3732:
2025-06-26 17:29:28.677 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-06-26 17:29:28.677
2025-06-26 17:29:28.677 self = Connection[6383]
2025-06-26 17:29:28.677 sql = "select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )"
2025-06-26 17:29:28.677 tra = <firebird.driver.core.TransactionManager object at [hex]>
2025-06-26 17:29:28.678
2025-06-26 17:29:28.678 def _prepare(self, sql: str, tra: TransactionManager) -> Statement:
2025-06-26 17:29:28.678 if _commit := not tra.is_active():
2025-06-26 17:29:28.678 tra.begin()
2025-06-26 17:29:28.678 > stmt = self._att.prepare(tra._tra, sql, self.__sql_dialect)
2025-06-26 17:29:28.678
2025-06-26 17:29:28.678 C:\Python3x\Lib\site-packages\firebird\driver\core.py:1723:
2025-06-26 17:29:28.678 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-06-26 17:29:28.678
2025-06-26 17:29:28.678 self = <firebird.driver.interfaces.iAttachment_v3 object at [hex]>
2025-06-26 17:29:28.678 transaction = <firebird.driver.interfaces.iTransaction_v3 object at [hex]>
2025-06-26 17:29:28.678 stmt = "select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )"
2025-06-26 17:29:28.678 dialect = 3, flags = <PreparePrefetchFlag.METADATA: 71>
2025-06-26 17:29:28.678
2025-06-26 17:29:28.678 def prepare(self, transaction: iTransaction, stmt: str, dialect: int,
2025-06-26 17:29:28.678 flags: PreparePrefetchFlag = PreparePrefetchFlag.METADATA) -> iStatement:
2025-06-26 17:29:28.678 """Replaces `isc_dsql_prepare()`. Additional parameter flags makes it
2025-06-26 17:29:28.678 possible to control what information will be preloaded from engine at once
2025-06-26 17:29:28.678 (i.e. in single network packet for remote operation)."""
2025-06-26 17:29:28.679 b_stmt: bytes = stmt.encode(self.encoding)
2025-06-26 17:29:28.679 result = self.vtable.prepare(self, self.status, transaction, len(b_stmt), b_stmt,
2025-06-26 17:29:28.679 dialect, flags)
2025-06-26 17:29:28.679 > self._check()
2025-06-26 17:29:28.679
2025-06-26 17:29:28.679 C:\Python3x\Lib\site-packages\firebird\driver\interfaces.py:1139:
2025-06-26 17:29:28.679 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-06-26 17:29:28.679
2025-06-26 17:29:28.679 self = <firebird.driver.interfaces.iAttachment_v3 object at [hex]>
2025-06-26 17:29:28.679
2025-06-26 17:29:28.679 def _check(self) -> None:
2025-06-26 17:29:28.679 state = self.status.get_state()
2025-06-26 17:29:28.679 if StateFlag.ERRORS in state:
2025-06-26 17:29:28.679 > raise self.__report(DatabaseError, self.status.get_errors())
2025-06-26 17:29:28.679 E firebird.driver.types.DatabaseError: SQL error code = -104
2025-06-26 17:29:28.679 E -Datatypes are not comparable in expression
2025-06-26 17:29:28.679
2025-06-26 17:29:28.679 C:\Python3x\Lib\site-packages\firebird\driver\interfaces.py:113: DatabaseError
2025-06-26 17:29:28.679 ---------------------------- Captured stdout setup ----------------------------
2025-06-26 17:29:28.680 Creating db: localhost:H:\QA\temp\qa2024.tmp\fbqa\test_11215\test.fdb [page_size=None, sql_dialect=None, charset='NONE', user=SYSDBA, password=masterkey]
|
2 #text |
act = <firebird.qa.plugin.Action pytest object at [hex]>
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>
@pytest.mark.version('>=2.5')
def test_1(act: Action, capsys):
with act.db.connect() as con:
con.execute_immediate(proc_ddl)
con.commit()
c = con.cursor()
> for row in c.execute("select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )", [3]):
tests\bugs\core_6108_test.py:37:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.Cursor pytest object at [hex]>
operation = "select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )"
parameters = [3]
def execute(self, operation: Union[str, Statement], parameters: Sequence[Any]=None) -> Cursor:
"""Executes SQL command or prepared `Statement`.
Starts new transaction if transaction manager associated with cursor is not active.
Arguments:
operation: SQL command or prepared `Statement`.
parameters: Sequence of parameters. Must contain one entry for each argument
that the operation expects.
Returns:
`self` so call to execute could be used as iterator over returned rows.
Note:
If `operation` is a string with SQL command that is exactly the same as the
last executed command, the internally prepared `Statement` from last execution
is reused.
If cursor is open, it's closed before new statement is executed.
"""
> self._execute(operation, parameters)
C:\Python3x\Lib\site-packages\firebird\driver\core.py:3862:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.Cursor pytest object at [hex]>
operation = "select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )"
parameters = [3], flags = <CursorFlag.NONE: 0>
def _execute(self, operation: Union[str, Statement],
parameters: Sequence=None, flags: CursorFlag=CursorFlag.NONE) -> None:
if not self._transaction.is_active():
self._transaction.begin()
if isinstance(operation, Statement):
if operation._connection() is not self._connection:
raise InterfaceError('Cannot execute Statement that was created by different Connection.')
self.close()
self._stmt = operation
self.__internal = False
elif self._stmt is not None and self._stmt.sql == operation:
# We should execute the same SQL string again
self._clear()
else:
self.close()
> self._stmt = self._connection._prepare(operation, self._transaction)
C:\Python3x\Lib\site-packages\firebird\driver\core.py:3732:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = Connection[6383]
sql = "select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )"
tra = <firebird.driver.core.TransactionManager pytest object at [hex]>
def _prepare(self, sql: str, tra: TransactionManager) -> Statement:
if _commit := not tra.is_active():
tra.begin()
> stmt = self._att.prepare(tra._tra, sql, self.__sql_dialect)
C:\Python3x\Lib\site-packages\firebird\driver\core.py:1723:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.interfaces.iAttachment_v3 pytest object at [hex]>
transaction = <firebird.driver.interfaces.iTransaction_v3 pytest object at [hex]>
stmt = "select o_dts from test_proc('2019-'|| COALESCE( ?, 1) ||'-01' )"
dialect = 3, flags = <PreparePrefetchFlag.METADATA: 71>
def prepare(self, transaction: iTransaction, stmt: str, dialect: int,
flags: PreparePrefetchFlag = PreparePrefetchFlag.METADATA) -> iStatement:
"""Replaces `isc_dsql_prepare()`. Additional parameter flags makes it
possible to control what information will be preloaded from engine at once
(i.e. in single network packet for remote operation)."""
b_stmt: bytes = stmt.encode(self.encoding)
result = self.vtable.prepare(self, self.status, transaction, len(b_stmt), b_stmt,
dialect, flags)
> self._check()
C:\Python3x\Lib\site-packages\firebird\driver\interfaces.py:1139:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.interfaces.iAttachment_v3 pytest object at [hex]>
def _check(self) -> None:
state = self.status.get_state()
if StateFlag.ERRORS in state:
> raise self.__report(DatabaseError, self.status.get_errors())
E firebird.driver.types.DatabaseError: SQL error code = -104
E -Datatypes are not comparable in expression
C:\Python3x\Lib\site-packages\firebird\driver\interfaces.py:113: DatabaseError
|