Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Server crashes when executing "SELECT approx_count_distinct(a), approx_count_distinct(b) FROM t;" #567

Open
2 tasks
saygoodbyye opened this issue Jan 30, 2025 · 2 comments
Assignees

Comments

@saygoodbyye
Copy link

saygoodbyye commented Jan 30, 2025

What happens?

Server crashes when executing the script below
PostgreSQL build:

CFLAGS='-Og' ./configure --enable-tap-tests --with-openssl --enable-debug --enable-cassert --with-icu --with-lz4 --with-libxml

To Reproduce

Sometimes you need to reproduce this sql-scripts several time to reproduce segfault.

SELECT duckdb.install_extension('aws');
SELECT duckdb.install_extension('postgres');
CREATE TABLE table_missing_attrs(id int);
INSERT INTO table_missing_attrs VALUES (1);
DROP TABLE table_missing_attrs;
CREATE TABLE t (a int, b text);
INSERT INTO t VALUES (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e');
INSERT INTO t VALUES (2, 'f'), (3, 'g'), (4, 'h');
SELECT approx_count_distinct(a), approx_count_distinct(b) FROM t; --server crashes here

backtrace:

#0  0x00007f67705dd135 in duckdb::CatalogEntry::~CatalogEntry() () from /tmp/pgsql/lib/libduckdb.so
#1  0x00007f6774f9ea89 in pgduckdb::PostgresTable::~PostgresTable (this=0x55b610cd0df0, __in_chrg=<optimized out>) at src/catalog/pgduckdb_table.cpp:25
#2  0x00007f6774fa176e in std::default_delete<pgduckdb::PostgresTable>::operator() (__ptr=<optimized out>, this=<optimized out>) at /usr/include/c++/12/bits/unique_ptr.h:89
#3  std::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable> >::~unique_ptr (this=0x55b610cd1e18, __in_chrg=<optimized out>)
    at /usr/include/c++/12/bits/unique_ptr.h:396
#4  duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true>::~unique_ptr (this=0x55b610cd1e18, __in_chrg=<optimized out>)
    at third_party/duckdb/src/include/duckdb/common/unique_ptr.hpp:13
#5  std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> >::~pair (this=0x55b610cd1df8, __in_chrg=<optimized out>) at /usr/include/c++/12/bits/stl_pair.h:185
#6  std::__new_allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> >, true> >::destroy<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> > > (__p=0x55b610cd1df8, this=<optimized out>)
    at /usr/include/c++/12/bits/new_allocator.h:181
#7  std::allocator_traits<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> >, true> > >::destroy<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> > > (__p=0x55b610cd1df8, __a=...)
    at /usr/include/c++/12/bits/alloc_traits.h:535
#8  std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> >, true> > >::_M_deallocate_node (this=0x55b610b73c60, __n=0x55b610cd1df0)
    at /usr/include/c++/12/bits/hashtable_policy.h:1984
#9  std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> >, true> > >::_M_deallocate_nodes (__n=0x0, this=0x55b610b73c60)
    at /usr/include/c++/12/bits/hashtable_policy.h:2006
#10 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> > >, std::__detail::_Select1st, duckdb::CaseInsensitiveStringEquality, duckdb::CaseInsensitiveStringHashFunction, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::clear (this=0x55b610b73c60) at /usr/include/c++/12/bits/hashtable.h:2500
#11 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> > >, std::__detail::_Select1st, duckdb::CaseInsensitiveStringEquality, duckdb::CaseInsensitiveStringHashFunction, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::~_Hashtable (this=0x55b610b73c60, __in_chrg=<optimized out>) at /usr/include/c++/12/bits/hashtable.h:1584
#12 std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true>, duckdb::CaseInsensitiveStringHashFunction, duckdb::CaseInsensitiveStringEquality, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, duckdb::unique_ptr<pgduckdb::PostgresTable, std::default_delete<pgduckdb::PostgresTable>, true> > > >::~unordered_map (this=0x55b610b73c60,
    __in_chrg=<optimized out>) at /usr/include/c++/12/bits/unordered_map.h:102
#13 pgduckdb::SchemaItems::~SchemaItems (this=0x55b610b73c38, __in_chrg=<optimized out>) at include/pgduckdb/catalog/pgduckdb_transaction.hpp:18
#14 std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems>::~pair (this=0x55b610b73c18, __in_chrg=<optimized out>)
    at /usr/include/c++/12/bits/stl_pair.h:185
#15 std::__new_allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems>, true> >::destroy<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems> > (__p=0x55b610b73c18, this=<optimized out>)
--Type <RET> for more, q to quit, c to continue without paging--
    at /usr/include/c++/12/bits/new_allocator.h:181
#16 std::allocator_traits<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems>, true> > >::destroy<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems> > (__p=0x55b610b73c18, __a=...)
    at /usr/include/c++/12/bits/alloc_traits.h:535
#17 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems>, true> > >::_M_deallocate_node (this=0x55b610baf648, __n=0x55b610b73c10) at /usr/include/c++/12/bits/hashtable_policy.h:1984
#18 std::__detail::_Hashtable_alloc<std::allocator<std::__detail::_Hash_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems>, true> > >::_M_deallocate_nodes (__n=0x0, this=0x55b610baf648) at /usr/include/c++/12/bits/hashtable_policy.h:2006
#19 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems> >, std::__detail::_Select1st, duckdb::CaseInsensitiveStringEquality, duckdb::CaseInsensitiveStringHashFunction, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::clear (this=0x55b610baf648) at /usr/include/c++/12/bits/hashtable.h:2500
#20 0x00007f6774f9fe19 in std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, pgduckdb::SchemaItems, duckdb::CaseInsensitiveStringHashFunction, duckdb::CaseInsensitiveStringEquality, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, pgduckdb::SchemaItems> > >::clear (this=<optimized out>) at /usr/include/c++/12/bits/unordered_map.h:791
#21 pgduckdb::PostgresContextState::QueryEnd (this=<optimized out>) at src/catalog/pgduckdb_transaction.cpp:82
#22 pgduckdb::ClosePostgresRelations (context=...) at src/catalog/pgduckdb_transaction.cpp:19
#23 0x00007f6774fa2f70 in pgduckdb::PostgresTransactionManager::CommitTransaction (this=0x55b610b0b950, context=..., transaction=...)
    at src/catalog/pgduckdb_transaction_manager.cpp:29
#24 0x00007f6770e5576d in duckdb::MetaTransaction::Commit() () from /tmp/pgsql/lib/libduckdb.so
#25 0x00007f6770e55bb3 in duckdb::TransactionContext::Commit() () from /tmp/pgsql/lib/libduckdb.so
#26 0x00007f6770caf9c8 in duckdb::ClientContext::PrepareInternal(duckdb::ClientContextLock&, duckdb::unique_ptr<duckdb::SQLStatement, std::default_delete<duckdb::SQLStatement>, true>) () from /tmp/pgsql/lib/libduckdb.so
#27 0x00007f6770cca683 in duckdb::ClientContext::Prepare(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /tmp/pgsql/lib/libduckdb.so
#28 0x00007f6774f940a4 in DuckdbPrepare (query=<optimized out>) at /usr/include/c++/12/bits/basic_string.tcc:238
#29 0x00007f6774f8bd5f in Duckdb_BeginCustomScan_Cpp (cscanstate=0x55b610b37b10, estate=0x55b610b378c0) at src/pgduckdb_node.cpp:76
#30 0x00007f6774f8d57b in pgduckdb::__CPPFunctionGuard__<void (*)(CustomScanState*, EState*, int), &(Duckdb_BeginCustomScan_Cpp(CustomScanState*, EState*, int)), CustomScanState*, EState*, int> (func_name=0x7f6774fc3e19 "Duckdb_BeginCustomScan") at src/pgduckdb_node.cpp:94
#31 0x000055b60e3a397e in ExecInitCustomScan (cscan=cscan@entry=0x55b610834090, estate=estate@entry=0x55b610b378c0, eflags=eflags@entry=32) at nodeCustom.c:108
#32 0x000055b60e390529 in ExecInitNode (node=node@entry=0x55b610834090, estate=estate@entry=0x55b610b378c0, eflags=eflags@entry=32) at execProcnode.c:290
#33 0x000055b60e3898ee in InitPlan (queryDesc=queryDesc@entry=0x55b610b344a0, eflags=eflags@entry=32) at execMain.c:960
#34 0x000055b60e389ad6 in standard_ExecutorStart (queryDesc=0x55b610b344a0, eflags=32) at execMain.c:261
#35 0x00007f6774f8afef in DuckdbExecutorStartHook (queryDesc=0x55b610b344a0, eflags=0) at src/pgduckdb_hooks.cpp:303
#36 0x000055b60e389c1c in ExecutorStart (queryDesc=queryDesc@entry=0x55b610b344a0, eflags=0) at execMain.c:135
#37 0x000055b60e55c923 in PortalStart (portal=portal@entry=0x55b6108beea0, params=params@entry=0x0, eflags=eflags@entry=0, snapshot=snapshot@entry=0x0) at pquery.c:517
#38 0x000055b60e55955d in exec_simple_query (query_string=query_string@entry=0x55b610832390 "SELECT approx_count_distinct(a), approx_count_distinct(b) FROM t;") at postgres.c:1239
#39 0x000055b60e55b426 in PostgresMain (dbname=<optimized out>, username=<optimized out>) at postgres.c:4767
#40 0x000055b60e554f13 in BackendMain (startup_data=<optimized out>, startup_data_len=<optimized out>) at backend_startup.c:105
#41 0x000055b60e4b6a12 in postmaster_child_launch (child_type=child_type@entry=B_BACKEND, startup_data=startup_data@entry=0x7ffde32a7f0c "",
    startup_data_len=startup_data_len@entry=4, client_sock=client_sock@entry=0x7ffde32a7f40) at launch_backend.c:277
#42 0x000055b60e4bae7d in BackendStartup (client_sock=client_sock@entry=0x7ffde32a7f40) at postmaster.c:3594
#43 0x000055b60e4bb0c8 in ServerLoop () at postmaster.c:1676
#44 0x000055b60e4bc725 in PostmasterMain (argc=argc@entry=3, argv=argv@entry=0x55b6107ecb20) at postmaster.c:1374
#45 0x000055b60e3e47d8 in main (argc=3, argv=0x55b6107ecb20) at main.c:199

OS:

debian-12 x86_64

pg_duckdb Version (if built from source use commit hash):

769c256

Postgres Version (if built from source use commit hash):

REL_17_STABLE (f4af4515bb5f3591d49bc16b6cb8ddbf66f98374)

Hardware:

No response

Full Name:

Egor Chindyaskin

Affiliation:

Postgres Professional

What is the latest build you tested with? If possible, we recommend testing with the latest nightly build.

I have tested with a source build

Did you include all relevant data sets for reproducing the issue?

Yes

Did you include all code required to reproduce the issue?

  • Yes, I have

Did you include all relevant configuration (e.g., CPU architecture, Linux distribution) to reproduce the issue?

  • Yes, I have
@Y--
Copy link
Collaborator

Y-- commented Jan 30, 2025

Hi @saygoodbyye! Thanks for reporting. I will have a look at it asap.

@Y-- Y-- self-assigned this Jan 30, 2025
@saygoodbyye
Copy link
Author

@Y--, by the way, I also get warnings when building

In file included from /tmp/pgsql/include/server/postgres.h:46,
                 from src/pgduckdb_ddl.cpp:5:
src/pgduckdb_ddl.cpp: In function ‘void CheckOnCommitSupport(OnCommitAction)’:
/tmp/pgsql/include/server/utils/elog.h:150:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
  150 |         } while(0)
      |         ^
/tmp/pgsql/include/server/utils/elog.h:164:9: note: in expansion of macro ‘ereport_domain’
  164 |         ereport_domain(elevel, TEXTDOMAIN, __VA_ARGS__)
      |         ^~~~~~~~~~~~~~
/tmp/pgsql/include/server/utils/elog.h:240:9: note: in expansion of macro ‘ereport’
  240 |         ereport(elevel, errmsg_internal(__VA_ARGS__))
      |         ^~~~~~~
src/pgduckdb_ddl.cpp:295:17: note: in expansion of macro ‘elog’
  295 |                 elog(ERROR, "DuckDB does not support ON COMMIT DROP");
      |                 ^~~~
src/pgduckdb_ddl.cpp:296:9: note: here
  296 |         default:
      |         ^~~~~~~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants