blob: 21bb66353ac1926ab56fee842cb2da8fb175c272 [file] [log] [blame]
/*
* 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.
*/
#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <iostream>
#include <string>
#include "lib/sql_util.h"
#include "gtest/gtest.h"
class TestQueryPolymorphism : public ::testing::Test {
public:
TestQueryPolymorphism() {}
~TestQueryPolymorphism() {}
};
TEST_F(TestQueryPolymorphism, Test1) {
hawq::test::SQLUtility util;
// prepare
util.execute("DROP AGGREGATE IF EXISTS myaggp01a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp02a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp03a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp03b(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp04a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp04b(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp05a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp06a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp07a(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp08a(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp09a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp09b(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp10a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp10b(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp11a(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp11b(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp12a(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp12b(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp13a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp14a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp15a(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp16a(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp17a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp17b(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp18a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp18b(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp19a(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp19b(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp20a(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggp20b(anyelement) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn01a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn01b(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn02a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn02b(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn03a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn04a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn05a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn05b(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn06a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn06b(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn07a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn07b(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn08a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn08b(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn09a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn10a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn11a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn12a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn13a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn13b(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn14a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn14b(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn15a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn15b(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn16a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn16b(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn17a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn18a(int) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn19a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS myaggn20a(*) CASCADE");
util.execute("DROP AGGREGATE IF EXISTS mysum2(anyelement,anyelement) CASCADE");
util.execute("DROP FUNCTION IF EXISTS stfp(anyarray) CASCADE");
util.execute("DROP FUNCTION IF EXISTS stfnp(int[]) CASCADE");
util.execute("DROP FUNCTION IF EXISTS tfp(anyarray,anyelement) CASCADE");
util.execute("DROP FUNCTION IF EXISTS tfnp(int[],int) CASCADE");
util.execute("DROP FUNCTION IF EXISTS tf1p(anyarray,int) CASCADE");
util.execute("DROP FUNCTION IF EXISTS tf2p(int[],anyelement) CASCADE");
util.execute("DROP FUNCTION IF EXISTS sum3(anyelement,anyelement,anyelement) CASCADE");
util.execute("DROP FUNCTION IF EXISTS ffp(anyarray) CASCADE");
util.execute("DROP FUNCTION IF EXISTS ffnp(int[]) CASCADE");
util.execute("DROP TABLE IF EXISTS t");
// test starts here
util.execSQLFile("query/sql/polimorphism-test1.sql",
"query/ans/polimorphism-test1.ans");
// Legend:
// -----------
// A = type is ANY
// P = type is polymorphic
// N = type is non-polymorphic
// B = aggregate base type
// S = aggregate state type
// R = aggregate return type
// 1 = arg1 of a function
// 2 = arg2 of a function
// ag = aggregate
// tf = trans (state) function
// ff = final function
// rt = return type of a function
// -> = implies
// => = allowed
// !> = not allowed
// E = exists
// NE = not-exists
// --
// Possible states:
// ----------------
// B = (A || P || N)
// when (B = A) -> (tf2 = NE)
// S = (P || N)
// ff = (E || NE)
// tf1 = (P || N)
// tf2 = (NE || P || N)
// R = (P || N)
// Try to cover all the possible states:
//
// Note: in Cases 1 & 2, we are trying to return P. Therefore, if the transfn
// is stfnp, tfnp, or tf2p, we must use ffp as finalfn, because stfnp, tfnp,
// and tf2p do not return P. Conversely, in Cases 3 & 4, we are trying to
// return N. Therefore, if the transfn is stfp, tfp, or tf1p, we must use ffnp
// as finalfn, because stfp, tfp, and tf1p do not return N.
//
// Case1 (R = P) && (B = A)
// ------------------------
// S tf1
// -------
// N N
util.execute("CREATE AGGREGATE myaggp01a(*) "
"(SFUNC = stfnp, STYPE = int4[], FINALFUNC = ffp, INITCOND = '{}')");
// P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp02a(*) (SFUNC = stfnp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// N P
util.execute("CREATE AGGREGATE myaggp03a(*) "
"(SFUNC = stfp, STYPE = int4[], FINALFUNC = ffp, INITCOND = '{}')");
util.execute("CREATE AGGREGATE myaggp03b(*) "
"(SFUNC = stfp, STYPE = int4[], INITCOND = '{}')");
// P P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp04a(*) (SFUNC = stfp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp04b(*) (SFUNC = stfp, STYPE = anyarray, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- Case2 (R = P) && ((B = P) || (B = N))
// -- -------------------------------------
// -- S tf1 B tf2
// -- -----------------------
// -- N N N N
util.execute("CREATE AGGREGATE myaggp05a"
"(BASETYPE = int, SFUNC = tfnp, STYPE = int[], FINALFUNC = ffp, INITCOND = '{}')");
// -- N N N P
util.execute("CREATE AGGREGATE myaggp06a"
"(BASETYPE = int, SFUNC = tf2p, STYPE = int[], FINALFUNC = ffp, INITCOND = '{}')");
// -- N N P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp07a"
"(BASETYPE = anyelement, SFUNC = tfnp, STYPE = int[], FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: function tfnp(integer[], anyelement) does not exist");
// -- N N P P
util.execute("CREATE AGGREGATE myaggp08a"
"(BASETYPE = anyelement, SFUNC = tf2p, STYPE = int[], FINALFUNC = ffp, INITCOND = '{}')");
// -- N P N N
util.execute("CREATE AGGREGATE myaggp09a"
"(BASETYPE = int, SFUNC = tf1p, STYPE = int[], FINALFUNC = ffp, INITCOND = '{}')");
util.execute("CREATE AGGREGATE myaggp09b"
"(BASETYPE = int, SFUNC = tf1p, STYPE = int[], INITCOND = '{}')");
// -- N P N P
util.execute("CREATE AGGREGATE myaggp10a"
"(BASETYPE = int, SFUNC = tfp, STYPE = int[], FINALFUNC = ffp, INITCOND = '{}')");
util.execute("CREATE AGGREGATE myaggp10b"
"(BASETYPE = int, SFUNC = tfp, STYPE = int[], INITCOND = '{}')");
// -- N P P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp11a"
"(BASETYPE = anyelement, SFUNC = tf1p, STYPE = int[], FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: function tf1p(integer[], anyelement) does not exist");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp11b"
"(BASETYPE = anyelement, SFUNC = tf1p, STYPE = int[], INITCOND = '{}')",
"ERROR: function tf1p(integer[], anyelement) does not exist");
// -- N P P P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp12a"
"(BASETYPE = anyelement, SFUNC = tfp, STYPE = int[], FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: function tfp(integer[], anyelement) does not exist");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp12b"
"(BASETYPE = anyelement, SFUNC = tfp, STYPE = int[], INITCOND = '{}')",
"ERROR: function tfp(integer[], anyelement) does not exist");
// -- P N N N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp13a"
"(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- P N N P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp14a"
"(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- P N P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp15a"
"(BASETYPE = anyelement, SFUNC = tfnp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: function tfnp(anyarray, anyelement) does not exist");
// -- P N P P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp16a"
"(BASETYPE = anyelement, SFUNC = tf2p, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: function tf2p(anyarray, anyelement) does not exist");
// -- P P N N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp17a"
"(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp17b"
"(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- P P N P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp18a"
"(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp18b"
"(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- P P P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp19a"
"(BASETYPE = anyelement, SFUNC = tf1p, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')",
"ERROR: function tf1p(anyarray, anyelement) does not exist");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggp19b"
"(BASETYPE = anyelement, SFUNC = tf1p, STYPE = anyarray, INITCOND = '{}')",
"ERROR: function tf1p(anyarray, anyelement) does not exist");
// -- P P P P
util.execute("CREATE AGGREGATE myaggp20a"
"(BASETYPE = anyelement, SFUNC = tfp, STYPE = anyarray, FINALFUNC = ffp, INITCOND = '{}')");
util.execute("CREATE AGGREGATE myaggp20b"
"(BASETYPE = anyelement, SFUNC = tfp, STYPE = anyarray, INITCOND = '{}')");
// -- Case3 (R = N) && (B = A)
// -- ------------------------
// -- S tf1
// -- -------
// -- N N
util.execute("CREATE AGGREGATE myaggn01a(*) "
"(SFUNC = stfnp, STYPE = int4[], FINALFUNC = ffnp, INITCOND = '{}')");
util.execute("CREATE AGGREGATE myaggn01b(*) "
"(SFUNC = stfnp, STYPE = int4[], INITCOND = '{}');");
// -- P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn02a(*) "
"(SFUNC = stfnp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn02b(*) "
"(SFUNC = stfnp, STYPE = anyarray, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- N P
util.execute("CREATE AGGREGATE myaggn03a(*) "
"(SFUNC = stfp, STYPE = int4[], FINALFUNC = ffnp, INITCOND = '{}')");
// -- P P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn04a(*) "
"(SFUNC = stfp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- Case4 (R = N) && ((B = P) || (B = N))
// -- -------------------------------------
// -- S tf1 B tf2
// -- -----------------------
// -- N N N N
util.execute("CREATE AGGREGATE myaggn05a"
"(BASETYPE = int, SFUNC = tfnp, STYPE = int[], FINALFUNC = ffnp, INITCOND = '{}')");
util.execute("CREATE AGGREGATE myaggn05b"
"(BASETYPE = int, SFUNC = tfnp, STYPE = int[], INITCOND = '{}')");
// -- N N N P
util.execute("CREATE AGGREGATE myaggn06a"
"(BASETYPE = int, SFUNC = tf2p, STYPE = int[], FINALFUNC = ffnp, INITCOND = '{}')");
util.execute("CREATE AGGREGATE myaggn06b"
"(BASETYPE = int, SFUNC = tf2p, STYPE = int[], INITCOND = '{}')");
// -- N N P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn07a "
"(BASETYPE = anyelement, SFUNC = tfnp, STYPE = int[], FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: function tfnp(integer[], anyelement) does not exist");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn07b "
"(BASETYPE = anyelement, SFUNC = tfnp, STYPE = int[], INITCOND = '{}')",
"ERROR: function tfnp(integer[], anyelement) does not exist");
// -- N N P P
util.execute("CREATE AGGREGATE myaggn08a"
"(BASETYPE = anyelement, SFUNC = tf2p, STYPE = int[], FINALFUNC = ffnp, INITCOND = '{}')");
util.execute("CREATE AGGREGATE myaggn08b"
"(BASETYPE = anyelement, SFUNC = tf2p, STYPE = int[], INITCOND = '{}')");
// -- N P N N
util.execute("CREATE AGGREGATE myaggn09a"
"(BASETYPE = int, SFUNC = tf1p, STYPE = int[], FINALFUNC = ffnp, INITCOND = '{}')");
// -- N P N P
util.execute("CREATE AGGREGATE myaggn10a"
"(BASETYPE = int, SFUNC = tfp, STYPE = int[], FINALFUNC = ffnp, INITCOND = '{}')");
// -- N P P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn11a"
"(BASETYPE = anyelement, SFUNC = tf1p, STYPE = int[], FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: function tf1p(integer[], anyelement) does not exist");
// -- N P P P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn12a"
"(BASETYPE = anyelement, SFUNC = tfp, STYPE = int[], FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: function tfp(integer[], anyelement) does not exist");
// -- P N N N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn13a"
"(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn13b"
"(BASETYPE = int, SFUNC = tfnp, STYPE = anyarray, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- P N N P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn14a"
"(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn14b"
"(BASETYPE = int, SFUNC = tf2p, STYPE = anyarray, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- P N P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn15a"
"(BASETYPE = anyelement, SFUNC = tfnp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: function tfnp(anyarray, anyelement) does not exist");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn15b"
"(BASETYPE = anyelement, SFUNC = tfnp, STYPE = anyarray, INITCOND = '{}')",
"ERROR: function tfnp(anyarray, anyelement) does not exist");
// -- P N P P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn16a"
"(BASETYPE = anyelement, SFUNC = tf2p, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: function tf2p(anyarray, anyelement) does not exist");
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn16b"
"(BASETYPE = anyelement, SFUNC = tf2p, STYPE = anyarray, INITCOND = '{}')",
"ERROR: function tf2p(anyarray, anyelement) does not exist");
// -- P P N N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn17a"
"(BASETYPE = int, SFUNC = tf1p, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- P P N P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn18a"
"(BASETYPE = int, SFUNC = tfp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: cannot determine transition data type");
// -- P P P N
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn19a"
"(BASETYPE = anyelement, SFUNC = tf1p, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: function tf1p(anyarray, anyelement) does not exist");
// -- P P P P
util.executeExpectErrorMsgStartWith(
"CREATE AGGREGATE myaggn20a"
"(BASETYPE = anyelement, SFUNC = tfp, STYPE = anyarray, FINALFUNC = ffnp, INITCOND = '{}')",
"ERROR: function ffnp(anyarray) does not exist");
// multi-arg polymorphic
util.execute("CREATE AGGREGATE mysum2(anyelement,anyelement) "
"(SFUNC = sum3, STYPE = anyelement, INITCOND = '0')");
util.execute("CREATE TABLE t (f1 int, f2 int[], f3 text)");
util.execute("INSERT INTO t VALUES(1,array[1],'a')");
util.execute("INSERT INTO t VALUES(2,array[11],'b')");
util.execute("INSERT INTO t VALUES(3,array[111],'c')");
util.execute("INSERT INTO t VALUES(4,array[2],'a')");
util.execute("INSERT INTO t VALUES(5,array[22],'b')");
util.execute("INSERT INTO t VALUES(6,array[222],'c')");
util.execute("INSERT INTO t VALUES(7,array[3],'a')");
util.execute("INSERT INTO t VALUES(8,array[3],'b')");
util.execSQLFile("query/sql/polimorphism-test1-query.sql",
"query/ans/polimorphism-test1-query.ans");
// clean up
util.execute("DROP TABLE t");
util.execute("DROP AGGREGATE myaggp01a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggp02a(*)");
util.execute("DROP AGGREGATE myaggp03a(*)");
util.execute("DROP AGGREGATE myaggp03b(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggp04a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggp04b(*)");
util.execute("DROP AGGREGATE myaggp05a(int)");
util.execute("DROP AGGREGATE myaggp06a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggp07a(anyelement)");
util.execute("DROP AGGREGATE myaggp08a(anyelement)");
util.execute("DROP AGGREGATE myaggp09a(int)");
util.execute("DROP AGGREGATE myaggp09b(int)");
util.execute("DROP AGGREGATE myaggp10a(int)");
util.execute("DROP AGGREGATE myaggp10b(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggp11a(anyelement)");
util.execute("DROP AGGREGATE IF EXISTS myaggp11b(anyelement)");
util.execute("DROP AGGREGATE IF EXISTS myaggp12a(anyelement)");
util.execute("DROP AGGREGATE IF EXISTS myaggp12b(anyelement)");
util.execute("DROP AGGREGATE IF EXISTS myaggp13a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggp14a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggp15a(anyelement)");
util.execute("DROP AGGREGATE IF EXISTS myaggp16a(anyelement)");
util.execute("DROP AGGREGATE IF EXISTS myaggp17a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggp17b(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggp18a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggp18b(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggp19a(anyelement)");
util.execute("DROP AGGREGATE IF EXISTS myaggp19b(anyelement)");
util.execute("DROP AGGREGATE myaggp20a(anyelement)");
util.execute("DROP AGGREGATE myaggp20b(anyelement)");
util.execute("DROP AGGREGATE myaggn01a(*)");
util.execute("DROP AGGREGATE myaggn01b(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn02a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn02b(*)");
util.execute("DROP AGGREGATE myaggn03a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn04a(*)");
util.execute("DROP AGGREGATE myaggn05a(int)");
util.execute("DROP AGGREGATE myaggn05b(int)");
util.execute("DROP AGGREGATE myaggn06a(int)");
util.execute("DROP AGGREGATE myaggn06b(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggn07a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn07b(*)");
util.execute("DROP AGGREGATE myaggn08a(anyelement)");
util.execute("DROP AGGREGATE myaggn08b(anyelement)");
util.execute("DROP AGGREGATE myaggn09a(int)");
util.execute("DROP AGGREGATE myaggn10a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggn11a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn12a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn13a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggn13b(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggn14a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggn14b(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggn15a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn15b(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn16a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn16b(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn17a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggn18a(int)");
util.execute("DROP AGGREGATE IF EXISTS myaggn19a(*)");
util.execute("DROP AGGREGATE IF EXISTS myaggn20a(*)");
util.execute("DROP AGGREGATE mysum2(anyelement,anyelement)");
util.execute("DROP FUNCTION IF EXISTS stfp(anyarray)");
util.execute("DROP FUNCTION IF EXISTS stfnp(int[])");
util.execute("DROP FUNCTION IF EXISTS tfp(anyarray,anyelement)");
util.execute("DROP FUNCTION IF EXISTS tfnp(int[],int)");
util.execute("DROP FUNCTION IF EXISTS tf1p(anyarray,int)");
util.execute("DROP FUNCTION IF EXISTS tf2p(int[],anyelement)");
util.execute("DROP FUNCTION IF EXISTS sum3(anyelement,anyelement,anyelement)");
util.execute("DROP FUNCTION IF EXISTS ffp(anyarray)");
util.execute("DROP FUNCTION IF EXISTS ffnp(int[])");
}
TEST_F(TestQueryPolymorphism, Test2) {
hawq::test::SQLUtility util;
}