Skip to content

Commit b73d8d2

Browse files
committed
Improve opr_sanity regression test to check oprltcmpop and opgtcmpop
mergejoin links.
1 parent f400381 commit b73d8d2

File tree

2 files changed

+79
-55
lines changed

2 files changed

+79
-55
lines changed

src/test/regress/expected/opr_sanity.out

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -316,9 +316,13 @@ WHERE p1.oprnegate = p2.oid AND
316316
(0 rows)
317317

318318
-- Look for mergejoin operators that don't match their links.
319-
-- A mergejoin link leads from an '=' operator to the
319+
-- An lsortop/rsortop link leads from an '=' operator to the
320320
-- sort operator ('<' operator) that's appropriate for
321321
-- its left-side or right-side data type.
322+
-- An ltcmpop/gtcmpop link leads from an '=' operator to the
323+
-- '<' or '>' operator of the same input datatypes.
324+
-- (If the '=' operator has identical L and R input datatypes,
325+
-- then lsortop, rsortop, and ltcmpop are all the same operator.)
322326
SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode
323327
FROM pg_operator AS p1, pg_operator AS p2
324328
WHERE p1.oprlsortop = p2.oid AND
@@ -327,8 +331,7 @@ WHERE p1.oprlsortop = p2.oid AND
327331
p1.oprleft != p2.oprleft OR
328332
p1.oprleft != p2.oprright OR
329333
p1.oprresult != 'bool'::regtype OR
330-
p2.oprresult != 'bool'::regtype OR
331-
p1.oprrsortop = 0);
334+
p2.oprresult != 'bool'::regtype);
332335
oid | oprcode | oid | oprcode
333336
-----+---------+-----+---------
334337
(0 rows)
@@ -341,42 +344,52 @@ WHERE p1.oprrsortop = p2.oid AND
341344
p1.oprright != p2.oprleft OR
342345
p1.oprright != p2.oprright OR
343346
p1.oprresult != 'bool'::regtype OR
344-
p2.oprresult != 'bool'::regtype OR
345-
p1.oprlsortop = 0);
347+
p2.oprresult != 'bool'::regtype);
346348
oid | oprcode | oid | oprcode
347349
-----+---------+-----+---------
348350
(0 rows)
349351

350-
-- A mergejoinable = operator must have a commutator (usually itself)
351-
-- as well as corresponding < and > operators. Note that the "corresponding"
352-
-- operators have the same L and R input datatypes as the = operator,
353-
-- whereas the operators linked to by oprlsortop and oprrsortop have input
354-
-- datatypes L,L and R,R respectively.
355-
SELECT p1.oid, p1.oprname FROM pg_operator AS p1
356-
WHERE p1.oprlsortop != 0 AND
357-
p1.oprcom = 0;
358-
oid | oprname
359-
-----+---------
352+
SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode
353+
FROM pg_operator AS p1, pg_operator AS p2
354+
WHERE p1.oprltcmpop = p2.oid AND
355+
(p1.oprname != '=' OR p2.oprname != '<' OR
356+
p1.oprkind != 'b' OR p2.oprkind != 'b' OR
357+
p1.oprleft != p2.oprleft OR
358+
p1.oprright != p2.oprright OR
359+
p1.oprresult != 'bool'::regtype OR
360+
p2.oprresult != 'bool'::regtype);
361+
oid | oprcode | oid | oprcode
362+
-----+---------+-----+---------
360363
(0 rows)
361364

362-
SELECT p1.oid, p1.oprname FROM pg_operator AS p1
363-
WHERE p1.oprlsortop != 0 AND NOT
364-
EXISTS(SELECT 1 FROM pg_operator AS p2 WHERE
365-
p2.oprname = '<' AND
366-
p2.oprleft = p1.oprleft AND
367-
p2.oprright = p1.oprright AND
368-
p2.oprkind = 'b');
369-
oid | oprname
365+
SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode
366+
FROM pg_operator AS p1, pg_operator AS p2
367+
WHERE p1.oprgtcmpop = p2.oid AND
368+
(p1.oprname != '=' OR p2.oprname != '>' OR
369+
p1.oprkind != 'b' OR p2.oprkind != 'b' OR
370+
p1.oprleft != p2.oprleft OR
371+
p1.oprright != p2.oprright OR
372+
p1.oprresult != 'bool'::regtype OR
373+
p2.oprresult != 'bool'::regtype);
374+
oid | oprcode | oid | oprcode
375+
-----+---------+-----+---------
376+
(0 rows)
377+
378+
-- Make sure all four links are specified if any are.
379+
SELECT p1.oid, p1.oprcode
380+
FROM pg_operator AS p1
381+
WHERE NOT ((oprlsortop = 0 AND oprrsortop = 0 AND
382+
oprltcmpop = 0 AND oprgtcmpop = 0) OR
383+
(oprlsortop != 0 AND oprrsortop != 0 AND
384+
oprltcmpop != 0 AND oprgtcmpop != 0));
385+
oid | oprcode
370386
-----+---------
371387
(0 rows)
372388

389+
-- A mergejoinable = operator must have a commutator (usually itself).
373390
SELECT p1.oid, p1.oprname FROM pg_operator AS p1
374-
WHERE p1.oprlsortop != 0 AND NOT
375-
EXISTS(SELECT 1 FROM pg_operator AS p2 WHERE
376-
p2.oprname = '>' AND
377-
p2.oprleft = p1.oprleft AND
378-
p2.oprright = p1.oprright AND
379-
p2.oprkind = 'b');
391+
WHERE p1.oprlsortop != 0 AND
392+
p1.oprcom = 0;
380393
oid | oprname
381394
-----+---------
382395
(0 rows)

src/test/regress/sql/opr_sanity.sql

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,13 @@ WHERE p1.oprnegate = p2.oid AND
259259
p1.oid = p2.oid);
260260

261261
-- Look for mergejoin operators that don't match their links.
262-
-- A mergejoin link leads from an '=' operator to the
262+
-- An lsortop/rsortop link leads from an '=' operator to the
263263
-- sort operator ('<' operator) that's appropriate for
264264
-- its left-side or right-side data type.
265+
-- An ltcmpop/gtcmpop link leads from an '=' operator to the
266+
-- '<' or '>' operator of the same input datatypes.
267+
-- (If the '=' operator has identical L and R input datatypes,
268+
-- then lsortop, rsortop, and ltcmpop are all the same operator.)
265269

266270
SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode
267271
FROM pg_operator AS p1, pg_operator AS p2
@@ -271,8 +275,7 @@ WHERE p1.oprlsortop = p2.oid AND
271275
p1.oprleft != p2.oprleft OR
272276
p1.oprleft != p2.oprright OR
273277
p1.oprresult != 'bool'::regtype OR
274-
p2.oprresult != 'bool'::regtype OR
275-
p1.oprrsortop = 0);
278+
p2.oprresult != 'bool'::regtype);
276279

277280
SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode
278281
FROM pg_operator AS p1, pg_operator AS p2
@@ -282,34 +285,42 @@ WHERE p1.oprrsortop = p2.oid AND
282285
p1.oprright != p2.oprleft OR
283286
p1.oprright != p2.oprright OR
284287
p1.oprresult != 'bool'::regtype OR
285-
p2.oprresult != 'bool'::regtype OR
286-
p1.oprlsortop = 0);
288+
p2.oprresult != 'bool'::regtype);
287289

288-
-- A mergejoinable = operator must have a commutator (usually itself)
289-
-- as well as corresponding < and > operators. Note that the "corresponding"
290-
-- operators have the same L and R input datatypes as the = operator,
291-
-- whereas the operators linked to by oprlsortop and oprrsortop have input
292-
-- datatypes L,L and R,R respectively.
290+
SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode
291+
FROM pg_operator AS p1, pg_operator AS p2
292+
WHERE p1.oprltcmpop = p2.oid AND
293+
(p1.oprname != '=' OR p2.oprname != '<' OR
294+
p1.oprkind != 'b' OR p2.oprkind != 'b' OR
295+
p1.oprleft != p2.oprleft OR
296+
p1.oprright != p2.oprright OR
297+
p1.oprresult != 'bool'::regtype OR
298+
p2.oprresult != 'bool'::regtype);
293299

294-
SELECT p1.oid, p1.oprname FROM pg_operator AS p1
295-
WHERE p1.oprlsortop != 0 AND
296-
p1.oprcom = 0;
300+
SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode
301+
FROM pg_operator AS p1, pg_operator AS p2
302+
WHERE p1.oprgtcmpop = p2.oid AND
303+
(p1.oprname != '=' OR p2.oprname != '>' OR
304+
p1.oprkind != 'b' OR p2.oprkind != 'b' OR
305+
p1.oprleft != p2.oprleft OR
306+
p1.oprright != p2.oprright OR
307+
p1.oprresult != 'bool'::regtype OR
308+
p2.oprresult != 'bool'::regtype);
297309

298-
SELECT p1.oid, p1.oprname FROM pg_operator AS p1
299-
WHERE p1.oprlsortop != 0 AND NOT
300-
EXISTS(SELECT 1 FROM pg_operator AS p2 WHERE
301-
p2.oprname = '<' AND
302-
p2.oprleft = p1.oprleft AND
303-
p2.oprright = p1.oprright AND
304-
p2.oprkind = 'b');
310+
-- Make sure all four links are specified if any are.
311+
312+
SELECT p1.oid, p1.oprcode
313+
FROM pg_operator AS p1
314+
WHERE NOT ((oprlsortop = 0 AND oprrsortop = 0 AND
315+
oprltcmpop = 0 AND oprgtcmpop = 0) OR
316+
(oprlsortop != 0 AND oprrsortop != 0 AND
317+
oprltcmpop != 0 AND oprgtcmpop != 0));
318+
319+
-- A mergejoinable = operator must have a commutator (usually itself).
305320

306321
SELECT p1.oid, p1.oprname FROM pg_operator AS p1
307-
WHERE p1.oprlsortop != 0 AND NOT
308-
EXISTS(SELECT 1 FROM pg_operator AS p2 WHERE
309-
p2.oprname = '>' AND
310-
p2.oprleft = p1.oprleft AND
311-
p2.oprright = p1.oprright AND
312-
p2.oprkind = 'b');
322+
WHERE p1.oprlsortop != 0 AND
323+
p1.oprcom = 0;
313324

314325
-- Mergejoinable operators across datatypes must come in closed sets, that
315326
-- is if you provide int2 = int4 and int4 = int8 then you must also provide

0 commit comments

Comments
 (0)