Files
impala/testdata/workloads/functional-query/queries/QueryTest/views-ddl.test
Lenni Kuff 39f77b8b8f Add support for cluster-synchronized catalog operations
This change adds support for cluster-synchronized catalog operations. This provides the
guaranteethat after a catalog op completes, all other subscribers to the catalog topic have
also processed that update. This is useful when load balancing, because a common workflow
is to target a different impalad for each statement executed.
For example if each of the following were executed sequentially, but targeting
a different node:
1) CREATE TABLE Foo
2) INSERT INTO Foo
3) SELECT * FROM Foo
4) INSERT INTO Foo ....

Since both the INSERT and the CREATE update the catalog, it would not work as expected
without this patch. The user might either get a "table not found" error or would be
missing partition information from the INSERT.

The downside is that this approach to DDL takes a bit longer because we need to wait
until all subscribers have processed an update. If all nodes are healthy, this overhead
should not be significantly longer than the current DDL time. However, a single bad node
might slow down or completely block the completion of all DDL operations. By default
this feature is disabled, but it can be enabled using a new query option: SYNCED_DDL=1

To test this, the base test suite was updated to support selecting a random impalad
to execute each query section in a query test file. This is currently only enabled
for the insert and DDL tests, but could be leveraged by more tests in the future.

TODO: Add additional failure tests around this functionality.
TODO: Add an explicit "sync" statement so users do not need to run all their DDL
in this mode (since it is slower).

Change-Id: I45e757a931bf2a4740cc0cdd1e76ce49a1e22b83
Reviewed-on: http://gerrit.ent.cloudera.com:8080/899
Reviewed-by: Ishaan Joshi <ishaan@cloudera.com>
Tested-by: jenkins
2014-01-08 10:53:58 -08:00

236 lines
5.1 KiB
Plaintext

====
---- QUERY
# Create a simple view without renaming the columns.
create view ddl_test_db.simple_view as
select * from functional.alltypes
---- RESULTS
====
---- QUERY
# Test that 'if not exists' swallows the error (view already exists)
create view if not exists ddl_test_db.simple_view as
select * from functional.alltypesagg
---- RESULTS
====
---- QUERY
# Create another simple view with 'if not exists' on a subset of
# alltypes' columns using custom column names and comments
create view if not exists
ddl_test_db.simple_view_sub (x, y comment 'hello', z) as
select int_col, string_col, timestamp_col from functional.alltypes
---- RESULTS
====
---- QUERY
# Create a view on a parquet table (Hive cannot create/read/write parquet)
create view ddl_test_db.parquet_view as
select * from functional_parquet.alltypes where id < 20
---- RESULTS
====
---- QUERY
# Create a complex view with predicates, joins, aggregates and order by
create view ddl_test_db.complex_view (abc comment 'agg', xyz comment 'gby') as
select count(a.bigint_col), b.string_col from
functional.alltypesagg a inner join functional.alltypestiny b
on a.id = b.id where a.bigint_col < 50
group by b.string_col having count(a.bigint_col) > 1
order by b.string_col limit 100
---- RESULTS
====
---- QUERY
# Create a view on a view
create view ddl_test_db.view_view (aaa, bbb) as
select * from ddl_test_db.complex_view
---- RESULTS
====
---- QUERY
# Test that the views are displayed by 'show tables'
show tables in ddl_test_db
---- RESULTS
'complex_view'
'parquet_view'
'simple_view'
'simple_view_sub'
'view_view'
====
---- QUERY
# Test that the views can be described
describe ddl_test_db.simple_view
---- RESULTS
'id','int',''
'bool_col','boolean',''
'tinyint_col','tinyint',''
'smallint_col','smallint',''
'int_col','int',''
'bigint_col','bigint',''
'float_col','float',''
'double_col','double',''
'date_string_col','string',''
'string_col','string',''
'timestamp_col','timestamp',''
'year','int',''
'month','int',''
---- TYPES
string,string,string
====
---- QUERY
describe ddl_test_db.simple_view_sub
---- RESULTS
'x','int',''
'y','string','hello'
'z','timestamp',''
---- TYPES
string,string,string
====
---- QUERY
describe ddl_test_db.complex_view
---- RESULTS
'abc','bigint','agg'
'xyz','string','gby'
---- TYPES
string,string,string
====
---- QUERY
describe ddl_test_db.parquet_view
---- RESULTS
'id','int',''
'bool_col','boolean',''
'tinyint_col','tinyint',''
'smallint_col','smallint',''
'int_col','int',''
'bigint_col','bigint',''
'float_col','float',''
'double_col','double',''
'date_string_col','string',''
'string_col','string',''
'timestamp_col','timestamp',''
'year','int',''
'month','int',''
---- TYPES
string,string,string
====
---- QUERY
describe ddl_test_db.view_view
---- RESULTS
'aaa','bigint',''
'bbb','string',''
---- TYPES
string,string,string
====
---- QUERY
# Test that the views can be queried.
select count(*) from ddl_test_db.simple_view
---- RESULTS
7300
---- TYPES
bigint
====
---- QUERY
select count(*) from ddl_test_db.simple_view_sub
---- RESULTS
7300
---- TYPES
bigint
====
---- QUERY
select count(*) from ddl_test_db.complex_view
---- RESULTS
2
---- TYPES
bigint
====
---- QUERY
select count(*) from ddl_test_db.parquet_view
---- RESULTS
20
---- TYPES
bigint
====
---- QUERY
select count(*) from ddl_test_db.view_view
---- RESULTS
2
---- TYPES
bigint
====
---- QUERY
# Test dropping a view
drop view ddl_test_db.simple_view_sub
---- RESULTS
====
---- QUERY
# Test that the view is gone
show tables in ddl_test_db
---- RESULTS
'complex_view'
'parquet_view'
'simple_view'
'view_view'
====
---- QUERY
# Test 'if exists' for dropping a view (view does not exist)
drop view if exists ddl_test_db.bad_view
---- RESULTS
====
---- QUERY
# Test renaming a view
alter view ddl_test_db.view_view rename to ddl_test_db.view_on_view
---- RESULTS
====
---- QUERY
# Test renaming a parquet view
alter view ddl_test_db.parquet_view rename to ddl_test_db.new_parquet_view
---- RESULTS
====
---- QUERY
# Test that the view was renamed
show tables in ddl_test_db
---- RESULTS
'complex_view'
'new_parquet_view'
'simple_view'
'view_on_view'
====
---- QUERY
# Test altering a with a new definition
alter view ddl_test_db.new_parquet_view as
select bigint_col, string_col from functional_parquet.alltypesagg
where bigint_col is null limit 10
---- RESULTS
====
---- QUERY
# Test querying the altered view
select count(bigint_col), count(string_col) from ddl_test_db.new_parquet_view
---- RESULTS
0,10
---- TYPES
bigint,bigint
====
---- QUERY
# Create a view on a constant select and try to query it.
create view ddl_test_db.const_view
as select 1, 'a', 10.0
---- RESULTS
====
---- QUERY
select * from ddl_test_db.const_view
---- RESULTS
1,'a',10.0
---- TYPES
tinyint,string,float
====
---- QUERY
# Test that parentheses are preserved in view creation.
# If the parentheses were ignored the query would return a count > 0.
create view ddl_test_db.paren_view as
select count(*) from functional.alltypessmall
where true and (true or false) and false
---- RESULTS
====
---- QUERY
# Test that parentheses are preserved in view creation.
select * from ddl_test_db.paren_view
---- RESULTS
0
---- TYPES
bigint
====