Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rtTii-00F4d1-NM for pgsql-hackers@arkaria.postgresql.org; Sun, 07 Apr 2024 14:42:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rtTih-007tqX-DH for pgsql-hackers@arkaria.postgresql.org; Sun, 07 Apr 2024 14:42:07 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rtTig-007tqP-V0 for pgsql-hackers@lists.postgresql.org; Sun, 07 Apr 2024 14:42:07 +0000 Received: from mail-lf1-x136.google.com ([2a00:1450:4864:20::136]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rtTid-001fNm-69 for pgsql-hackers@postgresql.org; Sun, 07 Apr 2024 14:42:05 +0000 Received: by mail-lf1-x136.google.com with SMTP id 2adb3069b0e04-516d487659bso2981892e87.2 for ; Sun, 07 Apr 2024 07:42:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1712500921; x=1713105721; darn=postgresql.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=N7HssV/gc9I339WOPcBtj0Bleghoy4aB1ZrPWDWg0hQ=; b=dTgcZHwrGhs2C821hVpIbpcc9ZqeKACSKcWCcQmpCD19tiKiIDxgwRgpxQNap1qPSj tJZEHp6z7wXxjcJYX9+EZfojPReVwJ4BIvg7ZbRItXdqG3nENrXVfi0mkL/1XPqX7WWj 7F6C8eyqpRiEMoB9V9h2dtFFs8vm3faZDxmOncSd9bkEtvacRFD2txiQmZMy6WvaerdY VlcCbBh2a3BRXojq+eOKEtPDOXWOZ8SrEv7nPOVx2ZLDUxvlyJSs1xcs7E+54ZF/8ghh fzxIrpHkNSgjwg2DHDJ43OB3oj0BcDj3Qk5YA3u6K+AbRNT+7+xBVTcDN7uADtkHZR/k Poaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712500921; x=1713105721; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=N7HssV/gc9I339WOPcBtj0Bleghoy4aB1ZrPWDWg0hQ=; b=lf4fCigiCeRlwrhyMm12CgYAZkTaG9PHunVwgFLBjjQgTvzmyDRQG9UdWuM/NL5fH4 cCTrbzKHpq7fDMjt8y0LVaDFRazlkhVEh1dXm74P9+eEKjTvM2jJ957bW3ND5H8HnOqn 18F2BN3YaiiK2w+kqFE7Qywiu+m3UhXVHErvvzl9y7OFd+4rTMDzguDdsjpIgsQz1R0B lGlalxfN4HT8E3V419jLzNwe8aGuPBuJakZkCFkDayh5mIWsiG3wpl0rcDTUBMOrRdEJ 3Foug/b1ivZTpNm5PZM/vvjc/HCZwwDGlOTYXx5a86P9fKEqQdOk1bQZiDvQ5XAPpMp7 40ZA== X-Forwarded-Encrypted: i=1; AJvYcCXAatIBxGMjZhCKzxV6fQ6zoASBXcF1HvV+K9IsBe65v4Ay6IJmQJD4QE4ZvEIAkwgQYVHklbPQhQpmP1e9oxPoH3PZwnxfsJV7uM1g X-Gm-Message-State: AOJu0YzNNiZihbPQ5UfK2aOSMg8JP0TB/EMAkrFL+izbKUWvkjmnDjcs jozvXLIib/0xlKA/WfQGG5h3iept2mlPpgIQ7bL8ClqlPjSs5e/lKnb6HPQHIg== X-Google-Smtp-Source: AGHT+IGJ2aORytseZ+nsSST/54x7YWgRMsLJoALB6zmGRAF7pey7nq0X58Um0iEmsQXvFxytFHNI+g== X-Received: by 2002:a2e:9658:0:b0:2d4:729a:bc05 with SMTP id z24-20020a2e9658000000b002d4729abc05mr4673605ljh.36.1712500921027; Sun, 07 Apr 2024 07:42:01 -0700 (PDT) Received: from [10.137.0.18] (ip-86-49-229-30.bb.vodafone.cz. [86.49.229.30]) by smtp.gmail.com with ESMTPSA id z17-20020a5d4c91000000b00343cc702c56sm6772266wrs.47.2024.04.07.07.42.00 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 07 Apr 2024 07:42:00 -0700 (PDT) Message-ID: Date: Sun, 7 Apr 2024 16:41:59 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: BitmapHeapScan streaming read user and prelim refactoring To: Melanie Plageman Cc: Thomas Munro , Heikki Linnakangas , Andres Freund , Pg Hackers , Nazir Bilal Yavuz References: <20240403225759.sq5hmxdmbalroosy@liskov> <95d9471f-ead4-4215-b739-f6d6f4c19497@enterprisedb.com> <20240405080634.d7c23f46xjhhxf5q@liskov> <20240405235330.v4didvweb6isodtk@liskov> <20240406134011.hjo3e2336sgcghfp@liskov> <4636ce5a-082b-447d-9b62-4953fc18f1af@enterprisedb.com> <20240406160423.r2zcjex3dngnztx4@liskov> <20240406213450.fatgalewqkbez4tg@liskov> <20240407041734.74jwo5wjmxs6p5du@liskov> <2df2fd33-20f1-41ce-951b-6fc94ff9acb7@enterprisedb.com> Content-Language: en-US From: Tomas Vondra In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 4/7/24 16:24, Melanie Plageman wrote: > On Sun, Apr 7, 2024 at 7:38 AM Tomas Vondra > wrote: >> >> >> >> On 4/7/24 06:17, Melanie Plageman wrote: >>> On Sun, Apr 07, 2024 at 02:27:43AM +0200, Tomas Vondra wrote: >>>> On 4/6/24 23:34, Melanie Plageman wrote: >>>>> ... >>>>>> >>>>>> I realized it makes more sense to add a FIXME (I used XXX. I'm not when >>>>>> to use what) with a link to the message where Andres describes why he >>>>>> thinks it is a bug. If we plan on fixing it, it is good to have a record >>>>>> of that. And it makes it easier to put a clear and accurate comment. >>>>>> Done in 0009. >>>>>> >>>>>>> OK, thanks. If think 0001-0008 are ready to go, with some minor tweaks >>>>>>> per above (tuple vs. tuples etc.), and the question about the recheck >>>>>>> flag. If you can do these tweaks, I'll get that committed today and we >>>>>>> can try to get a couple more patches in tomorrow. >>>>> >>>>> Attached v19 rebases the rest of the commits from v17 over the first >>>>> nine patches from v18. All patches 0001-0009 are unchanged from v18. I >>>>> have made updates and done cleanup on 0010-0021. >>>>> >>>> >>>> I've pushed 0001-0005, I'll get back to this tomorrow and see how much >>>> more we can get in for v17. >>> >>> Thanks! I thought about it a bit more, and I got worried about the >>> >>> Assert(scan->rs_empty_tuples_pending == 0); >>> >>> in heap_rescan() and heap_endscan(). >>> >>> I was worried if we don't complete the scan it could end up tripping >>> incorrectly. >>> >>> I tried to come up with a query which didn't end up emitting all of the >>> tuples on the page (using a LIMIT clause), but I struggled to come up >>> with an example that qualified for the skip fetch optimization and also >>> returned before completing the scan. >>> >>> I could work a bit harder tomorrow to try and come up with something. >>> However, I think it might be safer to just change these to: >>> >>> scan->rs_empty_tuples_pending = 0 >>> >> >> Hmmm, good point. I haven't tried, but wouldn't something like "SELECT 1 >> FROM t WHERE column = X LIMIT 1" do the trick? Probably in a join, as a >> correlated subquery? > > Unfortunately (or fortunately, I guess) that exact thing won't work > because even constant values in the target list disqualify it for the > skip fetch optimization. > > Being a bit too lazy to look at planner code this morning, I removed > the target list requirement like this: > > - need_tuples = (node->ss.ps.plan->qual != NIL || > - node->ss.ps.plan->targetlist != NIL); > + need_tuples = (node->ss.ps.plan->qual != NIL); > > And can easily trip the assert with this: > > create table foo (a int); > insert into foo select i from generate_series(1,10)i; > create index on foo(a); > vacuum foo; > select 1 from (select 2 from foo limit 3); > > Anyway, I don't know if we could find a query that does actually hit > this. The only bitmap heap scan queries in the regress suite that meet > the > BitmapHeapScanState->ss.ps.plan->targetlist == NIL > condition are aggregates (all are count(*)). > > I'll dig a bit more later, but do you think this is worth adding an > open item for? Even though I don't have a repro yet? > Try this: create table t (a int, b int) with (fillfactor=10); insert into t select mod((i/22),2), (i/22) from generate_series(0,1000) S(i); create index on t(a); vacuum analyze t; set enable_indexonlyscan = off; set enable_seqscan = off; explain (analyze, verbose) select 1 from (values (1)) s(x) where exists (select * from t where a = x); KABOOM! #2 0x000078a16ac5fafe in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #3 0x000078a16ac4887f in __GI_abort () at abort.c:79 #4 0x0000000000bb2c5a in ExceptionalCondition (conditionName=0xc42ba8 "scan->rs_empty_tuples_pending == 0", fileName=0xc429c8 "heapam.c", lineNumber=1090) at assert.c:66 #5 0x00000000004f68bb in heap_endscan (sscan=0x19af3a0) at heapam.c:1090 #6 0x000000000077a94c in table_endscan (scan=0x19af3a0) at ../../../src/include/access/tableam.h:1001 So yeah, this assert is not quite correct. It's not breaking anything at the moment, so we can fix it now or add it as an open item. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company