@@ -316,9 +316,13 @@ WHERE p1.oprnegate = p2.oid AND
316
316
(0 rows)
317
317
318
318
-- 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
320
320
-- sort operator ('<' operator) that's appropriate for
321
321
-- 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.)
322
326
SELECT p1.oid, p1.oprcode, p2.oid, p2.oprcode
323
327
FROM pg_operator AS p1, pg_operator AS p2
324
328
WHERE p1.oprlsortop = p2.oid AND
@@ -327,8 +331,7 @@ WHERE p1.oprlsortop = p2.oid AND
327
331
p1.oprleft != p2.oprleft OR
328
332
p1.oprleft != p2.oprright OR
329
333
p1.oprresult != 'bool'::regtype OR
330
- p2.oprresult != 'bool'::regtype OR
331
- p1.oprrsortop = 0);
334
+ p2.oprresult != 'bool'::regtype);
332
335
oid | oprcode | oid | oprcode
333
336
-----+---------+-----+---------
334
337
(0 rows)
@@ -341,42 +344,52 @@ WHERE p1.oprrsortop = p2.oid AND
341
344
p1.oprright != p2.oprleft OR
342
345
p1.oprright != p2.oprright OR
343
346
p1.oprresult != 'bool'::regtype OR
344
- p2.oprresult != 'bool'::regtype OR
345
- p1.oprlsortop = 0);
347
+ p2.oprresult != 'bool'::regtype);
346
348
oid | oprcode | oid | oprcode
347
349
-----+---------+-----+---------
348
350
(0 rows)
349
351
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
+ -----+---------+-----+---------
360
363
(0 rows)
361
364
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
370
386
-----+---------
371
387
(0 rows)
372
388
389
+ -- A mergejoinable = operator must have a commutator (usually itself).
373
390
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;
380
393
oid | oprname
381
394
-----+---------
382
395
(0 rows)
0 commit comments