Skip to content

PR #1199

PR #1199 #1921

GitHub Actions / Test Results - 3.10 failed Jan 10, 2025 in 0s

1 fail, 36 skipped, 62 pass in 17s

99 tests  ±0   62 ✅ ±0   17s ⏱️ ±0s
 1 suites ±0   36 💤 ±0 
 1 files   ±0    1 ❌ ±0 

Results for commit 434eaf4. ± Comparison against earlier commit 460c169.

Annotations

Check warning on line 0 in duckdb_engine.tests.test_datatypes

See this annotation in the file changed.

@github-actions github-actions / Test Results - 3.10

test_double_nested_types (duckdb_engine.tests.test_datatypes) failed

results.xml [took 0s]
Raw output
sqlalchemy.exc.ProgrammingError: (duckdb.duckdb.ParserException) Parser Error: syntax error at or near "outer"
[SQL: 
CREATE TABLE test_struct (
	id INTEGER NOT NULL, 
	outer STRUCT("inner" STRUCT("val" INTEGER)), 
	PRIMARY KEY (id)
)

]
(Background on this error at: https://sqlalche.me/e/20/f405)
self = <sqlalchemy.engine.base.Connection object at 0x7fc495b8f910>
dialect = <duckdb_engine.Dialect object at 0x7fc497f06710>
context = <sqlalchemy.dialects.postgresql.psycopg2.PGExecutionContext_psycopg2 object at 0x7fc495b8e1a0>
statement = <sqlalchemy.dialects.postgresql.base.PGDDLCompiler object at 0x7fc495b8f640>
parameters = [()]

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92m_exec_single_context#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        dialect: Dialect,#x1B[90m#x1B[39;49;00m
        context: ExecutionContext,#x1B[90m#x1B[39;49;00m
        statement: Union[#x1B[96mstr#x1B[39;49;00m, Compiled],#x1B[90m#x1B[39;49;00m
        parameters: Optional[_AnyMultiExecuteParams],#x1B[90m#x1B[39;49;00m
    ) -> CursorResult[Any]:#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""continue the _execute_context() method for a single DBAPI#x1B[39;49;00m
    #x1B[33m    cursor.execute() or cursor.executemany() call.#x1B[39;49;00m
    #x1B[33m#x1B[39;49;00m
    #x1B[33m    """#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m dialect.bind_typing #x1B[95mis#x1B[39;49;00m BindTyping.SETINPUTSIZES:#x1B[90m#x1B[39;49;00m
            generic_setinputsizes = context._prepare_set_input_sizes()#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m generic_setinputsizes:#x1B[90m#x1B[39;49;00m
                #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                    dialect.do_set_input_sizes(#x1B[90m#x1B[39;49;00m
                        context.cursor, generic_setinputsizes, context#x1B[90m#x1B[39;49;00m
                    )#x1B[90m#x1B[39;49;00m
                #x1B[94mexcept#x1B[39;49;00m #x1B[96mBaseException#x1B[39;49;00m #x1B[94mas#x1B[39;49;00m e:#x1B[90m#x1B[39;49;00m
                    #x1B[96mself#x1B[39;49;00m._handle_dbapi_exception(#x1B[90m#x1B[39;49;00m
                        e, #x1B[96mstr#x1B[39;49;00m(statement), parameters, #x1B[94mNone#x1B[39;49;00m, context#x1B[90m#x1B[39;49;00m
                    )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        cursor, str_statement, parameters = (#x1B[90m#x1B[39;49;00m
            context.cursor,#x1B[90m#x1B[39;49;00m
            context.statement,#x1B[90m#x1B[39;49;00m
            context.parameters,#x1B[90m#x1B[39;49;00m
        )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        effective_parameters: Optional[_AnyExecuteParams]#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m context.executemany:#x1B[90m#x1B[39;49;00m
            effective_parameters = parameters[#x1B[94m0#x1B[39;49;00m]#x1B[90m#x1B[39;49;00m
        #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            effective_parameters = parameters#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._has_events #x1B[95mor#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.engine._has_events:#x1B[90m#x1B[39;49;00m
            #x1B[94mfor#x1B[39;49;00m fn #x1B[95min#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.dispatch.before_cursor_execute:#x1B[90m#x1B[39;49;00m
                str_statement, effective_parameters = fn(#x1B[90m#x1B[39;49;00m
                    #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                    cursor,#x1B[90m#x1B[39;49;00m
                    str_statement,#x1B[90m#x1B[39;49;00m
                    effective_parameters,#x1B[90m#x1B[39;49;00m
                    context,#x1B[90m#x1B[39;49;00m
                    context.executemany,#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._echo:#x1B[90m#x1B[39;49;00m
            #x1B[96mself#x1B[39;49;00m._log_info(str_statement)#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            stats = context._get_cache_stats()#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.engine.hide_parameters:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m._log_info(#x1B[90m#x1B[39;49;00m
                    #x1B[33m"#x1B[39;49;00m#x1B[33m[#x1B[39;49;00m#x1B[33m%s#x1B[39;49;00m#x1B[33m] #x1B[39;49;00m#x1B[33m%r#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                    stats,#x1B[90m#x1B[39;49;00m
                    sql_util._repr_params(#x1B[90m#x1B[39;49;00m
                        effective_parameters,#x1B[90m#x1B[39;49;00m
                        batches=#x1B[94m10#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                        ismulti=context.executemany,#x1B[90m#x1B[39;49;00m
                    ),#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
            #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m._log_info(#x1B[90m#x1B[39;49;00m
                    #x1B[33m"#x1B[39;49;00m#x1B[33m[#x1B[39;49;00m#x1B[33m%s#x1B[39;49;00m#x1B[33m] [SQL parameters hidden due to hide_parameters=True]#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                    stats,#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        evt_handled: #x1B[96mbool#x1B[39;49;00m = #x1B[94mFalse#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m context.execute_style #x1B[95mis#x1B[39;49;00m ExecuteStyle.EXECUTEMANY:#x1B[90m#x1B[39;49;00m
                effective_parameters = cast(#x1B[90m#x1B[39;49;00m
                    #x1B[33m"#x1B[39;49;00m#x1B[33m_CoreMultiExecuteParams#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, effective_parameters#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.dialect._has_events:#x1B[90m#x1B[39;49;00m
                    #x1B[94mfor#x1B[39;49;00m fn #x1B[95min#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.dialect.dispatch.do_executemany:#x1B[90m#x1B[39;49;00m
                        #x1B[94mif#x1B[39;49;00m fn(#x1B[90m#x1B[39;49;00m
                            cursor,#x1B[90m#x1B[39;49;00m
                            str_statement,#x1B[90m#x1B[39;49;00m
                            effective_parameters,#x1B[90m#x1B[39;49;00m
                            context,#x1B[90m#x1B[39;49;00m
                        ):#x1B[90m#x1B[39;49;00m
                            evt_handled = #x1B[94mTrue#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                            #x1B[94mbreak#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m evt_handled:#x1B[90m#x1B[39;49;00m
                    #x1B[96mself#x1B[39;49;00m.dialect.do_executemany(#x1B[90m#x1B[39;49;00m
                        cursor,#x1B[90m#x1B[39;49;00m
                        str_statement,#x1B[90m#x1B[39;49;00m
                        effective_parameters,#x1B[90m#x1B[39;49;00m
                        context,#x1B[90m#x1B[39;49;00m
                    )#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m effective_parameters #x1B[95mand#x1B[39;49;00m context.no_parameters:#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.dialect._has_events:#x1B[90m#x1B[39;49;00m
                    #x1B[94mfor#x1B[39;49;00m fn #x1B[95min#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.dialect.dispatch.do_execute_no_params:#x1B[90m#x1B[39;49;00m
                        #x1B[94mif#x1B[39;49;00m fn(cursor, str_statement, context):#x1B[90m#x1B[39;49;00m
                            evt_handled = #x1B[94mTrue#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                            #x1B[94mbreak#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m evt_handled:#x1B[90m#x1B[39;49;00m
                    #x1B[96mself#x1B[39;49;00m.dialect.do_execute_no_params(#x1B[90m#x1B[39;49;00m
                        cursor, str_statement, context#x1B[90m#x1B[39;49;00m
                    )#x1B[90m#x1B[39;49;00m
            #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                effective_parameters = cast(#x1B[90m#x1B[39;49;00m
                    #x1B[33m"#x1B[39;49;00m#x1B[33m_CoreSingleExecuteParams#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, effective_parameters#x1B[90m#x1B[39;49;00m
                )#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.dialect._has_events:#x1B[90m#x1B[39;49;00m
                    #x1B[94mfor#x1B[39;49;00m fn #x1B[95min#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.dialect.dispatch.do_execute:#x1B[90m#x1B[39;49;00m
                        #x1B[94mif#x1B[39;49;00m fn(#x1B[90m#x1B[39;49;00m
                            cursor,#x1B[90m#x1B[39;49;00m
                            str_statement,#x1B[90m#x1B[39;49;00m
                            effective_parameters,#x1B[90m#x1B[39;49;00m
                            context,#x1B[90m#x1B[39;49;00m
                        ):#x1B[90m#x1B[39;49;00m
                            evt_handled = #x1B[94mTrue#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                            #x1B[94mbreak#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[94mif#x1B[39;49;00m #x1B[95mnot#x1B[39;49;00m evt_handled:#x1B[90m#x1B[39;49;00m
>                   #x1B[96mself#x1B[39;49;00m.dialect.do_execute(#x1B[90m#x1B[39;49;00m
                        cursor, str_statement, effective_parameters, context#x1B[90m#x1B[39;49;00m
                    )#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/base.py#x1B[0m:1967: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/default.py#x1B[0m:941: in do_execute
    #x1B[0mcursor.execute(statement, parameters)#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <duckdb_engine.CursorWrapper object at 0x7fc495b8fcd0>
statement = '\nCREATE TABLE test_struct (\n\tid INTEGER NOT NULL, \n\touter STRUCT("inner" STRUCT("val" INTEGER)), \n\tPRIMARY KEY (id)\n)\n\n'
parameters = (), context = None

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92mexecute#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        statement: #x1B[96mstr#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        parameters: Optional[Tuple] = #x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        context: Optional[Any] = #x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
    ) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m statement.lower() == #x1B[33m"#x1B[39;49;00m#x1B[33mcommit#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m:  #x1B[90m# this is largely for ipython-sql#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m.__c.commit()#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m statement.lower() #x1B[95min#x1B[39;49;00m (#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mregister#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mregister(?, ?)#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mregister($1, $2)#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
            ):#x1B[90m#x1B[39;49;00m
                #x1B[94massert#x1B[39;49;00m parameters #x1B[95mand#x1B[39;49;00m #x1B[96mlen#x1B[39;49;00m(parameters) == #x1B[94m2#x1B[39;49;00m, parameters#x1B[90m#x1B[39;49;00m
                view_name, df = parameters#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m.__c.register(view_name, df)#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m parameters #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m.__c.execute(statement)#x1B[90m#x1B[39;49;00m
            #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>               #x1B[96mself#x1B[39;49;00m.__c.execute(statement, parameters)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               duckdb.duckdb.ParserException: Parser Error: syntax error at or near "outer"#x1B[0m

#x1B[1m#x1B[31mduckdb_engine/__init__.py#x1B[0m:150: ParserException

#x1B[33mThe above exception was the direct cause of the following exception:#x1B[0m

engine = Engine(duckdb:///:memory:)
session = <sqlalchemy.orm.session.Session object at 0x7fc494090700>

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92mtest_double_nested_types#x1B[39;49;00m(engine: Engine, session: Session) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
    #x1B[90m    #x1B[39;49;00m#x1B[33m"""Test for https://github.com/Mause/duckdb_engine/issues/1138"""#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        importorskip(#x1B[33m"#x1B[39;49;00m#x1B[33mduckdb#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33m0.5.0#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)  #x1B[90m# nested types require at least duckdb 0.5.0#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        base = declarative_base()#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        #x1B[94mclass#x1B[39;49;00m #x1B[04m#x1B[92mEntry#x1B[39;49;00m(base):#x1B[90m#x1B[39;49;00m
            __tablename__ = #x1B[33m"#x1B[39;49;00m#x1B[33mtest_struct#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
            #x1B[96mid#x1B[39;49;00m = Column(Integer, primary_key=#x1B[94mTrue#x1B[39;49;00m, default=#x1B[94m0#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
            outer = Column(Struct({#x1B[33m"#x1B[39;49;00m#x1B[33minner#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m: Struct({#x1B[33m"#x1B[39;49;00m#x1B[33mval#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m: Integer})}))#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>       base.metadata.create_all(bind=engine)#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31mduckdb_engine/tests/test_datatypes.py#x1B[0m:225: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/sql/schema.py#x1B[0m:5868: in create_all
    #x1B[0mbind._run_ddl_visitor(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/base.py#x1B[0m:3253: in _run_ddl_visitor
    #x1B[0mconn._run_ddl_visitor(visitorcallable, element, **kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/base.py#x1B[0m:2459: in _run_ddl_visitor
    #x1B[0mvisitorcallable(#x1B[96mself#x1B[39;49;00m.dialect, #x1B[96mself#x1B[39;49;00m, **kwargs).traverse_single(element)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/sql/visitors.py#x1B[0m:664: in traverse_single
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m meth(obj, **kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/sql/ddl.py#x1B[0m:918: in visit_metadata
    #x1B[0m#x1B[96mself#x1B[39;49;00m.traverse_single(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/sql/visitors.py#x1B[0m:664: in traverse_single
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m meth(obj, **kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/sql/ddl.py#x1B[0m:956: in visit_table
    #x1B[0m)._invoke_with(#x1B[96mself#x1B[39;49;00m.connection)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/sql/ddl.py#x1B[0m:314: in _invoke_with
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m bind.execute(#x1B[96mself#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/base.py#x1B[0m:1418: in execute
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m meth(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/sql/ddl.py#x1B[0m:180: in _execute_on_connection
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m connection._execute_ddl(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/base.py#x1B[0m:1529: in _execute_ddl
    #x1B[0mret = #x1B[96mself#x1B[39;49;00m._execute_context(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/base.py#x1B[0m:1846: in _execute_context
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._exec_single_context(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/base.py#x1B[0m:1986: in _exec_single_context
    #x1B[0m#x1B[96mself#x1B[39;49;00m._handle_dbapi_exception(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/base.py#x1B[0m:2355: in _handle_dbapi_exception
    #x1B[0m#x1B[94mraise#x1B[39;49;00m sqlalchemy_exception.with_traceback(exc_info[#x1B[94m2#x1B[39;49;00m]) #x1B[94mfrom#x1B[39;49;00m #x1B[04m#x1B[96me#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/base.py#x1B[0m:1967: in _exec_single_context
    #x1B[0m#x1B[96mself#x1B[39;49;00m.dialect.do_execute(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m.nox/tests-3-10-sqlalchemy-2-0-35-duckdb-1-0-0/lib/python3.10/site-packages/sqlalchemy/engine/default.py#x1B[0m:941: in do_execute
    #x1B[0mcursor.execute(statement, parameters)#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <duckdb_engine.CursorWrapper object at 0x7fc495b8fcd0>
statement = '\nCREATE TABLE test_struct (\n\tid INTEGER NOT NULL, \n\touter STRUCT("inner" STRUCT("val" INTEGER)), \n\tPRIMARY KEY (id)\n)\n\n'
parameters = (), context = None

    #x1B[0m#x1B[94mdef#x1B[39;49;00m #x1B[92mexecute#x1B[39;49;00m(#x1B[90m#x1B[39;49;00m
        #x1B[96mself#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        statement: #x1B[96mstr#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        parameters: Optional[Tuple] = #x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
        context: Optional[Any] = #x1B[94mNone#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
    ) -> #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m statement.lower() == #x1B[33m"#x1B[39;49;00m#x1B[33mcommit#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m:  #x1B[90m# this is largely for ipython-sql#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m.__c.commit()#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m statement.lower() #x1B[95min#x1B[39;49;00m (#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mregister#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mregister(?, ?)#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
                #x1B[33m"#x1B[39;49;00m#x1B[33mregister($1, $2)#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m,#x1B[90m#x1B[39;49;00m
            ):#x1B[90m#x1B[39;49;00m
                #x1B[94massert#x1B[39;49;00m parameters #x1B[95mand#x1B[39;49;00m #x1B[96mlen#x1B[39;49;00m(parameters) == #x1B[94m2#x1B[39;49;00m, parameters#x1B[90m#x1B[39;49;00m
                view_name, df = parameters#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m.__c.register(view_name, df)#x1B[90m#x1B[39;49;00m
            #x1B[94melif#x1B[39;49;00m parameters #x1B[95mis#x1B[39;49;00m #x1B[94mNone#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
                #x1B[96mself#x1B[39;49;00m.__c.execute(statement)#x1B[90m#x1B[39;49;00m
            #x1B[94melse#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
>               #x1B[96mself#x1B[39;49;00m.__c.execute(statement, parameters)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               sqlalchemy.exc.ProgrammingError: (duckdb.duckdb.ParserException) Parser Error: syntax error at or near "outer"#x1B[0m
#x1B[1m#x1B[31mE               [SQL: #x1B[0m
#x1B[1m#x1B[31mE               CREATE TABLE test_struct (#x1B[0m
#x1B[1m#x1B[31mE               	id INTEGER NOT NULL, #x1B[0m
#x1B[1m#x1B[31mE               	outer STRUCT("inner" STRUCT("val" INTEGER)), #x1B[0m
#x1B[1m#x1B[31mE               	PRIMARY KEY (id)#x1B[0m
#x1B[1m#x1B[31mE               )#x1B[0m
#x1B[1m#x1B[31mE               #x1B[0m
#x1B[1m#x1B[31mE               ]#x1B[0m
#x1B[1m#x1B[31mE               (Background on this error at: https://sqlalche.me/e/20/f405)#x1B[0m

#x1B[1m#x1B[31mduckdb_engine/__init__.py#x1B[0m:150: ProgrammingError