#   Copyright 2011-2015 Quickstep Technologies LLC.
#   Copyright 2015 Pivotal Software, Inc.
#
#   Licensed 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 TABLE (attr int)
--
ERROR: syntax error (1 : 14)
CREATE TABLE TABLE (attr int)
             ^
==

# We do not allow an empty-column table.
CREATE TABLE test ()
--
ERROR: syntax error (1 : 20)
CREATE TABLE test ()
                   ^
==

CREATE TABLE test (attr1 INT, attr2 FLOAT, attr3 DOUBLE, attr4 CHAR(5), attr5 VARCHAR(4))
--
CreateTableStatement[relation_name=test]
+-attribute_list=
  +-AttributeDefinition[name=attr1,type=Int]
  +-AttributeDefinition[name=attr2,type=Float]
  +-AttributeDefinition[name=attr3,type=Double]
  +-AttributeDefinition[name=attr4,type=Char(5)]
  +-AttributeDefinition[name=attr5,type=VarChar(4)]
==

CREATE TABLE test (attr CHAR(-1))
--
ERROR: syntax error (1 : 30)
CREATE TABLE test (attr CHAR(-1))
                             ^
==

# Zero-length char type is not allowed.
CREATE TABLE test (attr CHAR(0))
--
ERROR: Length for CHAR type must be at least 1 (1 : 30)
CREATE TABLE test (attr CHAR(0))
                             ^
==

CREATE TABLE test(attr CHAR(1+1))
--
ERROR: syntax error (1 : 30)
CREATE TABLE test(attr CHAR(1+1))
                             ^
==

CREATE TABLE test (attr UNKNOWN_TYPE)
--
ERROR: syntax error (1 : 25)
CREATE TABLE test (attr UNKNOWN_TYPE)
                        ^
==

CREATE TABLE test (attr INT NULL, attr FLOAT NOT NULL)
--
CreateTableStatement[relation_name=test]
+-attribute_list=
  +-AttributeDefinition[name=attr,type=Int NULL]
  +-AttributeDefinition[name=attr,type=Float]
==

CREATE TABLE test (attr INT UNIQUE)
--
ERROR: Column Constraints (UNIQUE) is not supported yet (1 : 29)
CREATE TABLE test (attr INT UNIQUE)
                            ^
==

CREATE TABLE test (attr INT PRIMARY KEY)
--
ERROR: Column Constraints (PRIMARY KEY) is not supported yet (1 : 29)
CREATE TABLE test (attr INT PRIMARY KEY)
                            ^
==

CREATE TABLE test (attr INT DEFAULT 4)
--
ERROR: Column Constraints (DEFAULT) is not supported yet (1 : 29)
CREATE TABLE test (attr INT DEFAULT 4)
                            ^
==

CREATE TABLE test (attr INT CHECK(attr>5))
--
ERROR: Column Constraints (CHECK) is not supported yet (1 : 29)
CREATE TABLE test (attr INT CHECK(attr>5))
                            ^
==

CREATE TABLE test (attr INT REFERENCES test2(attr2))
--
ERROR: Foreign Keys is not supported yet (1 : 29)
CREATE TABLE test (attr INT REFERENCES test2(attr2))
                            ^
==

CREATE TABLE test (attr INT) UNIQUE(attr)
--
ERROR: Table Constraints (UNIQUE) is not supported yet (1 : 30)
CREATE TABLE test (attr INT) UNIQUE(attr)
                             ^
==

CREATE TABLE test (attr INT) PRIMARY KEY(attr)
--
ERROR: Table Constraints (PRIMARY KEY) is not supported yet (1 : 30)
CREATE TABLE test (attr INT) PRIMARY KEY(attr)
                             ^
==

CREATE TABLE test (attr INT) FOREIGN KEY(attr)
--
ERROR: syntax error (1 : 47)
... TABLE test (attr INT) FOREIGN KEY(attr)
                                           ^
==

CREATE TABLE test (attr INT) CHECK(attr>0)
--
ERROR: Table Constraints (CHECK) is not supported yet (1 : 30)
CREATE TABLE test (attr INT) CHECK(attr>0)
                             ^
==

CREATE TABLE test (attr INT) PARTITION BY HASH(attr) PARTITIONS 4
--
CreateTableStatement[relation_name=test]
+-attribute_list=
| +-AttributeDefinition[name=attr,type=Int]
+-partition_clause=
  +-PartitionClause[partition_type=0]
    +-Number of Partitions=NumericLiteral[numeric_string=4,float_like=false]
    +-attribute_name_list=
      +-String[value=attr]
==

# Empty partitioning attribute is not allowed
CREATE TABLE test (attr INT) PARTITION BY HASH() PARTITIONS 4
--
ERROR: syntax error (1 : 48)
...TABLE test (attr INT) PARTITION BY HASH() PARTITIONS 4
                                           ^
==

# Zero partitions not allowed
CREATE TABLE test (attr INT) PARTITION BY HASH(attr) PARTITIONS 0
--
ERROR: NUMBER OF PARITIONS must be between 1 and 64 (1 : 65)
...INT) PARTITION BY HASH(attr) PARTITIONS 0
                                           ^
==

# Missing number of partitions not allowed
CREATE TABLE test (attr INT) PARTITION BY HASH(attr) PARTITIONS
--
ERROR: syntax error (1 : 64)
... INT) PARTITION BY HASH(attr) PARTITIONS
                                           ^
==

# Missing PARTITIONS attribute not allowed
CREATE TABLE test (attr INT) PARTITION BY HASH(attr)
--
ERROR: syntax error (1 : 53)
... test (attr INT) PARTITION BY HASH(attr)
                                           ^
==

# Missing partitioning type not allowed
CREATE TABLE test (attr INT) PARTITION BY (attr) PARTITIONS 4
--
ERROR: syntax error (1 : 43)
CREATE TABLE test (attr INT) PARTITION BY (attr) PARTITIONS 4
                                          ^
==

# Number of partitions greater than 64 not allowed
CREATE TABLE test (attr INT) PARTITION BY HASH(attr) PARTITIONS 65
--
ERROR: NUMBER OF PARITIONS must be between 1 and 64 (1 : 65)
...INT) PARTITION BY HASH(attr) PARTITIONS 65
                                           ^
==

# Missing PARTITION BY clause not allowed
CREATE TABLE test (attr INT) PARTITIONS 4
--
ERROR: syntax error (1 : 30)
CREATE TABLE test (attr INT) PARTITIONS 4
                             ^
==

CREATE TABLE test (attr INT) WITH BLOCKPROPERTIES
(TYPE rowstore)
--
CreateTableStatement[relation_name=test]
+-attribute_list=
| +-AttributeDefinition[name=attr,type=Int]
+-block_properties=
  +-BlockProperties
    +-block_property=KeyStringValue[key=TYPE]
      +-value=String[value=rowstore]
==

CREATE TABLE test (attr INT) WITH BLOCKPROPERTIES
(TYPE compressed_columnstore, SORT attr, COMPRESS ALL)
--
CreateTableStatement[relation_name=test]
+-attribute_list=
| +-AttributeDefinition[name=attr,type=Int]
+-block_properties=
  +-BlockProperties
    +-block_property=KeyStringValue[key=TYPE]
    | +-value=String[value=compressed_columnstore]
    +-block_property=KeyStringValue[key=SORT]
    | +-value=String[value=attr]
    +-block_property=KeyStringValue[key=COMPRESS]
      +-value=String[value=ALL]
==

CREATE TABLE test (attr1 INT, attr2 INT) WITH BLOCKPROPERTIES
(TYPE compressed_columnstore, SORT attr1, COMPRESS (attr1, attr2))
--
CreateTableStatement[relation_name=test]
+-attribute_list=
| +-AttributeDefinition[name=attr1,type=Int]
| +-AttributeDefinition[name=attr2,type=Int]
+-block_properties=
  +-BlockProperties
    +-block_property=KeyStringValue[key=TYPE]
    | +-value=String[value=compressed_columnstore]
    +-block_property=KeyStringValue[key=SORT]
    | +-value=String[value=attr1]
    +-block_property=KeyStringList[key=COMPRESS]
      +-value_list=
        +-String[value=attr1]
        +-String[value=attr2]
==

CREATE TABLE test (attr INT) WITH BLOCKPROPERTIES
(TYPE rowstore, BLOCKSIZEMB 10);
--
CreateTableStatement[relation_name=test]
+-attribute_list=
| +-AttributeDefinition[name=attr,type=Int]
+-block_properties=
  +-BlockProperties
    +-block_property=KeyStringValue[key=TYPE]
    | +-value=String[value=rowstore]
    +-block_property=KeyIntegerValue[key=BLOCKSIZEMB]
      +-value=NumericLiteral[numeric_string=10,float_like=false]
