diff --git a/docs/generated/sql/operators.md b/docs/generated/sql/operators.md
index 99c556edc5e0..04b3710bb2b8 100644
--- a/docs/generated/sql/operators.md
+++ b/docs/generated/sql/operators.md
@@ -176,10 +176,12 @@
int < decimal | bool |
int < float | bool |
int < int | bool |
+int < oid | bool |
int[] < int[] | bool |
interval < interval | bool |
interval[] < interval[] | bool |
jsonb < jsonb | bool |
+oid < int | bool |
oid < oid | bool |
string < string | bool |
string[] < string[] | bool |
@@ -237,10 +239,12 @@
int <= decimal | bool |
int <= float | bool |
int <= int | bool |
+int <= oid | bool |
int[] <= int[] | bool |
interval <= interval | bool |
interval[] <= interval[] | bool |
jsonb <= jsonb | bool |
+oid <= int | bool |
oid <= oid | bool |
string <= string | bool |
string[] <= string[] | bool |
@@ -297,10 +301,12 @@
int = decimal | bool |
int = float | bool |
int = int | bool |
+int = oid | bool |
int[] = int[] | bool |
interval = interval | bool |
interval[] = interval[] | bool |
jsonb = jsonb | bool |
+oid = int | bool |
oid = oid | bool |
string = string | bool |
string[] = string[] | bool |
@@ -411,10 +417,12 @@
int IS NOT DISTINCT FROM decimal | bool |
int IS NOT DISTINCT FROM float | bool |
int IS NOT DISTINCT FROM int | bool |
+int IS NOT DISTINCT FROM oid | bool |
int[] IS NOT DISTINCT FROM int[] | bool |
interval IS NOT DISTINCT FROM interval | bool |
interval[] IS NOT DISTINCT FROM interval[] | bool |
jsonb IS NOT DISTINCT FROM jsonb | bool |
+oid IS NOT DISTINCT FROM int | bool |
oid IS NOT DISTINCT FROM oid | bool |
string IS NOT DISTINCT FROM string | bool |
string[] IS NOT DISTINCT FROM string[] | bool |
diff --git a/pkg/sql/logictest/testdata/logic_test/pgoidtype b/pkg/sql/logictest/testdata/logic_test/pgoidtype
index 1f7cf7ccb0b1..475df7ffc9ea 100644
--- a/pkg/sql/logictest/testdata/logic_test/pgoidtype
+++ b/pkg/sql/logictest/testdata/logic_test/pgoidtype
@@ -326,3 +326,24 @@ query TT
SELECT 1::OID::TEXT, quote_literal(1::OID)
----
1 '1'
+
+# Allow INT-OID comparison. Regression test for #53143.
+statement ok
+SELECT
+ c.oid,
+ a.attnum,
+ a.attname,
+ c.relname,
+ n.nspname,
+ a.attnotnull
+ OR (t.typtype = 'd' AND t.typnotnull),
+ pg_catalog.pg_get_expr(d.adbin, d.adrelid) LIKE '%nextval(%'
+FROM
+ pg_catalog.pg_class AS c
+ JOIN pg_catalog.pg_namespace AS n ON (c.relnamespace = n.oid)
+ JOIN pg_catalog.pg_attribute AS a ON (c.oid = a.attrelid)
+ JOIN pg_catalog.pg_type AS t ON (a.atttypid = t.oid)
+ LEFT JOIN pg_catalog.pg_attrdef AS d ON
+ (d.adrelid = a.attrelid AND d.adnum = a.attnum)
+ JOIN (SELECT 1 AS oid, 1 AS attnum) AS vals ON
+ (c.oid = vals.oid AND a.attnum = vals.attnum);
diff --git a/pkg/sql/sem/tree/datum.go b/pkg/sql/sem/tree/datum.go
index e7bd91e0e895..ec8c2da0276f 100644
--- a/pkg/sql/sem/tree/datum.go
+++ b/pkg/sql/sem/tree/datum.go
@@ -684,6 +684,8 @@ func (d *DInt) Compare(ctx *EvalContext, other Datum) int {
v = *t
case *DFloat, *DDecimal:
return -t.Compare(ctx, d)
+ case *DOid:
+ v = t.DInt
default:
panic(makeUnsupportedComparisonMessage(d, other))
}
@@ -4235,14 +4237,20 @@ func (d *DOid) Compare(ctx *EvalContext, other Datum) int {
// NULL is less than any non-NULL value.
return 1
}
- v, ok := UnwrapDatum(ctx, other).(*DOid)
- if !ok {
+ var v DInt
+ switch t := UnwrapDatum(ctx, other).(type) {
+ case *DOid:
+ v = t.DInt
+ case *DInt:
+ v = *t
+ default:
panic(makeUnsupportedComparisonMessage(d, other))
}
- if d.DInt < v.DInt {
+
+ if d.DInt < v {
return -1
}
- if d.DInt > v.DInt {
+ if d.DInt > v {
return 1
}
return 0
diff --git a/pkg/sql/sem/tree/eval.go b/pkg/sql/sem/tree/eval.go
index 11e64fccdfb6..479ba7d14234 100644
--- a/pkg/sql/sem/tree/eval.go
+++ b/pkg/sql/sem/tree/eval.go
@@ -2083,6 +2083,8 @@ var CmpOps = cmpOpFixups(map[ComparisonOperator]cmpOpOverload{
makeEqFn(types.Float, types.Int, VolatilityLeakProof),
makeEqFn(types.Int, types.Decimal, VolatilityLeakProof),
makeEqFn(types.Int, types.Float, VolatilityLeakProof),
+ makeEqFn(types.Int, types.Oid, VolatilityLeakProof),
+ makeEqFn(types.Oid, types.Int, VolatilityLeakProof),
makeEqFn(types.Timestamp, types.Date, VolatilityImmutable),
makeEqFn(types.Timestamp, types.TimestampTZ, VolatilityStable),
makeEqFn(types.TimestampTZ, types.Date, VolatilityStable),
@@ -2137,6 +2139,8 @@ var CmpOps = cmpOpFixups(map[ComparisonOperator]cmpOpOverload{
makeLtFn(types.Float, types.Int, VolatilityLeakProof),
makeLtFn(types.Int, types.Decimal, VolatilityLeakProof),
makeLtFn(types.Int, types.Float, VolatilityLeakProof),
+ makeLtFn(types.Int, types.Oid, VolatilityLeakProof),
+ makeLtFn(types.Oid, types.Int, VolatilityLeakProof),
makeLtFn(types.Timestamp, types.Date, VolatilityImmutable),
makeLtFn(types.Timestamp, types.TimestampTZ, VolatilityStable),
makeLtFn(types.TimestampTZ, types.Date, VolatilityStable),
@@ -2191,6 +2195,8 @@ var CmpOps = cmpOpFixups(map[ComparisonOperator]cmpOpOverload{
makeLeFn(types.Float, types.Int, VolatilityLeakProof),
makeLeFn(types.Int, types.Decimal, VolatilityLeakProof),
makeLeFn(types.Int, types.Float, VolatilityLeakProof),
+ makeLeFn(types.Int, types.Oid, VolatilityLeakProof),
+ makeLeFn(types.Oid, types.Int, VolatilityLeakProof),
makeLeFn(types.Timestamp, types.Date, VolatilityImmutable),
makeLeFn(types.Timestamp, types.TimestampTZ, VolatilityStable),
makeLeFn(types.TimestampTZ, types.Date, VolatilityStable),
@@ -2255,6 +2261,8 @@ var CmpOps = cmpOpFixups(map[ComparisonOperator]cmpOpOverload{
makeIsFn(types.Float, types.Int, VolatilityLeakProof),
makeIsFn(types.Int, types.Decimal, VolatilityLeakProof),
makeIsFn(types.Int, types.Float, VolatilityLeakProof),
+ makeIsFn(types.Int, types.Oid, VolatilityLeakProof),
+ makeIsFn(types.Oid, types.Int, VolatilityLeakProof),
makeIsFn(types.Timestamp, types.Date, VolatilityImmutable),
makeIsFn(types.Timestamp, types.TimestampTZ, VolatilityStable),
makeIsFn(types.TimestampTZ, types.Date, VolatilityStable),
diff --git a/pkg/sql/sem/tree/testdata/eval/oid b/pkg/sql/sem/tree/testdata/eval/oid
index 5bfc17f0139a..df7c630a7cb0 100644
--- a/pkg/sql/sem/tree/testdata/eval/oid
+++ b/pkg/sql/sem/tree/testdata/eval/oid
@@ -12,3 +12,18 @@ eval
3:::REGCLASS
----
3
+
+eval
+1:::OID = 1:::INT
+----
+true
+
+eval
+1:::OID < 2:::INT2
+----
+true
+
+eval
+1:::OID >= 3:::INT
+----
+false