﻿:: { n:i8, s:i8*, b:b, k:s }

// All false

CrossJoin(x:s, y:s, false, "match")
CrossJoin(x:s, y:Range(0), false, "match")
CrossJoin(x:s, y:Range(1), false, "match")
CrossJoin(x:s, y:Range(7), false, "match")
CrossJoin(x:Range(0), y:s, false, "match")
CrossJoin(x:Range(0), y:Range(0), false, "match")
CrossJoin(x:Range(0), y:Range(1), false, "match")
CrossJoin(x:Range(0), y:Range(7), false, "match")
CrossJoin(x:Range(1), y:s, false, "match")
CrossJoin(x:Range(1), y:Range(0), false, "match")
CrossJoin(x:Range(1), y:Range(1), false, "match")
CrossJoin(x:Range(1), y:Range(7), false, "match")
CrossJoin(x:Range(10), y:s, false, "match")
CrossJoin(x:Range(10), y:Range(0), false, "match")
CrossJoin(x:Range(10), y:Range(1), false, "match")
CrossJoin(x:Range(10), y:Range(7), false, "match")

CrossJoin(x:s, y:s, false, "match", "left")
CrossJoin(x:s, y:Range(0), false, "match", "left")
CrossJoin(x:s, y:Range(1), false, "match", "left")
CrossJoin(x:s, y:Range(7), false, "match", "left")
CrossJoin(x:Range(0), y:s, false, "match", "left")
CrossJoin(x:Range(0), y:Range(0), false, "match", "left")
CrossJoin(x:Range(0), y:Range(1), false, "match", "left")
CrossJoin(x:Range(0), y:Range(7), false, "match", "left")
CrossJoin(x:Range(1), y:s, false, "match", "left")
CrossJoin(x:Range(1), y:Range(0), false, "match", "left")
CrossJoin(x:Range(1), y:Range(1), false, "match", "left")
CrossJoin(x:Range(1), y:Range(7), false, "match", "left")
CrossJoin(x:Range(10), y:s, false, "match", "left")
CrossJoin(x:Range(10), y:Range(0), false, "match", "left")
CrossJoin(x:Range(10), y:Range(1), false, "match", "left")
CrossJoin(x:Range(10), y:Range(7), false, "match", "left")

CrossJoin(x:s, y:s, false, "match", "left", "right")
CrossJoin(x:s, y:Range(0), false, "match", "left", "right")
CrossJoin(x:s, y:Range(1), false, "match", "left", "right")
CrossJoin(x:s, y:Range(7), false, "match", "left", "right")
CrossJoin(x:Range(0), y:s, false, "match", "left", "right")
CrossJoin(x:Range(0), y:Range(0), false, "match", "left", "right")
CrossJoin(x:Range(0), y:Range(1), false, "match", "left", "right")
CrossJoin(x:Range(0), y:Range(7), false, "match", "left", "right")
CrossJoin(x:Range(1), y:s, false, "match", "left", "right")
CrossJoin(x:Range(1), y:Range(0), false, "match", "left", "right")
CrossJoin(x:Range(1), y:Range(1), false, "match", "left", "right")
CrossJoin(x:Range(1), y:Range(7), false, "match", "left", "right")
CrossJoin(x:Range(10), y:s, false, "match", "left", "right")
CrossJoin(x:Range(10), y:Range(0), false, "match", "left", "right")
CrossJoin(x:Range(10), y:Range(1), false, "match", "left", "right")
CrossJoin(x:Range(10), y:Range(7), false, "match", "left", "right")

// All true

CrossJoin(x:s, y:s, true, "match")
CrossJoin(x:s, y:Range(0), true, "match")
CrossJoin(x:s, y:Range(1), true, "match")
CrossJoin(x:s, y:Range(7), true, "match")
CrossJoin(x:Range(0), y:s, true, "match")
CrossJoin(x:Range(0), y:Range(0), true, "match")
CrossJoin(x:Range(0), y:Range(1), true, "match")
CrossJoin(x:Range(0), y:Range(7), true, "match")
CrossJoin(x:Range(1), y:s, true, "match")
CrossJoin(x:Range(1), y:Range(0), true, "match")
CrossJoin(x:Range(1), y:Range(1), true, "match")
CrossJoin(x:Range(1), y:Range(7), true, "match")
CrossJoin(x:Range(10), y:s, true, "match")
CrossJoin(x:Range(10), y:Range(0), true, "match")
CrossJoin(x:Range(10), y:Range(1), true, "match")
CrossJoin(x:Range(10), y:Range(7), true, "match")

CrossJoin(x:s, y:s, true, "match", "left")
CrossJoin(x:s, y:Range(0), true, "match", "left")
CrossJoin(x:s, y:Range(1), true, "match", "left")
CrossJoin(x:s, y:Range(7), true, "match", "left")
CrossJoin(x:Range(0), y:s, true, "match", "left")
CrossJoin(x:Range(0), y:Range(0), true, "match", "left")
CrossJoin(x:Range(0), y:Range(1), true, "match", "left")
CrossJoin(x:Range(0), y:Range(7), true, "match", "left")
CrossJoin(x:Range(1), y:s, true, "match", "left")
CrossJoin(x:Range(1), y:Range(0), true, "match", "left")
CrossJoin(x:Range(1), y:Range(1), true, "match", "left")
CrossJoin(x:Range(1), y:Range(7), true, "match", "left")
CrossJoin(x:Range(10), y:s, true, "match", "left")
CrossJoin(x:Range(10), y:Range(0), true, "match", "left")
CrossJoin(x:Range(10), y:Range(1), true, "match", "left")
CrossJoin(x:Range(10), y:Range(7), true, "match", "left")

CrossJoin(x:s, y:s, true, "match", "left", "right")
CrossJoin(x:s, y:Range(0), true, "match", "left", "right")
CrossJoin(x:s, y:Range(1), true, "match", "left", "right")
CrossJoin(x:s, y:Range(7), true, "match", "left", "right")
CrossJoin(x:Range(0), y:s, true, "match", "left", "right")
CrossJoin(x:Range(0), y:Range(0), true, "match", "left", "right")
CrossJoin(x:Range(0), y:Range(1), true, "match", "left", "right")
CrossJoin(x:Range(0), y:Range(7), true, "match", "left", "right")
CrossJoin(x:Range(1), y:s, true, "match", "left", "right")
CrossJoin(x:Range(1), y:Range(0), true, "match", "left", "right")
CrossJoin(x:Range(1), y:Range(1), true, "match", "left", "right")
CrossJoin(x:Range(1), y:Range(7), true, "match", "left", "right")
CrossJoin(x:Range(10), y:s, true, "match", "left", "right")
CrossJoin(x:Range(10), y:Range(0), true, "match", "left", "right")
CrossJoin(x:Range(10), y:Range(1), true, "match", "left", "right")
CrossJoin(x:Range(10), y:Range(7), true, "match", "left", "right")

// Unknown

CrossJoin(x:s, y:s, b, "match")
CrossJoin(x:s, y:Range(0), b, "match")
CrossJoin(x:s, y:Range(1), b, "match")
CrossJoin(x:s, y:Range(7), b, "match")
CrossJoin(x:Range(0), y:s, b, "match")
CrossJoin(x:Range(0), y:Range(0), b, "match")
CrossJoin(x:Range(0), y:Range(1), b, "match")
CrossJoin(x:Range(0), y:Range(7), b, "match")
CrossJoin(x:Range(1), y:s, b, "match")
CrossJoin(x:Range(1), y:Range(0), b, "match")
CrossJoin(x:Range(1), y:Range(1), b, "match")
CrossJoin(x:Range(1), y:Range(7), b, "match")
CrossJoin(x:Range(10), y:s, b, "match")
CrossJoin(x:Range(10), y:Range(0), b, "match")
CrossJoin(x:Range(10), y:Range(1), b, "match")
CrossJoin(x:Range(10), y:Range(7), b, "match")

CrossJoin(x:s, y:s, b, "match", "left")
CrossJoin(x:s, y:Range(0), b, "match", "left")
CrossJoin(x:s, y:Range(1), b, "match", "left")
CrossJoin(x:s, y:Range(7), b, "match", "left")
CrossJoin(x:Range(0), y:s, b, "match", "left")
CrossJoin(x:Range(0), y:Range(0), b, "match", "left")
CrossJoin(x:Range(0), y:Range(1), b, "match", "left")
CrossJoin(x:Range(0), y:Range(7), b, "match", "left")
CrossJoin(x:Range(1), y:s, b, "match", "left")
CrossJoin(x:Range(1), y:Range(0), b, "match", "left")
CrossJoin(x:Range(1), y:Range(1), b, "match", "left")
CrossJoin(x:Range(1), y:Range(7), b, "match", "left")
CrossJoin(x:Range(10), y:s, b, "match", "left")
CrossJoin(x:Range(10), y:Range(0), b, "match", "left")
CrossJoin(x:Range(10), y:Range(1), b, "match", "left")
CrossJoin(x:Range(10), y:Range(7), b, "match", "left")

CrossJoin(x:s, y:s, b, "match", "left", "right")
CrossJoin(x:s, y:Range(0), b, "match", "left", "right")
CrossJoin(x:s, y:Range(1), b, "match", "left", "right")
CrossJoin(x:s, y:Range(7), b, "match", "left", "right")
CrossJoin(x:Range(0), y:s, b, "match", "left", "right")
CrossJoin(x:Range(0), y:Range(0), b, "match", "left", "right")
CrossJoin(x:Range(0), y:Range(1), b, "match", "left", "right")
CrossJoin(x:Range(0), y:Range(7), b, "match", "left", "right")
CrossJoin(x:Range(1), y:s, b, "match", "left", "right")
CrossJoin(x:Range(1), y:Range(0), b, "match", "left", "right")
CrossJoin(x:Range(1), y:Range(1), b, "match", "left", "right")
CrossJoin(x:Range(1), y:Range(7), b, "match", "left", "right")
CrossJoin(x:Range(10), y:s, b, "match", "left", "right")
CrossJoin(x:Range(10), y:Range(0), b, "match", "left", "right")
CrossJoin(x:Range(10), y:Range(1), b, "match", "left", "right")
CrossJoin(x:Range(10), y:Range(7), b, "match", "left", "right")


// Key

KeyJoin(x:s, y:s, k, k, "match")
KeyJoin(x:s, y:Range(0), k, k, "match")
KeyJoin(x:s, y:Range(1), k, k, "match")
KeyJoin(x:s, y:Range(7), k, k, "match")
KeyJoin(x:Range(0), y:s, k, k, "match")
KeyJoin(x:Range(0), y:Range(0), k, k, "match")
KeyJoin(x:Range(0), y:Range(1), k, k, "match")
KeyJoin(x:Range(0), y:Range(7), k, k, "match")
KeyJoin(x:Range(1), y:s, k, k, "match")
KeyJoin(x:Range(1), y:Range(0), k, k, "match")
KeyJoin(x:Range(1), y:Range(1), k, k, "match")
KeyJoin(x:Range(1), y:Range(7), k, k, "match")
KeyJoin(x:Range(10), y:s, k, k, "match")
KeyJoin(x:Range(10), y:Range(0), k, k, "match")
KeyJoin(x:Range(10), y:Range(1), k, k, "match")
KeyJoin(x:Range(10), y:Range(7), k, k, "match")

KeyJoin(x:s, y:s, k, k, "match", "left")
KeyJoin(x:s, y:Range(0), k, k, "match", "left")
KeyJoin(x:s, y:Range(1), k, k, "match", "left")
KeyJoin(x:s, y:Range(7), k, k, "match", "left")
KeyJoin(x:Range(0), y:s, k, k, "match", "left")
KeyJoin(x:Range(0), y:Range(0), k, k, "match", "left")
KeyJoin(x:Range(0), y:Range(1), k, k, "match", "left")
KeyJoin(x:Range(0), y:Range(7), k, k, "match", "left")
KeyJoin(x:Range(1), y:s, k, k, "match", "left")
KeyJoin(x:Range(1), y:Range(0), k, k, "match", "left")
KeyJoin(x:Range(1), y:Range(1), k, k, "match", "left")
KeyJoin(x:Range(1), y:Range(7), k, k, "match", "left")
KeyJoin(x:Range(10), y:s, k, k, "match", "left")
KeyJoin(x:Range(10), y:Range(0), k, k, "match", "left")
KeyJoin(x:Range(10), y:Range(1), k, k, "match", "left")
KeyJoin(x:Range(10), y:Range(7), k, k, "match", "left")

KeyJoin(x:s, y:s, k, k, "match", "left", "right")
KeyJoin(x:s, y:Range(0), k, k, "match", "left", "right")
KeyJoin(x:s, y:Range(1), k, k, "match", "left", "right")
KeyJoin(x:s, y:Range(7), k, k, "match", "left", "right")
KeyJoin(x:Range(0), y:s, k, k, "match", "left", "right")
KeyJoin(x:Range(0), y:Range(0), k, k, "match", "left", "right")
KeyJoin(x:Range(0), y:Range(1), k, k, "match", "left", "right")
KeyJoin(x:Range(0), y:Range(7), k, k, "match", "left", "right")
KeyJoin(x:Range(1), y:s, k, k, "match", "left", "right")
KeyJoin(x:Range(1), y:Range(0), k, k, "match", "left", "right")
KeyJoin(x:Range(1), y:Range(1), k, k, "match", "left", "right")
KeyJoin(x:Range(1), y:Range(7), k, k, "match", "left", "right")
KeyJoin(x:Range(10), y:s, k, k, "match", "left", "right")
KeyJoin(x:Range(10), y:Range(0), k, k, "match", "left", "right")
KeyJoin(x:Range(10), y:Range(1), k, k, "match", "left", "right")
KeyJoin(x:Range(10), y:Range(7), k, k, "match", "left", "right")
