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?