# 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);
--
==

SELECT COUNT(*) FROM r;
--
+--------------------+
|COUNT(*)            |
+--------------------+
|                   0|
+--------------------+
==

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

SELECT COUNT(*) FROM r;
--
+--------------------+
|COUNT(*)            |
+--------------------+
|                   0|
+--------------------+
==

SELECT MIN(src) FROM r;
--
+-----------+
|MIN(src)   |
+-----------+
|       NULL|
+-----------+
==

INSERT INTO r SELECT * FROM s;
SELECT r.src, r.dst FROM r;
DELETE FROM r;
--
+-----------+-----------+
|src        |dst        |
+-----------+-----------+
|          0|          0|
|          1|          5|
+-----------+-----------+
==

# 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;
--
==
