|
| 1 | +/* |
| 2 | + * Licensed under the Apache License, Version 2.0 (the "License"); |
| 3 | + * you may not use this file except in compliance with the License. |
| 4 | + * You may obtain a copy of the License at |
| 5 | + * |
| 6 | + * http://www.apache.org/licenses/LICENSE-2.0 |
| 7 | + * |
| 8 | + * Unless required by applicable law or agreed to in writing, software |
| 9 | + * distributed under the License is distributed on an "AS IS" BASIS, |
| 10 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 11 | + * See the License for the specific language governing permissions and |
| 12 | + * limitations under the License. |
| 13 | + */ |
| 14 | +package com.facebook.plugin.arrow; |
| 15 | + |
| 16 | +import com.facebook.presto.tests.AbstractTestQueryFramework; |
| 17 | +import org.testng.annotations.Test; |
| 18 | + |
| 19 | +public abstract class AbstractTestArrowFlightNativeQueries |
| 20 | + extends AbstractTestQueryFramework |
| 21 | +{ |
| 22 | + @Test |
| 23 | + public void testFiltersAndProjections1() |
| 24 | + { |
| 25 | + assertQuery("SELECT * FROM nation"); |
| 26 | + assertQuery("SELECT * FROM nation WHERE nationkey = 4"); |
| 27 | + assertQuery("SELECT * FROM nation WHERE nationkey <> 4"); |
| 28 | + assertQuery("SELECT * FROM nation WHERE nationkey < 4"); |
| 29 | + assertQuery("SELECT * FROM nation WHERE nationkey <= 4"); |
| 30 | + assertQuery("SELECT * FROM nation WHERE nationkey > 4"); |
| 31 | + assertQuery("SELECT * FROM nation WHERE nationkey >= 4"); |
| 32 | + assertQuery("SELECT * FROM nation WHERE nationkey BETWEEN 3 AND 7"); |
| 33 | + assertQuery("SELECT * FROM nation WHERE nationkey IN (1, 3, 5)"); |
| 34 | + assertQuery("SELECT * FROM nation WHERE nationkey NOT IN (1, 3, 5)"); |
| 35 | + assertQuery("SELECT * FROM nation WHERE nationkey NOT IN (1, 8, 11)"); |
| 36 | + assertQuery("SELECT * FROM nation WHERE nationkey NOT IN (1, 2, 3)"); |
| 37 | + assertQuery("SELECT * FROM nation WHERE nationkey NOT IN (-14, 2)"); |
| 38 | + assertQuery("SELECT * FROM nation WHERE nationkey NOT IN (1, 2, 3, 4, 5, 10, 11, 12, 13)"); |
| 39 | + } |
| 40 | + |
| 41 | + @Test |
| 42 | + public void testFiltersAndProjections2() |
| 43 | + { |
| 44 | + assertQuery("SELECT * FROM nation WHERE nationkey NOT BETWEEN 3 AND 7"); |
| 45 | + assertQuery("SELECT * FROM nation WHERE nationkey NOT BETWEEN -10 AND 5"); |
| 46 | + assertQuery("SELECT * FROM nation WHERE nationkey < 5 OR nationkey > 10"); |
| 47 | + assertQuery("SELECT nationkey * 10, nationkey % 5, -nationkey, nationkey / 3 FROM nation"); |
| 48 | + assertQuery("SELECT *, nationkey / 3 FROM nation"); |
| 49 | + assertQuery("SELECT nationkey IS NULL FROM nation"); |
| 50 | + assertQuery("SELECT * FROM nation WHERE name <> 'SAUDI ARABIA'"); |
| 51 | + assertQuery("SELECT * FROM nation WHERE name NOT IN ('RUSSIA', 'UNITED STATES', 'CHINA')"); |
| 52 | + assertQuery("SELECT * FROM nation WHERE name NOT IN ('aaa', 'bbb', 'ccc', 'ddd')"); |
| 53 | + assertQuery("SELECT * FROM nation WHERE name NOT IN ('', ';', 'new country w1th $p3c1@l ch@r@c73r5')"); |
| 54 | + assertQuery("SELECT * FROM nation WHERE name NOT BETWEEN 'A' AND 'K'"); // should produce NegatedBytesRange |
| 55 | + assertQuery("SELECT * FROM nation WHERE name <= 'B' OR 'G' <= name"); |
| 56 | + } |
| 57 | + |
| 58 | + @Test |
| 59 | + public void testFiltersAndProjections3() |
| 60 | + { |
| 61 | + assertQuery("SELECT * FROM lineitem WHERE shipmode <> 'FOB'"); |
| 62 | + assertQuery("SELECT * FROM lineitem WHERE shipmode NOT IN ('RAIL', 'AIR')"); |
| 63 | + assertQuery("SELECT * FROM lineitem WHERE shipmode NOT IN ('', 'TRUCK', 'FOB', 'RAIL')"); |
| 64 | + |
| 65 | + assertQuery("SELECT rand() < 1, random() < 1 FROM nation", "SELECT true, true FROM nation"); |
| 66 | + |
| 67 | + assertQuery("SELECT * FROM lineitem"); |
| 68 | + assertQuery("SELECT ceil(discount), ceiling(discount), floor(discount), abs(discount) FROM lineitem"); |
| 69 | + assertQuery("SELECT linenumber IN (2, 4, 6) FROM lineitem"); |
| 70 | + assertQuery("SELECT orderdate FROM orders WHERE cast(orderdate as DATE) IN (cast('1997-07-29' as DATE), cast('1993-03-13' as DATE)) ORDER BY orderdate LIMIT 10"); |
| 71 | + |
| 72 | + assertQuery("SELECT * FROM orders"); |
| 73 | + |
| 74 | + assertQuery("SELECT coalesce(linenumber, -1) FROM lineitem"); |
| 75 | + |
| 76 | + assertQuery("SELECT * FROM lineitem WHERE linenumber = 1"); |
| 77 | + assertQuery("SELECT * FROM lineitem WHERE linenumber > 3"); |
| 78 | + } |
| 79 | + |
| 80 | + @Test |
| 81 | + public void testFiltersAndProjections4() |
| 82 | + { |
| 83 | + assertQuery("SELECT * FROM lineitem WHERE linenumber = 3"); |
| 84 | + assertQuery("SELECT * FROM lineitem WHERE linenumber > 5 AND linenumber < 2"); |
| 85 | + |
| 86 | + assertQuery("SELECT * FROM lineitem WHERE linenumber > 5"); |
| 87 | + assertQuery("SELECT * FROM lineitem WHERE linenumber IN (1, 2)"); |
| 88 | + |
| 89 | + assertQuery("SELECT linenumber, orderkey, discount FROM lineitem WHERE discount > 0.02"); |
| 90 | + assertQuery("SELECT linenumber, orderkey, discount FROM lineitem WHERE discount BETWEEN 0.01 AND 0.02"); |
| 91 | + |
| 92 | + assertQuery("SELECT linenumber, orderkey, discount FROM lineitem WHERE discount > 0.02"); |
| 93 | + assertQuery("SELECT linenumber, orderkey, discount FROM lineitem WHERE discount BETWEEN 0.01 AND 0.02"); |
| 94 | + assertQuery("SELECT linenumber, orderkey, discount FROM lineitem WHERE tax < 0.02"); |
| 95 | + assertQuery("SELECT linenumber, orderkey, discount FROM lineitem WHERE tax BETWEEN 0.02 AND 0.06"); |
| 96 | + } |
| 97 | + |
| 98 | + @Test |
| 99 | + public void testFiltersAndProjections6() |
| 100 | + { |
| 101 | + // query with filter using like |
| 102 | + assertQuery("SELECT * FROM lineitem WHERE shipinstruct like 'TAKE BACK%'"); |
| 103 | + assertQuery("SELECT * FROM lineitem WHERE shipinstruct like 'TAKE BACK#%' escape '#'"); |
| 104 | + |
| 105 | + // no row passes the filter |
| 106 | + assertQuery( |
| 107 | + "SELECT linenumber, orderkey, discount FROM lineitem WHERE discount > 0.2"); |
| 108 | + |
| 109 | + // Double and float inequality filter |
| 110 | + assertQuery("SELECT SUM(discount) FROM lineitem WHERE discount != 0.04"); |
| 111 | + } |
| 112 | + |
| 113 | + @Test |
| 114 | + public void testTopN() |
| 115 | + { |
| 116 | + assertQueryOrdered("SELECT nationkey, regionkey FROM nation ORDER BY nationkey LIMIT 5"); |
| 117 | + |
| 118 | + assertQueryOrdered("SELECT nationkey, regionkey FROM nation ORDER BY nationkey LIMIT 50"); |
| 119 | + |
| 120 | + assertQueryOrdered( |
| 121 | + "SELECT orderkey, partkey, suppkey, linenumber, quantity, extendedprice, discount, tax " |
| 122 | + + "FROM lineitem ORDER BY orderkey, linenumber DESC LIMIT 10"); |
| 123 | + |
| 124 | + assertQueryOrdered( |
| 125 | + "SELECT orderkey, partkey, suppkey, linenumber, quantity, extendedprice, discount, tax " |
| 126 | + + "FROM lineitem ORDER BY orderkey, linenumber DESC LIMIT 2000"); |
| 127 | + |
| 128 | + assertQueryOrdered("SELECT nationkey, regionkey FROM nation ORDER BY name LIMIT 15"); |
| 129 | + assertQueryOrdered("SELECT nationkey, regionkey FROM nation ORDER BY name DESC LIMIT 15"); |
| 130 | + |
| 131 | + assertQuery("SELECT linenumber, NULL FROM lineitem ORDER BY 1 LIMIT 23"); |
| 132 | + } |
| 133 | + |
| 134 | + @Test |
| 135 | + public void testCast() |
| 136 | + { |
| 137 | + assertQuery("SELECT CAST(linenumber as TINYINT), CAST(linenumber AS SMALLINT), " |
| 138 | + + "CAST(linenumber AS INTEGER), CAST(linenumber AS BIGINT), CAST(quantity AS REAL), " |
| 139 | + + "CAST(orderkey AS DOUBLE), CAST(orderkey AS VARCHAR) FROM lineitem"); |
| 140 | + |
| 141 | + assertQuery("SELECT CAST(0.0 as VARCHAR)"); |
| 142 | + |
| 143 | + // Cast to varchar(n). |
| 144 | + assertQuery("SELECT CAST(comment as VARCHAR(1)) FROM orders"); |
| 145 | + assertQuery("SELECT CAST(comment as VARCHAR(1000)) FROM orders WHERE LENGTH(comment) < 1000"); |
| 146 | + assertQuery("SELECT CAST(c0 AS VARCHAR(1)) FROM ( VALUES (NULL) ) t(c0)"); |
| 147 | + assertQuery("SELECT CAST(c0 AS VARCHAR(1)) FROM ( VALUES ('') ) t(c0)"); |
| 148 | + |
| 149 | + assertQuery("SELECT CAST(linenumber as TINYINT), CAST(linenumber AS SMALLINT), " |
| 150 | + + "CAST(linenumber AS INTEGER), CAST(linenumber AS BIGINT), CAST(quantity AS REAL), " |
| 151 | + + "CAST(orderkey AS DOUBLE), CAST(orderkey AS VARCHAR) FROM lineitem"); |
| 152 | + |
| 153 | + // Casts to varbinary. |
| 154 | + assertQuery("SELECT cast(null as varbinary)"); |
| 155 | + assertQuery("SELECT cast('' as varbinary)"); |
| 156 | + |
| 157 | + // Ensure timestamp casts are correct. |
| 158 | + assertQuery("SELECT cast(cast(shipdate as varchar) as timestamp) FROM lineitem ORDER BY 1"); |
| 159 | + |
| 160 | + // Ensure date casts are correct. |
| 161 | + assertQuery("SELECT cast(cast(orderdate as varchar) as date) FROM orders ORDER BY 1"); |
| 162 | + |
| 163 | + // Cast all integer types to short decimal |
| 164 | + assertQuery("SELECT CAST(linenumber as DECIMAL(2, 0)) FROM lineitem"); |
| 165 | + assertQuery("SELECT CAST(linenumber as DECIMAL(8, 4)) FROM lineitem"); |
| 166 | + assertQuery("SELECT CAST(CAST(linenumber as INTEGER) as DECIMAL(15, 6)) FROM lineitem"); |
| 167 | + assertQuery("SELECT CAST(nationkey as DECIMAL(18, 6)) FROM nation"); |
| 168 | + |
| 169 | + // Cast all integer types to long decimal |
| 170 | + assertQuery("SELECT CAST(linenumber as DECIMAL(25, 0)) FROM lineitem"); |
| 171 | + assertQuery("SELECT CAST(linenumber as DECIMAL(19, 4)) FROM lineitem"); |
| 172 | + assertQuery("SELECT CAST(CAST(linenumber as INTEGER) as DECIMAL(20, 6)) FROM lineitem"); |
| 173 | + assertQuery("SELECT CAST(nationkey as DECIMAL(22, 6)) FROM nation"); |
| 174 | + } |
| 175 | + |
| 176 | + @Test |
| 177 | + public void testSwitch() |
| 178 | + { |
| 179 | + assertQuery("SELECT case linenumber % 10 when orderkey % 3 then orderkey + 1 when 2 then orderkey + 2 else 0 end FROM lineitem"); |
| 180 | + assertQuery("SELECT case linenumber when 1 then 'one' when 2 then 'two' else '...' end FROM lineitem"); |
| 181 | + assertQuery("SELECT case when linenumber = 1 then 'one' when linenumber = 2 then 'two' else '...' end FROM lineitem"); |
| 182 | + } |
| 183 | + |
| 184 | + @Test |
| 185 | + public void testIn() |
| 186 | + { |
| 187 | + assertQuery("SELECT linenumber IN (orderkey % 7, partkey % 5, suppkey % 3) FROM lineitem"); |
| 188 | + } |
| 189 | + |
| 190 | + @Test |
| 191 | + public void testSubqueries() |
| 192 | + { |
| 193 | + assertQuery("SELECT name FROM nation WHERE regionkey = (SELECT max(regionkey) FROM region)"); |
| 194 | + |
| 195 | + // Subquery returns zero rows. |
| 196 | + assertQuery("SELECT name FROM nation WHERE regionkey = (SELECT regionkey FROM region WHERE regionkey < 0)"); |
| 197 | + |
| 198 | + // Subquery returns more than one row. |
| 199 | + assertQueryFails("SELECT name FROM nation WHERE regionkey = (SELECT regionkey FROM region)", ".*Expected single row of input. Received 5 rows.*"); |
| 200 | + } |
| 201 | + |
| 202 | + @Test |
| 203 | + public void testArithmetic() |
| 204 | + { |
| 205 | + assertQuery("SELECT mod(orderkey, linenumber) FROM lineitem"); |
| 206 | + assertQuery("SELECT discount * 0.123 FROM lineitem"); |
| 207 | + assertQuery("SELECT ln(totalprice) FROM orders"); |
| 208 | + assertQuery("SELECT sqrt(totalprice) FROM orders"); |
| 209 | + assertQuery("SELECT radians(totalprice) FROM orders"); |
| 210 | + } |
| 211 | + |
| 212 | + @Test |
| 213 | + public void testGreatestLeast() |
| 214 | + { |
| 215 | + assertQuery("SELECT greatest(linenumber, suppkey, partkey) from lineitem"); |
| 216 | + assertQuery("SELECT least(shipdate, commitdate) from lineitem"); |
| 217 | + } |
| 218 | + |
| 219 | + @Test |
| 220 | + public void testSign() |
| 221 | + { |
| 222 | + assertQuery("SELECT sign(totalprice) from orders"); |
| 223 | + assertQuery("SELECT sign(-totalprice) from orders"); |
| 224 | + assertQuery("SELECT sign(custkey) from orders"); |
| 225 | + assertQuery("SELECT sign(-custkey) from orders"); |
| 226 | + assertQuery("SELECT sign(shippriority) from orders"); |
| 227 | + } |
| 228 | + |
| 229 | + @Test |
| 230 | + public void testQueryWithColumnHandleOrdering() |
| 231 | + { |
| 232 | + assertQuery("SELECT * FROM nation WHERE (name <= 'B' OR 'G' <= name) AND (nationkey BETWEEN 1 AND 10)"); |
| 233 | + } |
| 234 | +} |
0 commit comments