@_infer_type.register(irast.SetOp)
def __infer_setop(ir, schema):
    left_type = infer_type(ir.left, schema).material_type()
    right_type = infer_type(ir.right, schema).material_type()
    if (ir.op == qlast.UNION):
        if left_type.issubclass(right_type):
            result = left_type
        elif right_type.issubclass(left_type):
            result = right_type
        else:
            result = s_inh.create_virtual_parent(schema, [left_type, right_type])
    else:
        result = infer_type(ir.left, schema)
        s_inh.create_virtual_parent(schema, [left_type, right_type])
    return result
@_infer_type.register(irast.SetOp)
def __infer_setop(ir, schema):
    left_type = infer_type(ir.left, schema).material_type()
    right_type = infer_type(ir.right, schema).material_type()
    if (ir.op == qlast.UNION):
        if left_type.issubclass(right_type):
            result = left_type
        elif right_type.issubclass(left_type):
            result = right_type
        else:
            result = s_inh.create_virtual_parent(schema, [left_type, right_type])
    else:
        result = infer_type(ir.left, schema)
        s_inh.create_virtual_parent(schema, [left_type, right_type])
    return result