Thread

Commits

  1. Ensure we have a snapshot while dropping ON COMMIT DROP temp tables.

  1. Assert failure when CREATE TEMP TABLE

    Richard Guo <guofenglinux@gmail.com> — 2023-10-16T11:02:29Z

    I came across an Assert failure while running sqlancer.  The repro query
    is
    
    CREATE TEMP TABLE t0 (c0 int4range CHECK ((('')||(0.005014271491241007) NOT
    IN (upper(''), ((' 9O')||FALSE))) BETWEEN SYMMETRIC
    (initcap('dj')LIKE(((('EizW~')||t0.c0) COLLATE "en_AG.utf8"))) AND
    ((((0.18773675)::MONEY) IN (0.52246463::MONEY))AND(t0.c0 BETWEEN SYMMETRIC
    ((t0.c0+t0.c0)) AND t0.c0)))) USING heap ON COMMIT DROP;
    
    The failure happens in init_toast_snapshot():
    
     /*
      * Catalog snapshots can be returned by GetOldestSnapshot() even if not
      * registered or active. That easily hides bugs around not having a
      * snapshot set up - most of the time there is a valid catalog snapshot.
      * So additionally insist that the current snapshot is registered or
      * active.
      */
     Assert(HaveRegisteredOrActiveSnapshot());
    
    And 'git bisect' says that the first bad commit is 2489d76c, which makes
    me confused because the problemed query does not seem to involve
    nullingrels stuff.
    
    Thanks
    Richard
    
  2. Re: Assert failure when CREATE TEMP TABLE

    Tom Lane <tgl@sss.pgh.pa.us> — 2023-10-16T15:46:54Z

    Richard Guo <guofenglinux@gmail.com> writes:
    > I came across an Assert failure while running sqlancer.  The repro query
    > is
    
    > CREATE TEMP TABLE t0 (c0 int4range CHECK ((('')||(0.005014271491241007) NOT
    > IN (upper(''), ((' 9O')||FALSE))) BETWEEN SYMMETRIC
    > (initcap('dj')LIKE(((('EizW~')||t0.c0) COLLATE "en_AG.utf8"))) AND
    > ((((0.18773675)::MONEY) IN (0.52246463::MONEY))AND(t0.c0 BETWEEN SYMMETRIC
    > ((t0.c0+t0.c0)) AND t0.c0)))) USING heap ON COMMIT DROP;
    
    Hmm.  AFAICT, the critical thing about this CHECK condition is simply
    that it's bulky enough to create an out-of-line toasted "conbin" field
    in pg_constraint.  When we come to ON COMMIT DROP, we have to delete
    the pg_constraint entry and thereby the toast item, and we evidently
    lack a snapshot at that point.
    
    > And 'git bisect' says that the first bad commit is 2489d76c, which makes
    > me confused because the problemed query does not seem to involve
    > nullingrels stuff.
    
    Probably the reason is that addition of nullingrels fields to the Vars
    pushed it over the edge of needing to be out-of-line.  The test case
    is very close to the line as stated --- for example, I found that it
    didn't crash if I changed "en_AG.utf8" to "C", and wasted some time
    pursuing the idea that the collation had something to do with it.
    The crash got much more stable after adding a couple more dummy clauses
    to the CHECK condition, and I've also reproduced it with clauses as
    straightforward as "c0 < 'very-long-constant'".
    
    			regards, tom lane
    
    
    
    
  3. Re: Assert failure when CREATE TEMP TABLE

    Alexander Law <exclusion@gmail.com> — 2023-10-17T09:00:00Z

    16.10.2023 18:46, Tom Lane wrote:
    > Richard Guo <guofenglinux@gmail.com> writes:
    >> I came across an Assert failure while running sqlancer.  The repro query
    >> is
    > Hmm.  AFAICT, the critical thing about this CHECK condition is simply
    > that it's bulky enough to create an out-of-line toasted "conbin" field
    > in pg_constraint.  When we come to ON COMMIT DROP, we have to delete
    > the pg_constraint entry and thereby the toast item, and we evidently
    > lack a snapshot at that point.
    
    That's very similar to bug #18127, and looks like one more case to the
    collection [1], with RemoveConstraintById() -> CatalogTupleDelete() ->
    simple_heap_delete() ...
    
    https://www.postgresql.org/message-id/9541c507-a325-7768-38b0-90f6532c01e3%40gmail.com
    
    Best regards,
    Alexander
    
    
    
    
  4. Re: Assert failure when CREATE TEMP TABLE

    Richard Guo <guofenglinux@gmail.com> — 2023-10-18T06:57:37Z

    On Mon, Oct 16, 2023 at 11:46 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
    
    > Richard Guo <guofenglinux@gmail.com> writes:
    > > And 'git bisect' says that the first bad commit is 2489d76c, which makes
    > > me confused because the problemed query does not seem to involve
    > > nullingrels stuff.
    >
    > Probably the reason is that addition of nullingrels fields to the Vars
    > pushed it over the edge of needing to be out-of-line.  The test case
    > is very close to the line as stated --- for example, I found that it
    > didn't crash if I changed "en_AG.utf8" to "C", and wasted some time
    > pursuing the idea that the collation had something to do with it.
    > The crash got much more stable after adding a couple more dummy clauses
    > to the CHECK condition, and I've also reproduced it with clauses as
    > straightforward as "c0 < 'very-long-constant'".
    
    
    Ah, this clears up my confusion.  Thanks for the fix.
    
    Thanks
    Richard