This entry shows the test result of https://www.postgresql.org/message-id/flat/CA%2Bq6zcWtUbT_Sxj0V6HY6EZ89uv5wuG5aefpe_9n0Jr3VwntFg%40mail.gmail.com
- Download these 4 patch files
$ wget https://www.postgresql.org/message-id/attachment/154675/v18-0001-Prevent-jumbling-of-every-element-in-ArrayExpr.patch
$ wget https://www.postgresql.org/message-id/attachment/154676/v18-0002-Reusable-decimalLength-functions.patch
$ wget https://www.postgresql.org/message-id/attachment/154677/v18-0003-Merge-constants-in-ArrayExpr-into-groups.patch
$ wget https://www.postgresql.org/message-id/attachment/154678/v18-0004-Introduce-query_id_const_merge_threshold.patch
- checkout a pg_stat_statements branch from 0eb23285a2 to avoid conflicts with the latest master branch
$ git checkout 0eb23285a2 -b pg_stat_statements
- Apply these 4 patches using git am command
$ git am v18-0001-Prevent-jumbling-of-every-element-in-ArrayExpr.patch
Applying: Prevent jumbling of every element in ArrayExpr
$ git am v18-0002-Reusable-decimalLength-functions.patch
Applying: Reusable decimalLength functions
$ git am v18-0003-Merge-constants-in-ArrayExpr-into-groups.patch
Applying: Merge constants in ArrayExpr into groups
$ git am v18-0004-Introduce-query_id_const_merge_threshold.patch
Applying: Introduce query_id_const_merge_threshold
- Confirmed these 4 patches are applied
$ git log --oneline | head -n 5
9439c28ea4 Introduce query_id_const_merge_threshold
3396955b35 Merge constants in ArrayExpr into groups
a29314c2d6 Reusable decimalLength functions
44ceb8dba4 Prevent jumbling of every element in ArrayExpr
0eb23285a2 Fix two memcpy() bugs in the new injection point code
$
This branch has been pushed to https://github.com/yahonda/postgres/tree/pg_stat_statements
- Build PostgreSQL locally
#!/bin/bash
cd $HOME/pgsql/master
pg_ctl -D data stop
rm -rf data
rm -rf logfile
cd ..
cd $HOME
rm -rf pgsql
cd $HOME/src/github.com/postgres/postgres
meson setup build --wipe
meson setup build --prefix=$HOME/pgsql/master -Duuid=ossp -Dssl=openssl -Dllvm=enabled
cd build
ninja
ninja install
cd $HOME/pgsql/master
bin/initdb -D data --encoding=UTF8
bin/pg_ctl -D data -l logfile start
- Enable pg_stat_statements
$ cd $HOME/pgsql/master
$ bin/psql -d postgres
psql (17devel)
Type "help" for help.
postgres=# ALTER SYSTEM SET shared_preload_libraries TO 'pg_stat_statements';
ALTER SYSTEM
postgres=# \q
$ bin/pg_ctl -D data stop
waiting for server to shut down.... done
server stopped
$ bin/pg_ctl -D data -l logfile start
waiting for server to start.... done
server started
$ bin/psql -d postgres
psql (17devel)
Type "help" for help.
postgres=# SHOW shared_preload_libraries;
shared_preload_libraries
--------------------------
pg_stat_statements
(1 row)
postgres=# CREATE EXTENSION pg_stat_statements;
CREATE EXTENSION
- Prepare test database
postgres=# create database test;
CREATE DATABASE
postgres=# select pg_stat_statements_reset();
pg_stat_statements_reset
-------------------------------
2024-03-24 21:30:46.746412+09
(1 row)
postgres=# select query from pg_stat_statements where query like 'SELECT COUNT%' order by 1;
query
-------
(0 rows)
- Reset pg_stat_statements entries and use the default query_id_const_merge_threshold
postgres=# select pg_stat_statements_reset();
pg_stat_statements_reset
-------------------------------
2024-03-24 23:10:48.667495+09
(1 row)
postgres=# reset pg_stat_statements.query_id_const_merge_threshold;
RESET
postgres=# show pg_stat_statements.query_id_const_merge_threshold;
pg_stat_statements.query_id_const_merge_threshold
---------------------------------------------------
0
(1 row)
- Run active_record2.rb to run prepared statements whose number of in clause changing from 1 to 10.
# frozen_string_literal: true
require "bundler/inline"
gemfile(true) do
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
# gem "rails", path: "/home/yahonda/src/github.com/rails/rails"
# If you want to test against edge Rails replace the previous line with this:
gem "rails", github: "rails/rails", branch: "main"
gem "pg"
end
require "active_record"
require "minitest/autorun"
require "logger"
# This connection will do for database-independent bug reports.
ActiveRecord::Base.establish_connection(adapter: "postgresql", database: "test")
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Schema.define do
create_table :posts, force: true do |t|
end
end
class Post < ActiveRecord::Base
end
class BugTest < Minitest::Test
def test_post_count
(1..10).each do |i|
post = Post.create!
post = Post.where(id: (1 .. i).to_a)
assert_equal i, post.count
end
end
end
$ ruby active_record2.rb
Fetching https://github.com/rails/rails.git
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
-- create_table(:posts, {:force=>true})
D, [2024-03-24T23:11:13.522093 #50079] DEBUG -- : (4.8ms) DROP TABLE IF EXISTS "posts"
D, [2024-03-24T23:11:13.530299 #50079] DEBUG -- : (7.5ms) CREATE TABLE "posts" ("id" bigserial primary key)
-> 0.0287s
D, [2024-03-24T23:11:13.568472 #50079] DEBUG -- : ActiveRecord::InternalMetadata Load (1.0ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
Run options: --seed 52174
# Running:
D, [2024-03-24T23:11:13.701165 #50079] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:11:13.701902 #50079] DEBUG -- : Post Create (0.8ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.704722 #50079] DEBUG -- : TRANSACTION (2.6ms) COMMIT
D, [2024-03-24T23:11:13.715410 #50079] DEBUG -- : Post Count (0.6ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" = $1 [["id", 1]]
D, [2024-03-24T23:11:13.716363 #50079] DEBUG -- : TRANSACTION (0.2ms) BEGIN
D, [2024-03-24T23:11:13.716679 #50079] DEBUG -- : Post Create (0.8ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.718210 #50079] DEBUG -- : TRANSACTION (1.1ms) COMMIT
D, [2024-03-24T23:11:13.719218 #50079] DEBUG -- : Post Count (0.5ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2) [["id", 1], ["id", 2]]
D, [2024-03-24T23:11:13.719880 #50079] DEBUG -- : TRANSACTION (0.2ms) BEGIN
D, [2024-03-24T23:11:13.720215 #50079] DEBUG -- : Post Create (0.5ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.721669 #50079] DEBUG -- : TRANSACTION (0.9ms) COMMIT
D, [2024-03-24T23:11:13.722522 #50079] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3) [["id", 1], ["id", 2], ["id", 3]]
D, [2024-03-24T23:11:13.723505 #50079] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:11:13.723792 #50079] DEBUG -- : Post Create (0.4ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.724850 #50079] DEBUG -- : TRANSACTION (0.9ms) COMMIT
D, [2024-03-24T23:11:13.725687 #50079] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4) [["id", 1], ["id", 2], ["id", 3], ["id", 4]]
D, [2024-03-24T23:11:13.726630 #50079] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:11:13.726992 #50079] DEBUG -- : Post Create (0.8ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.728066 #50079] DEBUG -- : TRANSACTION (0.9ms) COMMIT
D, [2024-03-24T23:11:13.729162 #50079] DEBUG -- : Post Count (0.4ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5]]
D, [2024-03-24T23:11:13.730044 #50079] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:11:13.730332 #50079] DEBUG -- : Post Create (0.5ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.731514 #50079] DEBUG -- : TRANSACTION (1.0ms) COMMIT
D, [2024-03-24T23:11:13.732400 #50079] DEBUG -- : Post Count (0.4ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6]]
D, [2024-03-24T23:11:13.733224 #50079] DEBUG -- : TRANSACTION (0.2ms) BEGIN
D, [2024-03-24T23:11:13.733489 #50079] DEBUG -- : Post Create (0.7ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.734586 #50079] DEBUG -- : TRANSACTION (0.9ms) COMMIT
D, [2024-03-24T23:11:13.735431 #50079] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7]]
D, [2024-03-24T23:11:13.736324 #50079] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:11:13.736600 #50079] DEBUG -- : Post Create (0.7ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.737670 #50079] DEBUG -- : TRANSACTION (0.9ms) COMMIT
D, [2024-03-24T23:11:13.738977 #50079] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8]]
D, [2024-03-24T23:11:13.739888 #50079] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:11:13.740149 #50079] DEBUG -- : Post Create (0.4ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.741213 #50079] DEBUG -- : TRANSACTION (0.9ms) COMMIT
D, [2024-03-24T23:11:13.742075 #50079] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8], ["id", 9]]
D, [2024-03-24T23:11:13.743205 #50079] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:11:13.743499 #50079] DEBUG -- : Post Create (0.5ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:11:13.744550 #50079] DEBUG -- : TRANSACTION (0.9ms) COMMIT
D, [2024-03-24T23:11:13.745376 #50079] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8], ["id", 9], ["id", 10]]
.
Finished in 0.056451s, 17.7146 runs/s, 177.1459 assertions/s.
1 runs, 10 assertions, 0 failures, 0 errors, 0 skips
$
- Query pg_stat_statements that has 10 entries for each query.
postgres=# select query,calls from pg_stat_statements where query like 'SELECT COUNT%' order by 1;
query | calls
----------------------------------------------------------------------------------------------+-------
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" = $1 | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) | 1
(10 rows)
- Set query_id_const_merge_threshold to 5
postgres=# SET pg_stat_statements.query_id_const_merge_threshold = 5;
SET
postgres=# show pg_stat_statements.query_id_const_merge_threshold;
pg_stat_statements.query_id_const_merge_threshold
---------------------------------------------------
5
(1 row)
postgres=# select pg_stat_statements_reset();
pg_stat_statements_reset
-------------------------------
2024-03-24 23:11:54.204133+09
(1 row)
- Run the same active_record2.rb to run prepared statements whose number of in clause changing from 1 to 10.
$ ruby active_record2.rb
Fetching https://github.com/rails/rails.git
Fetching gem metadata from https://rubygems.org/..........
Resolving dependencies...
-- create_table(:posts, {:force=>true})
D, [2024-03-24T23:12:01.579614 #50152] DEBUG -- : (6.4ms) DROP TABLE IF EXISTS "posts"
D, [2024-03-24T23:12:01.590816 #50152] DEBUG -- : (10.5ms) CREATE TABLE "posts" ("id" bigserial primary key)
-> 0.0335s
D, [2024-03-24T23:12:01.636888 #50152] DEBUG -- : ActiveRecord::InternalMetadata Load (0.9ms) SELECT * FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 ORDER BY "ar_internal_metadata"."key" ASC LIMIT 1 [[nil, "environment"]]
Run options: --seed 17104
# Running:
D, [2024-03-24T23:12:01.765773 #50152] DEBUG -- : TRANSACTION (0.2ms) BEGIN
D, [2024-03-24T23:12:01.766516 #50152] DEBUG -- : Post Create (1.0ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.768371 #50152] DEBUG -- : TRANSACTION (1.1ms) COMMIT
D, [2024-03-24T23:12:01.778982 #50152] DEBUG -- : Post Count (0.6ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" = $1 [["id", 1]]
D, [2024-03-24T23:12:01.780016 #50152] DEBUG -- : TRANSACTION (0.2ms) BEGIN
D, [2024-03-24T23:12:01.780335 #50152] DEBUG -- : Post Create (0.6ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.781940 #50152] DEBUG -- : TRANSACTION (1.1ms) COMMIT
D, [2024-03-24T23:12:01.783210 #50152] DEBUG -- : Post Count (0.5ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2) [["id", 1], ["id", 2]]
D, [2024-03-24T23:12:01.783912 #50152] DEBUG -- : TRANSACTION (0.2ms) BEGIN
D, [2024-03-24T23:12:01.784209 #50152] DEBUG -- : Post Create (0.5ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.785752 #50152] DEBUG -- : TRANSACTION (1.0ms) COMMIT
D, [2024-03-24T23:12:01.786827 #50152] DEBUG -- : Post Count (0.4ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3) [["id", 1], ["id", 2], ["id", 3]]
D, [2024-03-24T23:12:01.787732 #50152] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:12:01.788061 #50152] DEBUG -- : Post Create (0.5ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.789486 #50152] DEBUG -- : TRANSACTION (1.2ms) COMMIT
D, [2024-03-24T23:12:01.790541 #50152] DEBUG -- : Post Count (0.4ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4) [["id", 1], ["id", 2], ["id", 3], ["id", 4]]
D, [2024-03-24T23:12:01.791282 #50152] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:12:01.791606 #50152] DEBUG -- : Post Create (0.5ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.793291 #50152] DEBUG -- : TRANSACTION (1.1ms) COMMIT
D, [2024-03-24T23:12:01.794491 #50152] DEBUG -- : Post Count (0.4ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5]]
D, [2024-03-24T23:12:01.795535 #50152] DEBUG -- : TRANSACTION (0.2ms) BEGIN
D, [2024-03-24T23:12:01.795842 #50152] DEBUG -- : Post Create (0.5ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.797030 #50152] DEBUG -- : TRANSACTION (1.0ms) COMMIT
D, [2024-03-24T23:12:01.798178 #50152] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6]]
D, [2024-03-24T23:12:01.798823 #50152] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:12:01.799100 #50152] DEBUG -- : Post Create (0.4ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.800201 #50152] DEBUG -- : TRANSACTION (0.9ms) COMMIT
D, [2024-03-24T23:12:01.801601 #50152] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7]]
D, [2024-03-24T23:12:01.802372 #50152] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:12:01.802635 #50152] DEBUG -- : Post Create (0.6ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.804062 #50152] DEBUG -- : TRANSACTION (1.0ms) COMMIT
D, [2024-03-24T23:12:01.804958 #50152] DEBUG -- : Post Count (0.4ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8]]
D, [2024-03-24T23:12:01.805835 #50152] DEBUG -- : TRANSACTION (0.2ms) BEGIN
D, [2024-03-24T23:12:01.806099 #50152] DEBUG -- : Post Create (0.7ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.807209 #50152] DEBUG -- : TRANSACTION (0.9ms) COMMIT
D, [2024-03-24T23:12:01.808017 #50152] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8], ["id", 9]]
D, [2024-03-24T23:12:01.808834 #50152] DEBUG -- : TRANSACTION (0.1ms) BEGIN
D, [2024-03-24T23:12:01.809099 #50152] DEBUG -- : Post Create (0.6ms) INSERT INTO "posts" DEFAULT VALUES RETURNING "id"
D, [2024-03-24T23:12:01.810268 #50152] DEBUG -- : TRANSACTION (1.0ms) COMMIT
D, [2024-03-24T23:12:01.811390 #50152] DEBUG -- : Post Count (0.3ms) SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) [["id", 1], ["id", 2], ["id", 3], ["id", 4], ["id", 5], ["id", 6], ["id", 7], ["id", 8], ["id", 9], ["id", 10]]
- Query pg_stat_statements that has 10 entries for each query.
postgres=# select query,calls from pg_stat_statements where query like 'SELECT COUNT%' order by 1;
query | calls
----------------------------------------------------------------------------------------------+-------
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" = $1 | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9) | 1
SELECT COUNT(*) FROM "posts" WHERE "posts"."id" IN ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) | 1
(10 rows)
postgres=#
select query,calls from pg_stat_statements where query like 'SELECT COUNT%' order by 1;
would return normalized query for query like IN (... [5-<some number> entries])
select query,calls from pg_stat_statements where query like 'SELECT COUNT%' order by 1;
returns 10 rows