# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

CREATE TABLE r (src INT, dst INT);
CREATE TABLE s (src INT, dst INT);
CREATE TABLE t (src INT, dst INT);

INSERT INTO s VALUES(0, 0);
INSERT INTO s VALUES(1, 5);

INSERT INTO t VALUES(0, 0);
INSERT INTO t VALUES(0, 0);
--
==

\analyze
--
Analyzing r ... done
Analyzing s ... done
Analyzing t ... done
==

SELECT r.src, r.dst FROM r;
--
+-----------+-----------+
|src        |dst        |
+-----------+-----------+
+-----------+-----------+
==

# One side of InnerJoin is empty.
SELECT r.src, r.dst
FROM r, t
WHERE r.src = t.src AND r.dst = t.dst;
--
+-----------+-----------+
|src        |dst        |
+-----------+-----------+
+-----------+-----------+
==

# One side of LeftSemiJoin is empty.
SELECT s.src, s.dst
FROM s
WHERE EXISTS(
    SELECT r.src, r.dst FROM r WHERE s.src=r.src AND s.dst=r.dst);
--
+-----------+-----------+
|src        |dst        |
+-----------+-----------+
+-----------+-----------+
==

# One side of LeftAntiJoin is empty.
SELECT s.src, s.dst
FROM s
WHERE NOT EXISTS(
    SELECT r.src, r.dst FROM r WHERE s.src=r.src AND s.dst=r.dst);
--
+-----------+-----------+
|src        |dst        |
+-----------+-----------+
|          0|          0|
|          1|          5|
+-----------+-----------+
==

# Union between an empty relation and a non-empty.
SELECT r.src, r.dst FROM r
UNION
SELECT t.src, t.dst FROM t;
--
+-----------+-----------+
|src        |dst        |
+-----------+-----------+
|          0|          0|
+-----------+-----------+
==

# Union All between an empty relation and a non-empty.
SELECT r.src, r.dst FROM r
UNION ALL
SELECT t.src, t.dst FROM t;
--
+-----------+-----------+
|src        |dst        |
+-----------+-----------+
|          0|          0|
|          0|          0|
+-----------+-----------+
==

# Union on two InnerJoins, one of which involves an empty relation.
SELECT r.src, r.dst FROM r, s WHERE r.src=s.src AND r.dst=s.dst
UNION
SELECT s.src, s.dst FROM s, t WHERE s.src=t.src AND s.dst=t.dst;
--
+-----------+-----------+
|src        |dst        |
+-----------+-----------+
|          0|          0|
+-----------+-----------+
==

# Union All on two InnerJoins, one of which involves an empty relation.
SELECT r.src, r.dst FROM r, s WHERE r.src=s.src AND r.dst=s.dst
UNION ALL
SELECT s.src, s.dst FROM s, t WHERE s.src=t.src AND s.dst=t.dst;
--
+-----------+-----------+
|src        |dst        |
+-----------+-----------+
|          0|          0|
|          0|          0|
+-----------+-----------+
==

DROP TABLE r;
DROP TABLE s;
DROP TABLE t;
--
==
