Here is the algorithm for ‘SUPERJOIN’, which generates the question about ‘how many possible binary operators’:
Attribs a3={}
For a1 in r1.attribs
If L and a1 not in rel2.attribs then a3 += a1
If C and a1 in rel2.attribs then a3 += a1
For a2 in r2.attribs
If R and a2 not in rel1.attribs then a3 += a2
Tuple t3(a3)={}
For t1 in r1.tuples
For t2 in r2.tuples
If T and t1 not match t2 then t3 += t1
If M and t1 match t2 then t3 += t1 + t2 // <<-- see note
If B and t1 not match t2 then t3 += t2
Relation r3(a3,t3)
These are set operations, so duplicate attributes and tuples are discarded. The final result is r3 with heading a3. The operation ‘+’ is taken to mean a new tuple that is the union of its arguments. It occurs to me that a different operation could be substituted at this point, with different outcomes.
The above generates the results in this table:
| L | C | R | LC | CR | LR | LCR | |
| T | ✓ | ✓ | ✓ | ||||
| M | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| B | ✓ | ✓ | ✓ | ||||
| TM | ✓ | ✓ | ✓ | ||||
| TB | ✓ | ||||||
| MB | ✓ | ✓ | ✓ | ||||
| TMB | ✓ |
Every tick is a unique outcome. Blanks are either OUTER joins or empty. The question is: which if any well-known binary (dyadic) algebraic operations on relations cannot be generated by this algorithm?