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.96) (envelope-from ) id 1vno80-00BymJ-20 for pgsql-hackers@arkaria.postgresql.org; Thu, 05 Feb 2026 01:25:52 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vno7y-00EVyO-1E for pgsql-hackers@arkaria.postgresql.org; Thu, 05 Feb 2026 01:25:50 +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.96) (envelope-from ) id 1vno7y-00EVyG-0F for pgsql-hackers@lists.postgresql.org; Thu, 05 Feb 2026 01:25:49 +0000 Received: from meldrar.postgresql.org ([2a02:c0:301:0:ffff::31]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vno7t-00000000bmZ-3F5c for pgsql-hackers@postgresql.org; Thu, 05 Feb 2026 01:25:49 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=postgresql.org; s=20171124; h=Content-Transfer-Encoding:Content-Type: Mime-Version:References:In-Reply-To:From:Subject:Cc:To:Message-Id:Date:Sender :Reply-To:Content-ID:Content-Description; bh=ezl5J/p4LDQzspk4LQCqUsMi7V2K8g+6Vt9mRv3CkY8=; b=3S89xD85Ah5sxdZVIumkcElsNL j1rbw1WqLrlUn/F/5kcy0GazkTh/82jxWw62Rg6dGI7e28PrTmXBxxINnJBoyaSjJ2YUnJIqsMo5U mjAedJ/RQeq/U+eihdkzSFl3x8sgQZj6WwXKn20H2rmTE6ASSKhT3LoxZxyhH8sPNhPCY2lBpmTXw i3g5/ZECV3FeqNOj4Lt20/pUUXd+BknoK/pO9JZHsmaTrPs6J4NmnO/R9f2Rkwk+NMwLIc/Qad9tP tjN/V+MLFmmymanMw2XFsQiuMzsJeYW+DL8ZcBOMqodFyxrNhMiiKQ+zKQ6HAAIfDudsaEOHOTYUe qfsgETlQ==; Received: from [2409:11:4120:300:a5ce:114d:83d4:d67f] (helo=localhost) by meldrar.postgresql.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vno7k-002cND-2b; Thu, 05 Feb 2026 01:25:39 +0000 Date: Thu, 05 Feb 2026 10:25:19 +0900 (JST) Message-Id: <20260205.102519.1298921431937419793.ishii@postgresql.org> To: assam258@gmail.com Cc: jacob.champion@enterprisedb.com, david.g.johnston@gmail.com, vik@postgresfriends.org, er@xs4all.nl, peter@eisentraut.org, pgsql-hackers@postgresql.org Subject: Re: Row pattern recognition From: Tatsuo Ishii In-Reply-To: References: <20260204.192222.892684621512920290.ishii@postgresql.org> X-Mailer: Mew version 6.8 on Emacs 29.3 Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Host-Lookup-Failed: Reverse DNS lookup failed for 2409:11:4120:300:a5ce:114d:83d4:d67f (failed) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Hi Henson, >> ## Proposal for consistency >> > >> > /* Initialize NFA free lists for row pattern matching */ >> > winstate->nfaContext = NULL; >> > winstate->nfaContextTail = NULL; >> > winstate->nfaContextFree = NULL; >> > winstate->nfaStateFree = NULL; >> > winstate->nfaLastProcessedRow = -1; >> > winstate->nfaStatesActive = 0; // Add this >> > winstate->nfaContextsActive = 0; // Add this >> > >> > Would you like me to include this change in the next patch? >> >> Yes, please. >> > > > Done. Please see the attached patch. Looks good to me. BTW, I noticed that following test now succeeds with v42 patch. In rpr_explain.sql test 11.3: -- Test 11.3: Consecutive increasing values (using PREV) -- FIXME: The original pattern was: -- DEFINE A AS v > PREV(v) OR PREV(v) IS NULL -- This causes "ERROR: unrecognized node type: 15" (T_FuncExpr) because -- NullTest(FuncExpr(PREV)) is not properly handled somewhere in the planner. -- The expression v > PREV(v) works fine, but PREV(v) IS NULL fails. -- Using COALESCE(PREV(v), 0) as a workaround until the bug is fixed. EXPLAIN (ANALYZE, BUFFERS OFF, COSTS OFF, TIMING OFF, SUMMARY OFF) SELECT count(*) OVER w FROM generate_series(1, 50) AS s(v) WINDOW w AS ( ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING AFTER MATCH SKIP PAST LAST ROW PATTERN (A{3,}) DEFINE A AS v > COALESCE(PREV(v), 0) ); I changed DEFINE A AS v > COALESCE(PREV(v), 0) to DEFINE A AS v > PREV(v) OR PREV(v) IS NULL and get following result. EXPLAIN (ANALYZE, BUFFERS OFF, COSTS OFF, TIMING OFF, SUMMARY OFF) SELECT count(*) OVER w FROM generate_series(1, 50) AS s(v) WINDOW w AS ( ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING AFTER MATCH SKIP PAST LAST ROW PATTERN (A{3,}) DEFINE A AS v > PREV(v) OR PREV(v) IS NULL ); QUERY PLAN ---------------------------------------------------------------------- WindowAgg (actual rows=50.00 loops=1) Window: w AS (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) Pattern: a{3,}" Storage: Memory Maximum Storage: 18kB NFA States: 3 peak, 99 total, 0 merged NFA Contexts: 2 peak, 51 total, 0 pruned NFA: 1 matched (len 50/50/50.0), 0 mismatched NFA: 49 absorbed (len 1/1/1.0), 0 skipped -> Function Scan on generate_series s (actual rows=50.00 loops=1) (9 rows) Probably we can restore 11.3 test in v43? Best regards, -- Tatsuo Ishii SRA OSS K.K. English: http://www.sraoss.co.jp/index_en/ Japanese:http://www.sraoss.co.jp