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?