package com.airbnb.airpal.core.execution;
import com.airbnb.airpal.presto.Table;
import com.google.common.collect.ImmutableSet;
import org.junit.Test;
import java.util.Set;
import static com.airbnb.airpal.core.execution.QueryExecutionAuthorizer.tablesUsedByQuery;
import static org.junit.Assert.assertEquals;
public class QueryExecutionAuthorizerTest
{
static String defaultConnector = "hive";
static String defaultSchema = "default";
static String TEST_CREATE_TABLE = "CREATE TABLE the_gibson.users_pii AS SELECT * FROM users;";
@Test
public void testTableReferencesCreateTable()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_CREATE_TABLE, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "users"),
new Table(defaultConnector, "the_gibson", "users_pii")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_CREATE_VIEW = "CREATE VIEW the_gibson.users_pii AS SELECT pii_col FROM users;";
@Test
public void testTableReferencesCreateView()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_CREATE_VIEW, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "users"),
new Table(defaultConnector, "the_gibson", "users_pii")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_REPLACE_VIEW = "CREATE OR REPLACE VIEW the_gibson.users AS SELECT pii_col FROM users;";
@Test
public void testTableReferencesReplaceView()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_REPLACE_VIEW, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "users"),
new Table(defaultConnector, "the_gibson", "users")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_ALTER_TABLE = "ALTER TABLE default.users RENAME TO the_gibson.users_pii; SELECT pii_col FROM the_gibson.users_pii;";
@Test
public void testTableReferencesRenameTable()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_ALTER_TABLE, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, "default", "users"),
new Table(defaultConnector, "the_gibson", "users_pii")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_ALTER_TABLE2 = "USE SCHEMA the_gibson; ALTER TABLE default.users RENAME TO users_pii; SELECT pii_col FROM users_pii;";
@Test
public void testTableReferencesRenameTable2()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_ALTER_TABLE2, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, "default", "users"),
new Table(defaultConnector, "the_gibson", "users_pii")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_ALTER_TABLE3 = "USE CATALOG cassandra; USE SCHEMA the_gibson; ALTER TABLE hive.default.users RENAME TO users_pii; SELECT pii_col FROM users_pii;";
@Test
public void testTableReferencesRenameTable3()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_ALTER_TABLE3, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, "default", "users"),
new Table("cassandra", "the_gibson", "users_pii")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_ACCESS_PII_UNION_VIEW = "SELECT str_col FROM the_gibson.users UNION ALL SELECT pii_str_col FROM users;";
@Test
public void testTableReferencesSelectUnion()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_ACCESS_PII_UNION_VIEW, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "users"),
new Table(defaultConnector, "the_gibson", "users")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_ACCESS_WITH = "WITH a AS (SELECT * FROM users) SELECT * FROM the_gibson.users UNION ALL SELECT * FROM a;";
@Test
public void testTableReferencesSelectWith()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_ACCESS_WITH, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "users"),
new Table(defaultConnector, "the_gibson", "users")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_BASIC_SELECT_COUNT = "SELECT COUNT(*) FROM users;";
@Test
public void testTableReferencesSelectCount()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_BASIC_SELECT_COUNT, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "users")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_SELECT_ALL = "SELECT * FROM users;";
@Test
public void testTableReferencesSelectStar()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_SELECT_ALL, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "users")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_SELECT_SUBQUERY = "SELECT * FROM (SELECT pii_str_col FROM users) UNION ALL SELECT * FROM the_gibson.users;";
@Test
public void testTableReferencesSelectStarSubquery()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_SELECT_SUBQUERY, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "users"),
new Table(defaultConnector, "the_gibson", "users")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_DROP_VIEW = "DROP VIEW my_view";
@Test
public void testTableReferencesDropView()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_DROP_VIEW, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "my_view")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_DROP_TABLE = "DROP TABLE my_table";
@Test
public void testTableReferencesDropTable()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_DROP_TABLE, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "my_table")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_SELECT_ALIAS = "SELECT pii FROM users u JOIN users_pii p ON u.id = p.id;";
@Test
public void testTableReferencesJoinAlias()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_SELECT_ALIAS, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(defaultConnector, defaultSchema, "users"),
new Table(defaultConnector, defaultSchema, "users_pii")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_SELECT_CONNECTOR = "SELECT pii FROM cassandra.pii.users u JOIN users_pii p ON u.id = p.id;";
@Test
public void testTableReferencesSelectConnector()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_SELECT_CONNECTOR, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table("cassandra", "pii", "users"),
new Table(defaultConnector, defaultSchema, "users_pii")
);
assertEquals(tablesExpected, tablesUsed);
}
static String TEST_CROSS_JOIN_SUBSELECT = "SELECT * " +
"FROM cassandra.pii.users u " +
"CROSS JOIN (SELECT * FROM hive.pii.users) u2 " +
"WHERE NOT u2.id IS NULL;";
@Test
public void testTableReferencesCrossJoinSubselect()
throws Exception
{
Set<Table> tablesUsed = tablesUsedByQuery(TEST_CROSS_JOIN_SUBSELECT, defaultConnector, defaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table("cassandra", "pii", "users"),
new Table("hive", "pii", "users")
);
assertEquals(tablesExpected, tablesUsed);
}
@Test
public void testAlternateDefaultConnectorSchemaReferences()
throws Exception
{
String alternateDefaultConnector = "cassandra";
String alternateDefaultSchema = "default2";
Set<Table> tablesUsed = tablesUsedByQuery(TEST_SELECT_ALIAS, alternateDefaultConnector, alternateDefaultSchema);
Set<Table> tablesExpected = ImmutableSet.of(
new Table(alternateDefaultConnector, alternateDefaultSchema, "users"),
new Table(alternateDefaultConnector, alternateDefaultSchema, "users_pii")
);
assertEquals(tablesExpected, tablesUsed);
}
}