agora inbox for [email protected]  
help / color / mirror / Atom feed
[PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails
1036+ messages / 2 participants
[nested] [flat]

* [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails
@ 2025-03-07 14:44 Andres Freund <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Andres Freund @ 2025-03-07 14:44 UTC (permalink / raw)

If wait_connect() failed due to psql exiting, all that we'd see is a "process
ended prematurely" error thrown by IPC::Run, without ever seeing psql's error
message.

Address that by wrapping the pump() call in eval and taking note of stdout &
stderr in case of failure.

We might want to do that in pump_until() as well, but that seems to require
API changes, so let's do the easily achievable bit first.

Reviewed-by: Heikki Linnakangas <[email protected]>
Discussion: https://postgr.es/m/ggflhkciwdyotpoie323chu2c2idpjk5qimrn462encwx2io7s@thmcxl7i6dpw
---
 .../perl/PostgreSQL/Test/BackgroundPsql.pm    | 26 ++++++++++++++++---
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
index c611a61cf4e..1deb410c133 100644
--- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
+++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm
@@ -154,10 +154,28 @@ sub wait_connect
 	my $banner = "background_psql: ready";
 	my $banner_match = qr/(^|\n)$banner\r?\n/;
 	$self->{stdin} .= "\\echo $banner\n\\warn $banner\n";
-	$self->{run}->pump()
-	  until ($self->{stdout} =~ /$banner_match/
-		  && $self->{stderr} =~ /$banner\r?\n/)
-	  || $self->{timeout}->is_expired;
+
+	# IPC::Run throws in case psql exits while we're pumping. To make it
+	# easier to diagnose that, catch the error, report stdout/stderr at time
+	# of death and reraise.
+	eval {
+		$self->{run}->pump()
+		  until ($self->{stdout} =~ /$banner_match/
+			  && $self->{stderr} =~ /$banner\r?\n/)
+		  || $self->{timeout}->is_expired;
+	};
+	if ($@)
+	{
+		chomp(my $stdout = $self->{stdout});
+		chomp(my $stderr = $self->{stderr});
+		chomp(my $err = $@);
+		diag qq(psql died while connecting:
+  stdout: $stdout
+  stderr: $stderr
+  perl error: $err
+);
+		die "psql died while connecting";
+	}
 
 	note "connect output:\n",
 	  explain {
-- 
2.48.1.76.g4e746b1a31.dirty


--q4d36jgrlhdhudrc
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="v2-0003-tests-Fix-race-condition-in-postmaster-002_connec.patch"



^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--






^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread

* [PATCH v1 1/1] teach vacuumlo to handle domains over oid
@ 2026-05-14 03:05 Nathan Bossart <[email protected]>
  0 siblings, 0 replies; 1036+ messages in thread

From: Nathan Bossart @ 2026-05-14 03:05 UTC (permalink / raw)

---
 contrib/vacuumlo/vacuumlo.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c
index 8102569466b..230f6958fc1 100644
--- a/contrib/vacuumlo/vacuumlo.c
+++ b/contrib/vacuumlo/vacuumlo.c
@@ -191,13 +191,25 @@ vacuumlo(const char *database, const struct _param *param)
 	 * delete...
 	 */
 	buf[0] = '\0';
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "WITH RECURSIVE cte AS "
+			   "(SELECT oid AS oid2, oid, typname, typbasetype FROM pg_type "
+			   "UNION ALL "
+			   "SELECT t2.oid2, t.oid, t.typname, t.typbasetype FROM pg_type t "
+			   "JOIN cte t2 ON t.oid = t2.typbasetype) ");
 	strcat(buf, "SELECT s.nspname, c.relname, a.attname ");
 	strcat(buf, "FROM pg_class c, pg_attribute a, pg_namespace s, pg_type t ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, ", cte ");
 	strcat(buf, "WHERE a.attnum > 0 AND NOT a.attisdropped ");
 	strcat(buf, "      AND a.attrelid = c.oid ");
 	strcat(buf, "      AND a.atttypid = t.oid ");
 	strcat(buf, "      AND c.relnamespace = s.oid ");
-	strcat(buf, "      AND t.typname in ('oid', 'lo') ");
+	if (PQserverVersion(conn) >= 140000)
+		strcat(buf, "  AND t.oid = cte.oid2 "
+			   "       AND cte.typname = 'oid' ");
+	else
+		strcat(buf, "  AND t.typname in ('oid', 'lo') ");
 	strcat(buf, "      AND c.relkind in (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")");
 	strcat(buf, "      AND s.nspname !~ '^pg_'");
 	res = PQexec(conn, buf);
-- 
2.50.1 (Apple Git-155)


--K++Jp4URl2Oj0VAw--





^ permalink  raw  reply  [nested|flat] 1036+ messages in thread


end of thread, other threads:[~2026-05-14 03:05 UTC | newest]

Thread overview: 1036+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2025-03-07 14:44 [PATCH v2 2/4] tests: Add note if BackgroundPsql::wait_connect() fails Andres Freund <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>
2026-05-14 03:05 [PATCH v1 1/1] teach vacuumlo to handle domains over oid Nathan Bossart <[email protected]>

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox