Skip to content

unreachable code entered when SELECTing nested composite types and DOMAINs #1188

Open
@zacknewman

Description

@zacknewman

Execute the following transaction on a PostgreSQL database:

BEGIN;
    CREATE TYPE foo AS (x integer);
    CREATE DOMAIN bar AS foo NOT NULL;
    CREATE TYPE fizz AS (y bar);
    CREATE TABLE buzz(z fizz NOT NULL);
    INSERT INTO buzz VALUES (ROW(ROW(1)));
COMMIT;

Now compile and run the following Rust program:

#![expect(
    clippy::trait_duplication_in_bounds,
    reason = "can't fix since part of ToSql macro"
)]
use core::{
    net::{IpAddr, Ipv6Addr},
    time::Duration,
};
use postgres_types::{FromSql, ToSql};
use tokio::runtime::Builder;
use tokio_postgres::{
    config::{ChannelBinding, Config, LoadBalanceHosts, SslMode, TargetSessionAttrs},
    tls::NoTls,
    IsolationLevel,
};
#[derive(Debug, FromSql, ToSql)]
#[postgres(name = "foo")]
struct Foo {
    x: i32,
}
#[derive(FromSql)]
#[postgres(name = "bar")]
struct Bar(Foo);
#[derive(FromSql)]
#[postgres(name = "fizz")]
struct Fizz {
    y: Bar,
}
fn main() {
    Builder::new_current_thread()
        .enable_all()
        .build()
        .unwrap()
        .block_on(async {
            let mut config = Config::new();
            let c = config
                .application_name("bug")
                .channel_binding(ChannelBinding::Disable)
                .connect_timeout(Duration::from_secs(10))
                .dbname("example")
                .host("")
                .hostaddr(IpAddr::V6(Ipv6Addr::LOCALHOST))
                .keepalives(true)
                .keepalives_idle(Duration::from_secs(300))
                .load_balance_hosts(LoadBalanceHosts::Disable)
                .password(b"password")
                .port(5432)
                .ssl_mode(SslMode::Disable)
                .target_session_attrs(TargetSessionAttrs::Any)
                .user("example");
            let (mut client, con) = c.connect(NoTls).await.unwrap();
            tokio::spawn(async move {
                con.await.unwrap();
            });
            let txn = client
                .build_transaction()
                .isolation_level(IsolationLevel::Serializable)
                .read_only(true)
                .start()
                .await
                .unwrap();
            let stmt = txn
                .prepare_typed("SELECT z FROM buzz;", [].as_slice())
                .await
                .unwrap();
            let row = txn.query_one(&stmt, &[]).await.unwrap();
            // The `panic` occurs on the below line.
            let col1 = row.get::<'_, _, Fizz>(0);
            println!("{}", col1.y.0.x);
            txn.commit().await.unwrap();
        });
}
[zack@laptop bug]$ export RUST_BACKTRACE=full && cargo run
    Updating crates.io index
     Locking 98 packages to latest compatible versions
      Adding fallible-iterator v0.2.0 (latest: v0.3.0)
      Adding generic-array v0.14.7 (latest: v1.1.0)
      Adding hermit-abi v0.3.9 (latest: v0.4.0)
      Adding siphasher v0.3.11 (latest: v1.0.1)
      Adding wasi v0.11.0+wasi-snapshot-preview1 (latest: v0.13.3+wasi-0.2.2)
      Adding windows-sys v0.52.0 (latest: v0.59.0)
      Adding zerocopy v0.7.35 (latest: v0.8.10)
      Adding zerocopy-derive v0.7.35 (latest: v0.8.10)
   Compiling proc-macro2 v1.0.89
   Compiling unicode-ident v1.0.13
   Compiling libc v0.2.164
   Compiling typenum v1.17.0
   Compiling version_check v0.9.5
   Compiling cfg-if v1.0.0
   Compiling autocfg v1.4.0
   Compiling byteorder v1.5.0
   Compiling subtle v2.6.1
   Compiling tinyvec_macros v0.1.1
   Compiling bytes v1.8.0
   Compiling unicode-bidi v0.3.17
   Compiling unicode-properties v0.1.3
   Compiling tinyvec v1.8.0
   Compiling futures-sink v0.3.31
   Compiling pin-project-lite v0.2.15
   Compiling parking_lot_core v0.9.10
   Compiling futures-core v0.3.31
   Compiling cpufeatures v0.2.15
   Compiling memchr v2.7.4
   Compiling base64 v0.22.1
   Compiling smallvec v1.13.2
   Compiling generic-array v0.14.7
   Compiling fallible-iterator v0.2.0
   Compiling siphasher v0.3.11
   Compiling slab v0.4.9
   Compiling lock_api v0.4.12
   Compiling heck v0.5.0
   Compiling scopeguard v1.2.0
   Compiling phf_shared v0.11.2
   Compiling futures-task v0.3.31
   Compiling quote v1.0.37
   Compiling unicode-normalization v0.1.24
   Compiling pin-utils v0.1.0
   Compiling phf v0.11.2
   Compiling futures-channel v0.3.31
   Compiling log v0.4.22
   Compiling whoami v1.5.2
   Compiling getrandom v0.2.15
   Compiling socket2 v0.5.7
   Compiling mio v1.0.2
   Compiling syn v2.0.87
   Compiling rand_core v0.6.4
   Compiling percent-encoding v2.3.1
   Compiling tokio v1.41.1
   Compiling parking_lot v0.12.3
   Compiling stringprep v0.1.5
   Compiling crypto-common v0.1.6
   Compiling block-buffer v0.10.4
   Compiling digest v0.10.7
   Compiling md-5 v0.10.6
   Compiling sha2 v0.10.8
   Compiling hmac v0.12.1
   Compiling zerocopy-derive v0.7.35
   Compiling futures-macro v0.3.31
   Compiling postgres-derive v0.4.6
   Compiling async-trait v0.1.83
   Compiling tokio-util v0.7.12
   Compiling zerocopy v0.7.35
   Compiling futures-util v0.3.31
   Compiling ppv-lite86 v0.2.20
   Compiling rand_chacha v0.3.1
   Compiling rand v0.8.5
   Compiling postgres-protocol v0.6.7
   Compiling postgres-types v0.2.8
   Compiling tokio-postgres v0.7.12
   Compiling bug v0.1.0 (/home/zack/projects/bug)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 6.81s
     Running `target/debug/bug`
thread 'main' panicked at src/main.rs:16:17:
internal error: entered unreachable code
stack backtrace:
   0:     0x5b8541de129a - std::backtrace_rs::backtrace::libunwind::trace::h99efb0985cae5d78
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/../../backtrace/src/backtrace/libunwind.rs:116:5
   1:     0x5b8541de129a - std::backtrace_rs::backtrace::trace_unsynchronized::he2c1aa63b3f7fad8
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x5b8541de129a - std::sys::backtrace::_print_fmt::h8a221d40f5e0f88b
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/sys/backtrace.rs:66:9
   3:     0x5b8541de129a - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h304520fd6a30aa07
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/sys/backtrace.rs:39:26
   4:     0x5b8541e00cfb - core::fmt::rt::Argument::fmt::h5da9c218ec984eaf
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/fmt/rt.rs:177:76
   5:     0x5b8541e00cfb - core::fmt::write::hf5713710ce10ff22
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/fmt/mod.rs:1178:21
   6:     0x5b8541dde1f3 - std::io::Write::write_fmt::hda708db57927dacf
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/io/mod.rs:1823:15
   7:     0x5b8541de2442 - std::sys::backtrace::BacktraceLock::print::hbcdbec4d97c91528
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/sys/backtrace.rs:42:9
   8:     0x5b8541de2442 - std::panicking::default_hook::{{closure}}::he1ad87607d0c11c5
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:266:22
   9:     0x5b8541de20ae - std::panicking::default_hook::h81c8cd2e7c59ee33
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:293:9
  10:     0x5b8541de2ccf - std::panicking::rust_panic_with_hook::had2118629c312a4a
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:797:13
  11:     0x5b8541de2983 - std::panicking::begin_panic_handler::{{closure}}::h7fa5985d111bafa2
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:664:13
  12:     0x5b8541de1779 - std::sys::backtrace::__rust_end_short_backtrace::h704d151dbefa09c5
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/sys/backtrace.rs:170:18
  13:     0x5b8541de2644 - rust_begin_unwind
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:662:5
  14:     0x5b8541c24ba3 - core::panicking::panic_fmt::h3eea515d05f7a35e
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/panicking.rs:74:14
  15:     0x5b8541c24c2c - core::panicking::panic::h102d65dbfa674afe
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/panicking.rs:148:5
  16:     0x5b8541c65f92 - <bug::Foo as postgres_types::FromSql>::from_sql::h43e1abeab9a3c013
                               at /home/zack/projects/bug/src/main.rs:16:17
  17:     0x5b8541c66626 - <bug::Bar as postgres_types::FromSql>::from_sql::h3bf354d1b63b138d
                               at /home/zack/projects/bug/src/main.rs:21:17
  18:     0x5b8541c49be0 - postgres_types::FromSql::from_sql_nullable::heb890c98a7575749
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/postgres-types-0.2.8/src/lib.rs:553:26
  19:     0x5b8541c3a5b6 - postgres_types::private::read_value::h60ed5086d229f1fd
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/postgres-types-0.2.8/src/private.rs:33:5
  20:     0x5b8541c66c04 - <bug::Fizz as postgres_types::FromSql>::from_sql::hd1e47626297d0f67
                               at /home/zack/projects/bug/src/main.rs:24:17
  21:     0x5b8541c49b60 - postgres_types::FromSql::from_sql_nullable::h8b6560ee4998bc3c
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/postgres-types-0.2.8/src/lib.rs:553:26
  22:     0x5b8541c3ff59 - tokio_postgres::row::Row::get_inner::hbdb55d077f4a2675
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-postgres-0.7.12/src/row.rs:184:9
  23:     0x5b8541c3fb8e - tokio_postgres::row::Row::get::h51f09083614dfe15
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-postgres-0.7.12/src/row.rs:151:15
  24:     0x5b8541c4ac65 - bug::main::{{closure}}::hec6cf66abc2b37c0
                               at /home/zack/projects/bug/src/main.rs:67:24
  25:     0x5b8541c3a1fd - <core::pin::Pin<P> as core::future::future::Future>::poll::h5b0901c32bd73ba6
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/future/future.rs:123:9
  26:     0x5b8541c3a2bd - <core::pin::Pin<P> as core::future::future::Future>::poll::hcf178ea35cd368f9
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/future/future.rs:123:9
  27:     0x5b8541c34bff - tokio::runtime::scheduler::current_thread::CoreGuard::block_on::{{closure}}::{{closure}}::{{closure}}::h5c8ff6977dfd5361
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/scheduler/current_thread/mod.rs:729:57
  28:     0x5b8541c34b25 - tokio::runtime::coop::with_budget::h79f7fee45e1fa95c
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/coop.rs:107:5
  29:     0x5b8541c34b25 - tokio::runtime::coop::budget::ha98b8bca93bacaa2
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/coop.rs:73:5
  30:     0x5b8541c34b25 - tokio::runtime::scheduler::current_thread::CoreGuard::block_on::{{closure}}::{{closure}}::h1c41bed8d6c2e705
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/scheduler/current_thread/mod.rs:729:25
  31:     0x5b8541c324b0 - tokio::runtime::scheduler::current_thread::Context::enter::h75f2cabd0440a202
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/scheduler/current_thread/mod.rs:428:19
  32:     0x5b8541c3420b - tokio::runtime::scheduler::current_thread::CoreGuard::block_on::{{closure}}::hd312ed3b2fc5c4b0
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/scheduler/current_thread/mod.rs:728:36
  33:     0x5b8541c336a4 - tokio::runtime::scheduler::current_thread::CoreGuard::enter::{{closure}}::hfcbec99e2427c975
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/scheduler/current_thread/mod.rs:807:68
  34:     0x5b8541c66f9b - tokio::runtime::context::scoped::Scoped<T>::set::hfd7dc621c1a86dd6
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/context/scoped.rs:40:9
  35:     0x5b8541c3e469 - tokio::runtime::context::set_scheduler::{{closure}}::he0284573d5eb0ca5
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/context.rs:180:26
  36:     0x5b8541c5c65a - std::thread::local::LocalKey<T>::try_with::h705fa3e9e86b8046
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/thread/local.rs:283:12
  37:     0x5b8541c5bc2a - std::thread::local::LocalKey<T>::with::hcbecfc679dd67832
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/thread/local.rs:260:9
  38:     0x5b8541c3e3dd - tokio::runtime::context::set_scheduler::hac0d58a5dc54ad36
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/context.rs:180:9
  39:     0x5b8541c33430 - tokio::runtime::scheduler::current_thread::CoreGuard::enter::h1e18d6ebd2188d54
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/scheduler/current_thread/mod.rs:807:27
  40:     0x5b8541c33723 - tokio::runtime::scheduler::current_thread::CoreGuard::block_on::hf8078cbf5b28f26c
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/scheduler/current_thread/mod.rs:716:19
  41:     0x5b8541c30efd - tokio::runtime::scheduler::current_thread::CurrentThread::block_on::{{closure}}::ha66859ddb7d9bad0
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/scheduler/current_thread/mod.rs:196:28
  42:     0x5b8541c2a527 - tokio::runtime::context::runtime::enter_runtime::hae321f8f5ba61d93
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/context/runtime.rs:65:16
  43:     0x5b8541c30bd3 - tokio::runtime::scheduler::current_thread::CurrentThread::block_on::h14c83c76c10473e3
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/scheduler/current_thread/mod.rs:184:9
  44:     0x5b8541c2ab10 - tokio::runtime::runtime::Runtime::block_on_inner::h28918626ddecdeee
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/runtime.rs:368:47
  45:     0x5b8541c2aefe - tokio::runtime::runtime::Runtime::block_on::h751fbbf92aa61924
                               at /home/zack/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.41.1/src/runtime/runtime.rs:340:13
  46:     0x5b8541c65e4c - bug::main::ha7253ccdcb8d6d35
                               at /home/zack/projects/bug/src/main.rs:30:5
  47:     0x5b8541c25b4b - core::ops::function::FnOnce::call_once::h9f3bb0ebd6d37fd7
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/ops/function.rs:250:5
  48:     0x5b8541c5cd7e - std::sys::backtrace::__rust_begin_short_backtrace::h0b49c9502cd6f287
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/sys/backtrace.rs:154:18
  49:     0x5b8541c2a081 - std::rt::lang_start::{{closure}}::hc1d9acf0009135ce
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/rt.rs:164:18
  50:     0x5b8541ddae40 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h08ecba131ab90ec4
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/ops/function.rs:284:13
  51:     0x5b8541ddae40 - std::panicking::try::do_call::hf33a59fd8ce953f4
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:554:40
  52:     0x5b8541ddae40 - std::panicking::try::h5005ce80ce949fd8
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:518:19
  53:     0x5b8541ddae40 - std::panic::catch_unwind::hfbae19e2e2c5b7ed
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panic.rs:345:14
  54:     0x5b8541ddae40 - std::rt::lang_start_internal::{{closure}}::ha0331c3690741813
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/rt.rs:143:48
  55:     0x5b8541ddae40 - std::panicking::try::do_call::hcdcbdb616b4d0295
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:554:40
  56:     0x5b8541ddae40 - std::panicking::try::h3f2f1725a07d2256
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panicking.rs:518:19
  57:     0x5b8541ddae40 - std::panic::catch_unwind::h51869e04b56b2dc3
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/panic.rs:345:14
  58:     0x5b8541ddae40 - std::rt::lang_start_internal::h4d90db0530245041
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/rt.rs:143:20
  59:     0x5b8541c2a05a - std::rt::lang_start::h0c5b3abe1e928f3c
                               at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/rt.rs:163:17
  60:     0x5b8541c66d8e - main
  61:     0x747cf2318e08 - <unknown>
  62:     0x747cf2318ecc - __libc_start_main
  63:     0x5b8541c255f5 - _start
  64:                0x0 - <unknown>

Additional information:

[zack@laptop bug]$ cat Cargo.toml
[package]
name = "bug"
version = "0.1.0"
edition = "2021"

[dependencies]
postgres-types = { version = "0.2.8", default-features = false, features = ["derive"] }
tokio = { version = "1.41.1", default-features = false, features = ["rt"] }
tokio-postgres = { version = "0.7.12", default-features = false, features = ["runtime"] }
[zack@laptop bug]$ rustc --version
rustc 1.82.0 (f6e511eec 2024-10-15)
[zack@laptop bug]$ postgres --version
postgres (PostgreSQL) 16.3
[zack@laptop bug]$ uname -a
Linux laptop 6.11.7-arch1-1 #1 SMP PREEMPT_DYNAMIC Fri, 08 Nov 2024 17:57:56 +0000 x86_64 GNU/Linux

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions