You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hj...@apache.org on 2014/11/12 07:40:56 UTC
[12/15] tajo git commit: TAJO-1109: Separate SQL Statements from
Catalog Stores. (Jihun Kang via hyunsik)
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/DBMSSchemaDefinition.xsd
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/DBMSSchemaDefinition.xsd b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/DBMSSchemaDefinition.xsd
new file mode 100644
index 0000000..be37807
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/DBMSSchemaDefinition.xsd
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<schema targetNamespace="http://tajo.apache.org/catalogstore"
+ elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="http://tajo.apache.org/catalogstore">
+
+ <simpleType name="DatabaseObjectsType">
+ <annotation>
+ <documentation>
+ PostgreSQL defines its database objects in this
+ following link
+ (http://www.postgresql.org/docs/9.3/static/server-programming.html).
+ We also need to define these objects type to support in
+ our catalog stores.
+ </documentation>
+ </annotation>
+ <restriction base="string">
+ <enumeration value="table"></enumeration>
+ <enumeration value="view"></enumeration>
+ <enumeration value="function"></enumeration>
+ <enumeration value="operator"></enumeration>
+ <enumeration value="data"></enumeration>
+ <enumeration value="domain"></enumeration>
+ <enumeration value="trigger"></enumeration>
+ <enumeration value="rule"></enumeration>
+ <enumeration value="sequence"></enumeration>
+ <enumeration value="index"></enumeration>
+ </restriction>
+ </simpleType>
+
+ <simpleType name="ExecutionOrderType">
+ <restriction base="int">
+ <minInclusive value="0"></minInclusive>
+ </restriction>
+ </simpleType>
+
+ <complexType name="ObjectsType">
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element name="Object" type="tns:ObjectType" minOccurs="1" maxOccurs="unbounded"></element>
+ </sequence>
+ </complexType>
+
+ <complexType name="ObjectType">
+ <sequence>
+ <element name="sql" type="tns:SqlType" minOccurs="1"></element>
+ </sequence>
+ <attributeGroup ref="tns:ObjectAttributeGroup"></attributeGroup>
+ </complexType>
+
+ <attributeGroup name="ObjectAttributeGroup">
+ <attribute name="name" type="tns:ObjectNameType" use="required"></attribute>
+ <attribute name="order" type="tns:ExecutionOrderType"></attribute>
+ <attribute name="dependsOn" type="tns:ObjectNameType"></attribute>
+ <attribute name="type" type="tns:DatabaseObjectsType"
+ use="required">
+ </attribute>
+ </attributeGroup>
+
+ <simpleType name="SqlType">
+ <restriction base="string"></restriction>
+ </simpleType>
+
+ <complexType name="PatchesType">
+ <sequence>
+ <element name="patch" type="tns:PatchType" minOccurs="0" maxOccurs="unbounded"></element>
+ </sequence>
+ </complexType>
+
+ <complexType name="BaseSchemaType">
+ <sequence>
+ <element name="objects" type="tns:ObjectsType" minOccurs="0" maxOccurs="1"></element>
+ </sequence>
+ <attributeGroup ref="tns:BaseSchemaAttributeGroup"></attributeGroup>
+ </complexType>
+
+ <attributeGroup name="BaseSchemaAttributeGroup">
+ <attribute name="schemaname" type="tns:SchemaNameType" use="optional"></attribute>
+ <attribute name="version" type="tns:SchemaVersionType"
+ use="required">
+ </attribute>
+ </attributeGroup>
+
+ <simpleType name="SchemaVersionType">
+ <restriction base="int">
+ <minInclusive value="0"></minInclusive>
+ </restriction>
+ </simpleType>
+
+ <complexType name="PatchType">
+ <sequence>
+ <element name="objects" type="tns:ObjectsType" minOccurs="0" maxOccurs="1"></element>
+ </sequence>
+ <attributeGroup ref="tns:PatchAttributeGroup"></attributeGroup>
+ </complexType>
+
+ <simpleType name="ObjectNameType">
+ <restriction base="string">
+ <minLength value="1"></minLength>
+ </restriction>
+ </simpleType>
+
+ <simpleType name="SchemaNameType">
+ <restriction base="string">
+ <minLength value="1"></minLength>
+ </restriction>
+ </simpleType>
+
+ <attributeGroup name="PatchAttributeGroup">
+ <attribute name="priorVersion" type="tns:SchemaVersionType"
+ use="required">
+ </attribute>
+ <attribute name="nextVersion" type="tns:SchemaVersionType"></attribute>
+ </attributeGroup>
+
+ <complexType name="CatalogStoreType">
+ <sequence>
+ <element name="base" type="tns:BaseSchemaType" minOccurs="0"
+ maxOccurs="1">
+ </element>
+ <element name="patches" type="tns:PatchesType" minOccurs="0"
+ maxOccurs="1">
+ </element>
+ <element name="existQueries" type="tns:ExistsQueriesType"
+ minOccurs="0" maxOccurs="1">
+ </element>
+ <element name="dropStatements" type="tns:DropStatementsType" minOccurs="0" maxOccurs="1"></element>
+ </sequence>
+ </complexType>
+
+ <element name="store" type="tns:CatalogStoreType"></element>
+
+ <complexType name="ExistsQueryType">
+ <sequence>
+ <element name="sql" type="tns:SqlType" minOccurs="1" maxOccurs="1"></element>
+ </sequence>
+ <attribute name="type" type="tns:DatabaseObjectsType"
+ use="required">
+ </attribute>
+ </complexType>
+
+ <complexType name="ExistsQueriesType">
+ <sequence>
+ <element name="existQuery" type="tns:ExistsQueryType" minOccurs="0" maxOccurs="unbounded"></element>
+ </sequence>
+ </complexType>
+
+ <complexType name="DropStatementsType">
+ <sequence>
+ <element name="dropStatement" type="tns:DropStatementType" minOccurs="0" maxOccurs="unbounded"></element>
+ </sequence>
+ </complexType>
+
+ <complexType name="DropStatementType">
+ <sequence>
+ <element name="sql" type="tns:SqlType" minOccurs="1" maxOccurs="1"></element>
+ </sequence>
+ <attribute name="type" type="tns:DatabaseObjectsType"
+ use="required">
+ </attribute>
+ </complexType>
+</schema>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/columns.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/columns.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/columns.sql
deleted file mode 100644
index e274f3c..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/columns.sql
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE COLUMNS (
- TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
- COLUMN_NAME VARCHAR(128) NOT NULL,
- ORDINAL_POSITION INTEGER NOT NULL,
- DATA_TYPE CHAR(16),
- TYPE_LENGTH INTEGER,
- CONSTRAINT COLUMNS_PK PRIMARY KEY (TID, COLUMN_NAME)
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/databases.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/databases.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/databases.sql
deleted file mode 100644
index 8cabb14..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/databases.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE DATABASES_ (
- DB_ID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
- DB_NAME VARCHAR(128) NOT NULL CONSTRAINT DB_NAME_UNIQ UNIQUE,
- SPACE_ID INT NOT NULL REFERENCES TABLESPACES (SPACE_ID),
- CONSTRAINT DATABASES_PK PRIMARY KEY (DB_ID)
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/databases_idx.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/databases_idx.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/databases_idx.sql
deleted file mode 100644
index c9c7d4e..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/databases_idx.sql
+++ /dev/null
@@ -1 +0,0 @@
-CREATE UNIQUE INDEX idx_database_db_id on DATABASES_ (DB_ID)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/derby.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/derby.xml b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/derby.xml
new file mode 100644
index 0000000..db2473b
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/derby.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<tns:store xmlns:tns="http://tajo.apache.org/catalogstore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition.xsd ">
+ <tns:base version="2">
+ <tns:objects>
+ <tns:Object order="0" type="table" name="META">
+ <tns:sql><![CDATA[CREATE TABLE META (VERSION INT NOT NULL)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="1" type="table" name="TABLESPACES">
+ <tns:sql><![CDATA[
+ CREATE TABLE TABLESPACES (
+ SPACE_ID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ SPACE_NAME VARCHAR(128) NOT NULL CONSTRAINT SPACE_UNIQUE UNIQUE,
+ SPACE_HANDLER VARCHAR (1024) DEFAULT 'HDFS',
+ SPACE_URI VARCHAR (4096) NOT NULL,
+ CONSTRAINT C_SPACE_PK PRIMARY KEY (SPACE_ID)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="2" type="table" name="DATABASES_">
+ <tns:sql><![CDATA[
+ CREATE TABLE DATABASES_ (
+ DB_ID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ DB_NAME VARCHAR(128) NOT NULL CONSTRAINT DB_NAME_UNIQ UNIQUE,
+ SPACE_ID INT NOT NULL REFERENCES TABLESPACES (SPACE_ID),
+ CONSTRAINT DATABASES_PK PRIMARY KEY (DB_ID)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="3" type="index" name="IDX_DATABASE_DB_ID" dependsOn="DATABASES_">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_database_db_id on DATABASES_ (DB_ID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="4" type="table" name="TABLES">
+ <tns:sql><![CDATA[
+ CREATE TABLE TABLES (
+ TID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ DB_ID int NOT NULL REFERENCES DATABASES_ (DB_ID),
+ TABLE_NAME VARCHAR(128) NOT NULL,
+ TABLE_TYPE VARCHAR(128) NOT NULL,
+ PATH VARCHAR(4096),
+ STORE_TYPE CHAR(16),
+ CONSTRAINT TABLES_PK PRIMARY KEY (TID),
+ CONSTRAINT C_TABLE_ID_UNIQ UNIQUE (DB_ID, TABLE_NAME)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="5" type="index" name="IDX_TABLES_TID" dependsOn="TABLES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_tables_tid on TABLES (TID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="6" type="index" name="IDX_TABLES_NAME" dependsOn="TABLES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_tables_name on TABLES (DB_ID, TABLE_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="7" type="table" name="COLUMNS">
+ <tns:sql><![CDATA[
+ CREATE TABLE COLUMNS (
+ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
+ COLUMN_NAME VARCHAR(128) NOT NULL,
+ ORDINAL_POSITION INTEGER NOT NULL,
+ DATA_TYPE CHAR(16),
+ TYPE_LENGTH INTEGER,
+ CONSTRAINT COLUMNS_PK PRIMARY KEY (TID, COLUMN_NAME)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="8" type="index" name="IDX_FK_COLUMNS_TABLE_NAME" dependsOn="COLUMNS">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_fk_columns_table_name on COLUMNS (TID, COLUMN_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="9" type="table" name="OPTIONS">
+ <tns:sql><![CDATA[
+ CREATE TABLE OPTIONS (
+ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
+ KEY_ VARCHAR(255) NOT NULL,
+ VALUE_ VARCHAR(255) NOT NULL,
+ CONSTRAINT C_OPTIONS_UNIQUE UNIQUE (TID, KEY_, VALUE_)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="10" type="index" name="IDX_OPTIONS_KEY" dependsOn="OPTIONS">
+ <tns:sql><![CDATA[CREATE INDEX idx_options_key on OPTIONS (TID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="11" type="table" name="INDEXES">
+ <tns:sql><![CDATA[
+ CREATE TABLE INDEXES (
+ DB_ID INT NOT NULL REFERENCES DATABASES_ (DB_ID) ON DELETE CASCADE,
+ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
+ INDEX_NAME VARCHAR(128) NOT NULL,
+ COLUMN_NAME VARCHAR(128) NOT NULL,
+ DATA_TYPE VARCHAR(128) NOT NULL,
+ INDEX_TYPE CHAR(32) NOT NULL,
+ IS_UNIQUE BOOLEAN NOT NULL,
+ IS_CLUSTERED BOOLEAN NOT NULL,
+ IS_ASCENDING BOOLEAN NOT NULL,
+ CONSTRAINT C_INDEXES_PK PRIMARY KEY (DB_ID, INDEX_NAME)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="12" type="index" name="IDX_INDEXES_PK" dependsOn="INDEXES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_indexes_pk ON INDEXES (DB_ID,index_name)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="13" type="index" name="IDX_INDEXES_COLUMNS" dependsOn="INDEXES">
+ <tns:sql><![CDATA[CREATE INDEX idx_indexes_columns ON INDEXES (DB_ID,column_name)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="14" type="table" name="STATS">
+ <tns:sql><![CDATA[
+ CREATE TABLE STATS (
+ TID INT NOT NULL PRIMARY KEY,
+ NUM_ROWS BIGINT,
+ NUM_BYTES BIGINT,
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="15" type="index" name="IDX_STATS_TABLE_NAME" dependsOn="STATS">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX IDX_STATS_TABLE_NAME ON STATS (TID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="16" type="table" name="PARTITION_METHODS">
+ <tns:sql><![CDATA[
+ CREATE TABLE PARTITION_METHODS (
+ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
+ PARTITION_TYPE VARCHAR(10) NOT NULL,
+ EXPRESSION VARCHAR(1024) NOT NULL,
+ EXPRESSION_SCHEMA VARCHAR(1024) FOR BIT DATA NOT NULL
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="17" type="index" name="IDX_PARTITION_METHODS_TABLE_ID" dependsOn="PARTITION_METHODS">
+ <tns:sql><![CDATA[CREATE INDEX idx_partition_methods_table_id ON PARTITION_METHODS (TID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object name="PARTITIONS" type="table" order="18">
+ <tns:sql><![CDATA[
+ CREATE TABLE PARTITIONS (
+ PID INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
+ PARTITION_NAME VARCHAR(255),
+ ORDINAL_POSITION INT NOT NULL,
+ PARTITION_VALUE VARCHAR(1024),
+ PATH VARCHAR(1024),
+ CONSTRAINT C_PARTITION_PK PRIMARY KEY (PID),
+ CONSTRAINT C_PARTITION_UNIQUE UNIQUE (TID, PARTITION_NAME)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="IDX_PARTITIONS_TABLE_NAME" type="index" dependsOn="PARTITIONS" order="19">
+ <tns:sql><![CDATA[CREATE INDEX idx_partitions_table_name ON PARTITIONS(TID)]]></tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:base>
+ <tns:existQueries>
+ <tns:existQuery type="trigger">
+ <tns:sql><![CDATA[
+ select a.TRIGGERNAME from SYS.SYSTRIGGERS a
+ ]]></tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="sequence">
+ <tns:sql><![CDATA[
+ select a.SEQUENCENAME from SYS.SYSSEQUENCES a
+ ]]></tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="view">
+ <tns:sql><![CDATA[
+ select a.TABLENAME from SYS.SYSTABLES a where a.TABLETYPE = 'V'
+ ]]></tns:sql>
+ </tns:existQuery>
+ </tns:existQueries>
+ <tns:dropStatements>
+ <tns:dropStatement type="sequence">
+ <tns:sql><![CDATA[DROP SEQUENCE ? RESTRICT]]></tns:sql>
+ </tns:dropStatement>
+ </tns:dropStatements>
+</tns:store>
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/indexes.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/indexes.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/indexes.sql
deleted file mode 100644
index c4cfc25..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/indexes.sql
+++ /dev/null
@@ -1,12 +0,0 @@
-CREATE TABLE INDEXES (
- DB_ID INT NOT NULL REFERENCES DATABASES_ (DB_ID) ON DELETE CASCADE,
- TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
- INDEX_NAME VARCHAR(128) NOT NULL,
- COLUMN_NAME VARCHAR(128) NOT NULL,
- DATA_TYPE VARCHAR(128) NOT NULL,
- INDEX_TYPE CHAR(32) NOT NULL,
- IS_UNIQUE BOOLEAN NOT NULL,
- IS_CLUSTERED BOOLEAN NOT NULL,
- IS_ASCENDING BOOLEAN NOT NULL,
- CONSTRAINT C_INDEXES_PK PRIMARY KEY (DB_ID, INDEX_NAME)
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/partition_methods.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/partition_methods.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/partition_methods.sql
deleted file mode 100644
index 4ad4c60..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/partition_methods.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE PARTITION_METHODS (
- TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
- PARTITION_TYPE VARCHAR(10) NOT NULL,
- EXPRESSION VARCHAR(1024) NOT NULL,
- EXPRESSION_SCHEMA VARCHAR(1024) FOR BIT DATA NOT NULL
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/partitions.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/partitions.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/partitions.sql
deleted file mode 100644
index 24ee422..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/partitions.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-CREATE TABLE PARTITIONS (
- PID INT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
- TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
- PARTITION_NAME VARCHAR(255),
- ORDINAL_POSITION INT NOT NULL,
- PARTITION_VALUE VARCHAR(1024),
- PATH VARCHAR(1024),
- CONSTRAINT C_PARTITION_PK PRIMARY KEY (PID),
- CONSTRAINT C_PARTITION_UNIQUE UNIQUE (TID, PARTITION_NAME)
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/stats.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/stats.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/stats.sql
deleted file mode 100644
index bba8ee7..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/stats.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE STATS (
- TID INT NOT NULL PRIMARY KEY,
- NUM_ROWS BIGINT,
- NUM_BYTES BIGINT,
- FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/table_properties.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/table_properties.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/table_properties.sql
deleted file mode 100644
index 2b2d89a..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/table_properties.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE OPTIONS (
- TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
- KEY_ VARCHAR(255) NOT NULL,
- VALUE_ VARCHAR(255) NOT NULL,
- CONSTRAINT C_OPTIONS_UNIQUE UNIQUE (TID, KEY_, VALUE_)
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/tables.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/tables.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/tables.sql
deleted file mode 100644
index 3e15c5b..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/tables.sql
+++ /dev/null
@@ -1,10 +0,0 @@
-CREATE TABLE TABLES (
- TID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
- DB_ID int NOT NULL REFERENCES DATABASES_ (DB_ID),
- TABLE_NAME VARCHAR(128) NOT NULL,
- TABLE_TYPE VARCHAR(128) NOT NULL,
- PATH VARCHAR(4096),
- STORE_TYPE CHAR(16),
- CONSTRAINT TABLES_PK PRIMARY KEY (TID),
- CONSTRAINT C_TABLE_ID_UNIQ UNIQUE (DB_ID, TABLE_NAME)
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/tablespaces.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/tablespaces.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/tablespaces.sql
deleted file mode 100644
index c2af3ae..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/derby/tablespaces.sql
+++ /dev/null
@@ -1,7 +0,0 @@
-CREATE TABLE TABLESPACES (
- SPACE_ID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
- SPACE_NAME VARCHAR(128) NOT NULL CONSTRAINT SPACE_UNIQUE UNIQUE,
- SPACE_HANDLER VARCHAR (1024) DEFAULT 'HDFS',
- SPACE_URI VARCHAR (4096) NOT NULL,
- CONSTRAINT C_SPACE_PK PRIMARY KEY (SPACE_ID)
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/oracle/oracle.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/oracle/oracle.xml b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/oracle/oracle.xml
new file mode 100644
index 0000000..8945fca
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/oracle/oracle.xml
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<tns:store xmlns:tns="http://tajo.apache.org/catalogstore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition.xsd ">
+ <tns:base version="2">
+ <tns:objects>
+ <tns:Object order="0" type="table" name="meta">
+ <tns:sql><![CDATA[
+ CREATE TABLE META (VERSION INT NOT NULL)]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="1" type="table" name="tablespaces">
+ <tns:sql><![CDATA[
+ CREATE TABLE TABLESPACES (
+ SPACE_ID NUMBER(10) NOT NULL PRIMARY KEY,
+ SPACE_NAME VARCHAR2(128) NOT NULL UNIQUE,
+ SPACE_HANDLER VARCHAR2(1024) DEFAULT 'HDFS',
+ SPACE_URI VARCHAR2(4000) NOT NULL
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="2" type="sequence" name="TABLESPACES_SEQ">
+ <tns:sql><![CDATA[CREATE SEQUENCE TABLESPACES_SEQ]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="3" type="trigger" name="TABLESPACES_AUTOINC">
+ <tns:sql><![CDATA[
+ CREATE OR REPLACE TRIGGER TABLESPACES_AUTOINC
+ BEFORE INSERT ON TABLESPACES
+ FOR EACH ROW
+ WHEN (new.SPACE_ID IS NULL)
+ BEGIN
+ SELECT TABLESPACES_SEQ.NEXTVAL INTO :new.SPACE_ID FROM DUAL;
+ END;]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="4" type="table" name="DATABASES_">
+ <tns:sql><![CDATA[
+ CREATE TABLE DATABASES_ (
+ DB_ID NUMBER(10) NOT NULL PRIMARY KEY,
+ DB_NAME VARCHAR2(128) NOT NULL UNIQUE,
+ SPACE_ID INT NOT NULL,
+ FOREIGN KEY (SPACE_ID) REFERENCES TABLESPACES (SPACE_ID)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="5" type="sequence" name="DATABASES__SEQ">
+ <tns:sql><![CDATA[
+ CREATE SEQUENCE DATABASES__SEQ
+ ]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="6" type="trigger" name="DATABASES__AUTOINC">
+ <tns:sql><![CDATA[
+ CREATE OR REPLACE TRIGGER DATABASES__AUTOINC
+ BEFORE INSERT ON DATABASES_
+ FOR EACH ROW
+ WHEN (new.DB_ID IS NULL)
+ BEGIN
+ SELECT DATABASES__SEQ.NEXTVAL INTO :new.DB_ID FROM DUAL;
+ END;]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="7" type="table" name="TABLES">
+ <tns:sql><![CDATA[
+ CREATE TABLE TABLES (
+ TID NUMBER(10) NOT NULL PRIMARY KEY,
+ DB_ID INT NOT NULL,
+ TABLE_NAME VARCHAR2(128) NOT NULL,
+ TABLE_TYPE VARCHAR2(128) NOT NULL,
+ PATH VARCHAR2(4000),
+ STORE_TYPE CHAR(16),
+ FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="8" type="sequence" name="TABLES_SEQ">
+ <tns:sql><![CDATA[
+ CREATE SEQUENCE TABLES_SEQ
+ ]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="9" type="trigger" name="TABLES_AUTOINC">
+ <tns:sql><![CDATA[
+ CREATE OR REPLACE TRIGGER TABLES_AUTOINC
+ BEFORE INSERT ON TABLES
+ FOR EACH ROW
+ WHEN (new.TID IS NULL)
+ BEGIN
+ SELECT TABLES_SEQ.NEXTVAL INTO :new.TID FROM DUAL;
+ END;]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="10" type="index" name="TABLES_IDX_DB_ID" dependsOn="TABLES">
+ <tns:sql><![CDATA[CREATE INDEX TABLES_IDX_DB_ID on TABLES (DB_ID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="11" type="index" name="TABLES_IDX_TABLE_ID" dependsOn="TABLES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX TABLES_IDX_TABLE_ID on TABLES (DB_ID, TABLE_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="12" type="table" name="COLUMNS">
+ <tns:sql><![CDATA[
+ CREATE TABLE COLUMNS (
+ TID INT NOT NULL,
+ COLUMN_NAME VARCHAR2(255) NOT NULL,
+ ORDINAL_POSITION INT NOT NULL,
+ DATA_TYPE CHAR(16),
+ TYPE_LENGTH INTEGER,
+ CONSTRAINT COLUMNS_PKEY PRIMARY KEY (TID, COLUMN_NAME),
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="13" type="table" name="OPTIONS">
+ <tns:sql><![CDATA[
+ CREATE TABLE OPTIONS (
+ TID INT NOT NULL,
+ KEY_ VARCHAR2(255) NOT NULL,
+ VALUE_ VARCHAR2(255) NOT NULL,
+ CONSTRAINT OPTIONS_PKEY PRIMARY KEY (TID, KEY_),
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="14" type="table" name="INDEXES">
+ <tns:sql><![CDATA[
+ CREATE TABLE INDEXES (
+ DB_ID INT NOT NULL,
+ TID INT NOT NULL,
+ INDEX_NAME VARCHAR2(128) NOT NULL,
+ COLUMN_NAME VARCHAR2(128) NOT NULL,
+ DATA_TYPE VARCHAR2(128) NOT NULL,
+ INDEX_TYPE CHAR(32) NOT NULL,
+ IS_UNIQUE CHAR NOT NULL,
+ IS_CLUSTERED CHAR NOT NULL,
+ IS_ASCENDING CHAR NOT NULL,
+ CONSTRAINT INDEXES_PKEY PRIMARY KEY (DB_ID, INDEX_NAME),
+ FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID) ON DELETE CASCADE,
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="15" type="index" name="INDEXES_IDX_TID_COLUMN_NAME" dependsOn="INDEXES">
+ <tns:sql><![CDATA[CREATE INDEX INDEXES_IDX_TID_COLUMN_NAME on INDEXES (TID, COLUMN_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="16" type="table" name="STATS">
+ <tns:sql><![CDATA[
+ CREATE TABLE STATS (
+ TID INT NOT NULL PRIMARY KEY,
+ NUM_ROWS NUMBER(38),
+ NUM_BYTES NUMBER(38),
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="17" type="table" name="PARTITION_METHODS">
+ <tns:sql><![CDATA[
+ CREATE TABLE PARTITION_METHODS (
+ TID INT NOT NULL PRIMARY KEY,
+ PARTITION_TYPE VARCHAR2(10) NOT NULL,
+ EXPRESSION VARCHAR2(1024) NOT NULL,
+ EXPRESSION_SCHEMA RAW(1024) NOT NULL,
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="18" type="table" name="PARTITIONS">
+ <tns:sql><![CDATA[
+ CREATE TABLE PARTITIONS (
+ PID INT NOT NULL PRIMARY KEY,
+ TID INT NOT NULL,
+ PARTITION_NAME VARCHAR2(128),
+ ORDINAL_POSITION INT NOT NULL,
+ PARTITION_VALUE VARCHAR2(1024),
+ PATH VARCHAR2(4000),
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE,
+ CONSTRAINT C_PARTITION_UNIQUE UNIQUE (TID, PARTITION_NAME)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="19" type="index" name="PARTITIONS_IDX_TID" dependsOn="PARTITIONS">
+ <tns:sql><![CDATA[CREATE INDEX PARTITIONS_IDX_TID on PARTITIONS (TID)]]></tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:base>
+ <tns:existQueries>
+ <tns:existQuery type="trigger">
+ <tns:sql><![CDATA[SELECT TRIGGER_NAME FROM USER_TRIGGERS]]></tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="sequence">
+ <tns:sql><![CDATA[SELECT SEQUENCE_NAME FROM USER_SEQUENCES]]></tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="view">
+ <tns:sql><![CDATA[SELECT VIEW_NAME FROM USER_VIEWS]]></tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="index">
+ <tns:sql><![CDATA[SELECT INDEX_NAME FROM USER_INDEXES]]></tns:sql>
+ </tns:existQuery>
+ </tns:existQueries>
+ <tns:dropStatements>
+ <tns:dropStatement type="table">
+ <tns:sql><![CDATA[DROP TABLE ? CASCADE CONSTRAINT]]></tns:sql>
+ </tns:dropStatement>
+ </tns:dropStatements>
+</tns:store>
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/indexes.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/indexes.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/indexes.sql
deleted file mode 100644
index cbb28fc..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/indexes.sql
+++ /dev/null
@@ -1,14 +0,0 @@
-CREATE TABLE INDEXES (
- DB_ID INT NOT NULL,
- TID INT NOT NULL,
- INDEX_NAME VARCHAR(128) NOT NULL,
- COLUMN_NAME VARCHAR(128) NOT NULL,
- DATA_TYPE VARCHAR(128) NOT NULL,
- INDEX_TYPE CHAR(32) NOT NULL,
- IS_UNIQUE BOOLEAN NOT NULL,
- IS_CLUSTERED BOOLEAN NOT NULL,
- IS_ASCENDING BOOLEAN NOT NULL,
- CONSTRAINT INDEXES_PKEY PRIMARY KEY (DB_ID, INDEX_NAME),
- FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID) ON DELETE CASCADE,
- FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/postgresql.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/postgresql.xml b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/postgresql.xml
new file mode 100644
index 0000000..8e5cbcc
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/postgresql.xml
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<tns:store xmlns:tns="http://tajo.apache.org/catalogstore"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition.xsd ">
+ <tns:base version="2">
+ <tns:objects>
+ <tns:Object name="META" type="table" order="0">
+ <tns:sql><![CDATA[CREATE TABLE META (VERSION INT NOT NULL)]]></tns:sql>
+ </tns:Object>
+ <tns:Object name="TABLESPACES" type="table" order="1">
+ <tns:sql><![CDATA[
+ CREATE TABLE TABLESPACES (
+ SPACE_ID SERIAL NOT NULL PRIMARY KEY,
+ SPACE_NAME VARCHAR(128) NOT NULL UNIQUE,
+ SPACE_HANDLER VARCHAR (1024) DEFAULT 'HDFS',
+ SPACE_URI VARCHAR (4096) NOT NULL
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="TABLESPACES_IDX_NAME" type="index" order="2" dependsOn="TABLESPACES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX TABLESPACES_IDX_NAME on TABLESPACES (SPACE_NAME)]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="DATABASES_" type="table" order="3">
+ <tns:sql><![CDATA[
+ CREATE TABLE DATABASES_ (
+ DB_ID SERIAL NOT NULL PRIMARY KEY,
+ DB_NAME VARCHAR(128) NOT NULL UNIQUE,
+ SPACE_ID INT NOT NULL,
+ FOREIGN KEY (SPACE_ID) REFERENCES TABLESPACES (SPACE_ID)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="DATABASES__IDX_NAME" type="index" order="4" dependsOn="DATABASES_">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX DATABASES__IDX_NAME on DATABASES_ (DB_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object name="TABLES" type="table" order="5">
+ <tns:sql><![CDATA[
+ CREATE TABLE TABLES (
+ TID SERIAL NOT NULL PRIMARY KEY,
+ DB_ID INT NOT NULL,
+ TABLE_NAME VARCHAR(128) NOT NULL,
+ TABLE_TYPE VARCHAR(128) NOT NULL,
+ PATH VARCHAR(4096),
+ STORE_TYPE CHAR(16),
+ FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="TABLES_IDX_DB_ID" type="index" order="6" dependsOn="TABLES">
+ <tns:sql><![CDATA[CREATE INDEX TABLES_IDX_DB_ID on TABLES (DB_ID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object name="TABLES_IDX_TABLE_ID" type="index" order="7" dependsOn="TABLES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX TABLES_IDX_TABLE_ID on TABLES (DB_ID, TABLE_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object name="COLUMNS" type="table" order="8">
+ <tns:sql><![CDATA[
+ CREATE TABLE COLUMNS (
+ TID INT NOT NULL,
+ COLUMN_NAME VARCHAR(255) NOT NULL,
+ ORDINAL_POSITION INT NOT NULL,
+ DATA_TYPE CHAR(16),
+ TYPE_LENGTH INTEGER,
+ CONSTRAINT COLUMNS_PKEY PRIMARY KEY (TID, COLUMN_NAME),
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="OPTIONS" type="table" order="9">
+ <tns:sql><![CDATA[
+ CREATE TABLE OPTIONS (
+ TID INT NOT NULL,
+ KEY_ VARCHAR(255) NOT NULL,
+ VALUE_ VARCHAR(255) NOT NULL,
+ CONSTRAINT OPTIONS_PKEY PRIMARY KEY (TID, KEY_),
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="INDEXES" type="table" order="10">
+ <tns:sql><![CDATA[
+ CREATE TABLE INDEXES (
+ DB_ID INT NOT NULL,
+ TID INT NOT NULL,
+ INDEX_NAME VARCHAR(128) NOT NULL,
+ COLUMN_NAME VARCHAR(128) NOT NULL,
+ DATA_TYPE VARCHAR(128) NOT NULL,
+ INDEX_TYPE CHAR(32) NOT NULL,
+ IS_UNIQUE BOOLEAN NOT NULL,
+ IS_CLUSTERED BOOLEAN NOT NULL,
+ IS_ASCENDING BOOLEAN NOT NULL,
+ CONSTRAINT INDEXES_PKEY PRIMARY KEY (DB_ID, INDEX_NAME),
+ FOREIGN KEY (DB_ID) REFERENCES DATABASES_ (DB_ID) ON DELETE CASCADE,
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="INDEXES_IDX_DB_ID_NAME" type="index" order="11" dependsOn="INDEXES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX INDEXES_IDX_DB_ID_NAME on INDEXES (DB_ID, INDEX_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object name="INDEXES_IDX_TID_COLUMN_NAME" type="index" order="12" dependsOn="INDEXES">
+ <tns:sql><![CDATA[CREATE INDEX INDEXES_IDX_TID_COLUMN_NAME on INDEXES (TID, COLUMN_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object name="STATS" type="table" order="13">
+ <tns:sql><![CDATA[
+ CREATE TABLE STATS (
+ TID INT NOT NULL PRIMARY KEY,
+ NUM_ROWS BIGINT,
+ NUM_BYTES BIGINT,
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="PARTITION_METHODS" type="table" order="14">
+ <tns:sql><![CDATA[
+ CREATE TABLE PARTITION_METHODS (
+ TID INT NOT NULL PRIMARY KEY,
+ PARTITION_TYPE VARCHAR(10) NOT NULL,
+ EXPRESSION VARCHAR(1024) NOT NULL,
+ EXPRESSION_SCHEMA BYTEA NOT NULL,
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="PARTITIONS" type="table" order="15">
+ <tns:sql><![CDATA[
+ CREATE TABLE PARTITIONS (
+ PID INT NOT NULL PRIMARY KEY,
+ TID INT NOT NULL,
+ PARTITION_NAME VARCHAR(128),
+ ORDINAL_POSITION INT NOT NULL,
+ PARTITION_VALUE VARCHAR(1024),
+ PATH VARCHAR(4096),
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE,
+ CONSTRAINT C_PARTITION_UNIQUE UNIQUE (TID, PARTITION_NAME)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object name="PARTITIONS_IDX_TID" type="index" order="16" dependsOn="PARTITIONS">
+ <tns:sql><![CDATA[CREATE INDEX PARTITIONS_IDX_TID on PARTITIONS (TID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object name="IDX_TID_NAME" type="index" order="17" dependsOn="PARTITIONS">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX IDX_TID_NAME on PARTITIONS (TID, PARTITION_NAME)]]></tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:base>
+ <tns:existQueries>
+ <tns:existQuery type="table">
+ <tns:sql><![CDATA[
+ select c.relname from pg_class c, pg_roles r
+ where c.relowner = r.oid and r.rolname = current_user and c.relkind = 'r'::char]]>
+ </tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="view">
+ <tns:sql><![CDATA[
+ select c.relname from pg_class c, pg_roles r
+ where c.relowner = r.oid and r.rolname = current_user and c.relkind = 'v'::char]]>
+ </tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="index">
+ <tns:sql><![CDATA[
+ select c.relname from pg_class c, pg_roles r
+ where c.relowner = r.oid and r.rolname = current_user and c.relkind = 'i'::char]]>
+ </tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="sequence">
+ <tns:sql><![CDATA[
+ select c.relname from pg_class c, pg_roles r
+ where c.relowner = r.oid and r.rolname = current_user and c.relkind = 'S'::char]]>
+ </tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="trigger">
+ <tns:sql><![CDATA[
+ select tgname from pg_trigger t
+ where t.tgrelid in
+ (select c.oid from pg_class c, pg_roles r
+ where c.relowner = r.oid and r.rolname = current_user and c.relkind = 'r'::char)]]>
+ </tns:sql>
+ </tns:existQuery>
+ </tns:existQueries>
+ <tns:dropStatements>
+ <tns:dropStatement type="table">
+ <tns:sql><![CDATA[DROP TABLE ? CASCADE]]></tns:sql>
+ </tns:dropStatement>
+ </tns:dropStatements>
+</tns:store>
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/stats.sql
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/stats.sql b/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/stats.sql
deleted file mode 100644
index bba8ee7..0000000
--- a/tajo-catalog/tajo-catalog-server/src/main/resources/schemas/postgresql/stats.sql
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE STATS (
- TID INT NOT NULL PRIMARY KEY,
- NUM_ROWS BIGINT,
- NUM_BYTES BIGINT,
- FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
-)
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/store/TestXMLCatalogSchemaManager.java
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/store/TestXMLCatalogSchemaManager.java b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/store/TestXMLCatalogSchemaManager.java
new file mode 100644
index 0000000..fdb8556
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/test/java/org/apache/tajo/catalog/store/TestXMLCatalogSchemaManager.java
@@ -0,0 +1,496 @@
+/**
+ * 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.
+ */
+
+package org.apache.tajo.catalog.store;
+
+import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.*;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.Driver;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+
+import org.apache.hadoop.fs.Path;
+import org.apache.tajo.catalog.CatalogConstants;
+import org.apache.tajo.catalog.store.object.DatabaseObject;
+import org.apache.tajo.catalog.store.object.DatabaseObjectType;
+import org.apache.tajo.catalog.store.object.SchemaPatch;
+import org.apache.tajo.util.CommonTestingUtil;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Matcher;
+import org.hamcrest.Matchers;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExternalResource;
+import org.junit.runner.Description;
+import org.junit.runners.model.InitializationError;
+
+public class TestXMLCatalogSchemaManager {
+
+ private static Path testPath;
+ private Path testDatabasePath;
+ private Connection conn;
+ private Driver driver;
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.METHOD)
+ @interface SetupPrepMethods {
+ boolean makeJDBCConnection() default true;
+ }
+
+ @Rule
+ public ExternalResource resource = new ExternalResource() {
+
+ private Description description;
+
+ @Override
+ public org.junit.runners.model.Statement apply(org.junit.runners.model.Statement base,
+ Description description) {
+ this.description = description;
+ return super.apply(base, description);
+ }
+
+ @Override
+ protected void before() throws Throwable {
+ SetupPrepMethods prepMethod = this.description.getAnnotation(SetupPrepMethods.class);
+
+ if (prepMethod == null || prepMethod.makeJDBCConnection()) {
+ setUpJDBC();
+ }
+ }
+
+ @Override
+ protected void after() {
+ SetupPrepMethods prepMethod = this.description.getAnnotation(SetupPrepMethods.class);
+
+ if (prepMethod == null || prepMethod.makeJDBCConnection()) {
+ try {
+ tearDownJDBC();
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+ }
+
+ };
+
+ private class CollectionMatcher<T> extends TypeSafeDiagnosingMatcher<Iterable<? extends T>> {
+
+ private final Matcher<? extends T> matcher;
+
+ public CollectionMatcher(Matcher<? extends T> matcher) {
+ this.matcher = matcher;
+ }
+
+ @Override
+ public void describeTo(org.hamcrest.Description description) {
+ description.appendText("a collection containing ").appendDescriptionOf(this.matcher);
+ }
+
+ @Override
+ protected boolean matchesSafely(Iterable<? extends T> item, org.hamcrest.Description mismatchDescription) {
+ boolean isFirst = true;
+ Iterator<? extends T> iterator = item.iterator();
+
+ while (iterator.hasNext()) {
+ T obj = iterator.next();
+ if (this.matcher.matches(obj)) {
+ return true;
+ }
+
+ if (!isFirst) {
+ mismatchDescription.appendText(", ");
+ }
+
+ this.matcher.describeMismatch(obj, mismatchDescription);
+ isFirst = false;
+ }
+ return false;
+ }
+
+ }
+
+ private <T> Matcher<Iterable<? extends T>> hasItem(Matcher<? extends T> matcher) {
+ return new CollectionMatcher<T>(matcher);
+ }
+
+ @BeforeClass
+ public static void setUpClass() throws Exception {
+ testPath = CommonTestingUtil.getTestDir();
+ }
+
+ @AfterClass
+ public static void tearDownClass() throws Exception {
+ CommonTestingUtil.cleanupTestDir(testPath.toUri().getPath());
+ }
+
+ public void setUpJDBC() throws Exception {
+ testDatabasePath = CommonTestingUtil.getTestDir();
+
+ driver = new org.apache.derby.jdbc.EmbeddedDriver();
+ DriverManager.registerDriver(driver);
+ conn = DriverManager.getConnection("jdbc:derby:"+testDatabasePath.toUri().getPath()+"/db;create=true");
+
+ if (conn == null) {
+ throw new InitializationError("JDBC connection is null.");
+ }
+ }
+
+ public void tearDownJDBC() throws Exception {
+ try {
+ DriverManager.getConnection("jdbc:derby:;shutdown=true");
+ } catch (SQLException se) {
+ if ((se.getErrorCode() != 50000) || (!se.getSQLState().equals("XJ015"))) {
+ throw se;
+ }
+ }
+
+ conn = null;
+ CommonTestingUtil.cleanupTestDir(testDatabasePath.toUri().getPath());
+ DriverManager.deregisterDriver(driver);
+ }
+
+ protected <T> BaseMatcher<T> hasItemInResultSet(final String expected, final String columnName) {
+ return new BaseMatcher<T>() {
+ private final List<String> results = new ArrayList<String>();
+
+ @Override
+ public boolean matches(Object item) {
+ boolean result = false;
+
+ if (item instanceof ResultSet) {
+ ResultSet rs = (ResultSet) item;
+
+ try {
+ while (rs.next()) {
+ results.add(rs.getString(columnName));
+ if (expected.equals(rs.getString(columnName))) {
+ result = true;
+ break;
+ }
+ }
+ } catch (SQLException e) {
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public void describeTo(org.hamcrest.Description description) {
+ description.appendText(expected);
+ }
+
+ @Override
+ public void describeMismatch(Object item, org.hamcrest.Description description) {
+ description.appendText("were ").appendText(results.toString());
+ }
+ };
+ }
+
+ protected Path createTestJar() throws Exception {
+ Path jarPath = new Path(testPath, "testxml.jar");
+ Manifest manifest = new Manifest();
+ manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0");
+ JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(new File(jarPath.toUri())), manifest);
+ JarEntry entry = new JarEntry("schemas/jartest/");
+ jarOut.putNextEntry(entry);
+ jarOut.closeEntry();
+ entry = new JarEntry("schemas/jartest/test.xml");
+ jarOut.putNextEntry(entry);
+ InputStream xmlInputStream =
+ new BufferedInputStream(ClassLoader.getSystemResourceAsStream("schemas/derbytest/loadtest/derby.xml"));
+ byte[] buffer = new byte[1024];
+ int readSize = -1;
+
+ while ((readSize = xmlInputStream.read(buffer)) > -1) {
+ jarOut.write(buffer, 0, readSize);
+ }
+ jarOut.closeEntry();
+ jarOut.close();
+ xmlInputStream.close();
+
+ return jarPath;
+ }
+
+ @Test
+ @SetupPrepMethods(makeJDBCConnection=false)
+ public void testListJarResources() throws Exception {
+ XMLCatalogSchemaManager manager;
+ Path jarPath;
+ URL jarUrl;
+
+ jarPath = createTestJar();
+ jarUrl = jarPath.toUri().toURL();
+
+ URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
+ Method addURLMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
+ addURLMethod.setAccessible(true);
+ addURLMethod.invoke(classLoader, jarUrl);
+
+ assertThat(classLoader.getURLs(), hasItemInArray(jarUrl));
+
+ manager = new XMLCatalogSchemaManager("schemas/jartest");
+
+ assertThat(manager.isLoaded(), is(true));
+ assertNotNull("Base Schema object cannot be null", manager.getCatalogStore().getSchema());
+ assertThat(manager.getCatalogStore().getSchema().getObjects(), not(empty()));
+ }
+
+ @Test
+ public void testCreateBaseSchema() throws Exception {
+ XMLCatalogSchemaManager manager;
+ Statement stmt;
+
+ manager = new XMLCatalogSchemaManager("schemas/derbytest/loadtest");
+ assertThat(manager.isLoaded(), is(true));
+
+ stmt = conn.createStatement();
+ stmt.addBatch("create schema " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.addBatch("set current schema " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.executeBatch();
+ manager.createBaseSchema(conn);
+
+ DatabaseMetaData metadata = conn.getMetaData();
+ ResultSet tables =
+ metadata.getTables(null, manager.getCatalogStore().getSchema().getSchemaName().toUpperCase(),
+ CatalogConstants.TB_PARTITION_METHODS, new String[] {"TABLE"});
+
+ assertTrue(tables.next());
+ assertEquals(CatalogConstants.TB_PARTITION_METHODS, tables.getString("TABLE_NAME"));
+
+ ResultSet triggers =
+ stmt.executeQuery("select a.TRIGGERNAME from SYS.SYSTRIGGERS a inner join SYS.SYSSCHEMAS b " +
+ " on a.SCHEMAID = b.SCHEMAID where b.SCHEMANAME = 'TAJO'");
+
+ assertThat(triggers, hasItemInResultSet("TABLESPACES_HIST_TRG", "TRIGGERNAME"));
+ }
+
+ @Test
+ public void testIsInitialized() throws Exception {
+ XMLCatalogSchemaManager manager;
+ Statement stmt;
+
+ manager = new XMLCatalogSchemaManager("schemas/derbytest/querytest");
+ assertThat(manager.isLoaded(), is(true));
+
+ stmt = conn.createStatement();
+ stmt.executeUpdate("CREATE SCHEMA " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.executeUpdate("SET CURRENT SCHEMA " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.executeUpdate("CREATE TABLE TESTTABLE1 (COL1 INT, COL2 VARCHAR(10))");
+
+ assertThat(manager.isInitialized(conn), is(false));
+
+ stmt.addBatch("CREATE TABLE TESTTABLE2 (COL1 INT, COL2 VARCHAR(10))");
+ stmt.addBatch("CREATE INDEX TESTINDEX1 ON TESTTABLE1 (COL1)");
+ stmt.addBatch("CREATE TRIGGER TESTTRIGGER1 " +
+ " AFTER INSERT ON TESTTABLE1 " +
+ " REFERENCING NEW AS NEWROW " +
+ " FOR EACH ROW " +
+ " INSERT INTO TESTTABLE2 " +
+ " (COL1, COL2) " +
+ " VALUES " +
+ " (NEWROW.COL1, NEWROW.COL2)");
+ stmt.addBatch("CREATE SEQUENCE TESTSEQ AS INT");
+ stmt.addBatch("CREATE VIEW TESTVIEW (TESTTEXT) AS VALUES 'Text1', 'Text2'");
+ stmt.executeBatch();
+
+ assertThat(manager.isInitialized(conn), is(true));
+ }
+
+ @Test
+ public void testDropBaseSchema() throws Exception {
+ XMLCatalogSchemaManager manager;
+ DatabaseMetaData meta;
+ Statement stmt;
+
+ manager = new XMLCatalogSchemaManager("schemas/derbytest/querytest");
+ assertThat(manager.isLoaded(), is(true));
+ assertThat(manager.getCatalogStore().getDropStatements(), hasSize(1));
+
+ stmt = conn.createStatement();
+ stmt.addBatch("CREATE SCHEMA " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.addBatch("SET CURRENT SCHEMA " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.addBatch("CREATE TABLE TESTTABLE1 (COL1 INT, COL2 VARCHAR(10))");
+ stmt.addBatch("CREATE TABLE TESTTABLE2 (COL1 INT, COL2 VARCHAR(10))");
+ stmt.addBatch("CREATE INDEX TESTINDEX1 ON TESTTABLE1 (COL1)");
+ stmt.addBatch("CREATE TRIGGER TESTTRIGGER1 " +
+ " AFTER INSERT ON TESTTABLE1 " +
+ " REFERENCING NEW AS NEWROW " +
+ " FOR EACH ROW " +
+ " INSERT INTO TESTTABLE2 " +
+ " (COL1, COL2) " +
+ " VALUES " +
+ " (NEWROW.COL1, NEWROW.COL2)");
+ stmt.addBatch("CREATE SEQUENCE TESTSEQ AS INT");
+ stmt.addBatch("CREATE VIEW TESTVIEW (TESTTEXT) AS VALUES 'Text1', 'Text2'");
+ stmt.executeBatch();
+
+ meta = conn.getMetaData();
+ assertThat(meta.getTables(null, manager.getCatalogStore().getSchema().getSchemaName().toUpperCase(),
+ null, new String[] {"TABLE"}),
+ allOf(hasItemInResultSet("TESTTABLE1", "TABLE_NAME"),
+ hasItemInResultSet("TESTTABLE2", "TABLE_NAME")));
+ assertThat(meta.getIndexInfo(null, manager.getCatalogStore().getSchema().getSchemaName().toUpperCase(),
+ "TESTTABLE1", false, true), hasItemInResultSet("TESTINDEX1", "INDEX_NAME"));
+
+ manager.dropBaseSchema(conn);
+
+ assertThat(meta.getTables(null, manager.getCatalogStore().getSchema().getSchemaName().toUpperCase(),
+ null, new String[] {"TABLE"}),
+ allOf(not(hasItemInResultSet("TESTTABLE1", "TABLE_NAME")),
+ not(hasItemInResultSet("TESTTABLE2", "TABLE_NAME"))));
+ ResultSet triggers =
+ stmt.executeQuery("select a.TRIGGERNAME from SYS.SYSTRIGGERS a inner join SYS.SYSSCHEMAS b " +
+ " on a.SCHEMAID = b.SCHEMAID where b.SCHEMANAME = '" +
+ manager.getCatalogStore().getSchema().getSchemaName().toUpperCase() + "'");
+ assertThat(triggers, not(hasItemInResultSet("TESTTRIGGER1", "TRIGGERNAME")));
+ ResultSet views =
+ stmt.executeQuery("select a.TABLENAME from SYS.SYSTABLES a inner join SYS.SYSSCHEMAS b " +
+ " on a.SCHEMAID = b.SCHEMAID where a.TABLETYPE = 'V' and b.SCHEMANAME = '" +
+ manager.getCatalogStore().getSchema().getSchemaName().toUpperCase() + "'");
+ assertThat(views, not(hasItemInResultSet("TESTVIEW", "TABLENAME")));
+ }
+
+ @Test
+ public void testCheckExistance() throws Exception {
+ XMLCatalogSchemaManager manager;
+ Statement stmt;
+
+ manager = new XMLCatalogSchemaManager("schemas/derbytest/querytest");
+ assertThat(manager.isLoaded(), is(true));
+
+ stmt = conn.createStatement();
+ stmt.addBatch("create schema " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.addBatch("set current schema " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.executeBatch();
+ manager.createBaseSchema(conn);
+
+ assertThat(manager.checkExistance(conn, DatabaseObjectType.TABLE, "TESTTABLE1"), is(true));
+ assertThat(manager.checkExistance(conn, DatabaseObjectType.TABLE, "TESTTABLE3"), is(false));
+ assertThat(manager.checkExistance(conn, DatabaseObjectType.INDEX, "testtable1", "TESTINDEX1"), is(true));
+ assertThat(manager.checkExistance(conn, DatabaseObjectType.TRIGGER, "TESTTRIGGER1"), is(true));
+ assertThat(manager.checkExistance(conn, DatabaseObjectType.SEQUENCE, "TESTSEQ"), is(true));
+ assertThat(manager.checkExistance(conn, DatabaseObjectType.VIEW, "TESTVIEW"), is(true));
+ }
+
+ @Test
+ public void testContinueSchemaCreation() throws Exception {
+ XMLCatalogSchemaManager manager;
+ Statement stmt;
+
+ manager = new XMLCatalogSchemaManager("schemas/derbytest/querytest");
+ assertThat(manager.isLoaded(), is(true));
+
+ stmt = conn.createStatement();
+ stmt.addBatch("create schema " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.addBatch("set current schema " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.addBatch("CREATE TABLE TESTTABLE1 (COL1 INT, COL2 VARCHAR(10))");
+ stmt.addBatch("CREATE INDEX TESTINDEX1 ON TESTTABLE1 (COL1)");
+ stmt.executeBatch();
+ manager.createBaseSchema(conn);
+
+ assertTrue(manager.checkExistance(conn, DatabaseObjectType.TABLE, "TESTTABLE2"));
+ }
+
+ @Test
+ @SetupPrepMethods(makeJDBCConnection=false)
+ public void testMergeSchemaFile() throws Exception {
+ XMLCatalogSchemaManager manager;
+
+ manager = new XMLCatalogSchemaManager("schemas/derbytest/mergetest");
+ assertThat(manager.isLoaded(), is(true));
+
+ assertThat(manager.getCatalogStore().getSchema().getObjects(), hasSize(4));
+ assertThat(manager.getCatalogStore().getSchema().getObjects(),
+ hasItem(Matchers.<DatabaseObject>hasProperty("name", is("TESTINDEX1"))));
+ assertThat(manager.getCatalogStore().getSchema().getObjects(),
+ hasItem(Matchers.<DatabaseObject>hasProperty("name", is("TESTTRIGGER1"))));
+ assertThat(manager.getCatalogStore().getSchema().getObjects(),
+ hasItem(Matchers.<DatabaseObject>hasProperty("order", is(3))));
+ assertThat(manager.getCatalogStore().getPatches(), hasSize(1));
+ assertThat(manager.getCatalogStore().getPatches(),
+ hasItem(Matchers.<SchemaPatch>hasProperty("priorVersion", is(1))));
+ assertThat(manager.getCatalogStore().getPatches(),
+ hasItem(Matchers.<SchemaPatch>hasProperty("nextVersion", is(2))));
+ }
+
+ @Test
+ public void testUpgradeSchemaObjects() throws Exception {
+ XMLCatalogSchemaManager manager;
+ Statement stmt;
+
+ manager = new XMLCatalogSchemaManager("schemas/derbytest/upgradetest");
+ assertThat(manager.isLoaded(), is(true));
+ assertThat(manager.getCatalogStore().getPatches(), hasSize(1));
+ assertThat(manager.getCatalogStore().getPatches().get(0).getObjects(), hasSize(2));
+
+ stmt = conn.createStatement();
+ stmt.addBatch("create schema " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.addBatch("set current schema " + manager.getCatalogStore().getSchema().getSchemaName());
+ stmt.addBatch("CREATE TABLE TESTTABLE1 (COL1 INT, COL2 VARCHAR(10))");
+ stmt.addBatch("CREATE INDEX TESTINDEX1 ON TESTTABLE1 (COL1)");
+ stmt.addBatch("CREATE TABLE TESTTABLE2 (COL1 INT, COL2 VARCHAR(10))");
+ stmt.executeBatch();
+ manager.upgradeBaseSchema(conn, 1);
+
+ DatabaseMetaData metadata = conn.getMetaData();
+ ResultSet columns = metadata.getColumns(null,
+ manager.getCatalogStore().getSchema().getSchemaName().toUpperCase(),
+ "TESTTABLE2", "COL2");
+
+ assertThat(columns.next(), is(true));
+ assertThat(columns.getInt("DATA_TYPE"), is(Types.VARCHAR));
+ assertThat(columns.getInt("COLUMN_SIZE"), is(20));
+
+ columns = metadata.getColumns(null,
+ manager.getCatalogStore().getSchema().getSchemaName().toUpperCase(),
+ "TESTTABLE2", "COL3");
+
+ assertThat(columns.next(), is(true));
+ assertThat(columns.getInt("DATA_TYPE"), is(Types.VARCHAR));
+ assertThat(columns.getInt("COLUMN_SIZE"), is(25));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/loadtest/derby.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/loadtest/derby.xml b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/loadtest/derby.xml
new file mode 100644
index 0000000..86fd5e8
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/loadtest/derby.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<tns:store xmlns:tns="http://tajo.apache.org/catalogstore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../DBMSSchemaDefinition.xsd ">
+ <tns:base version="2" schemaname="tajo">
+ <tns:objects>
+ <tns:Object order="0" type="table" name="META">
+ <tns:sql><![CDATA[CREATE TABLE META (VERSION INT NOT NULL)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="1" type="table" name="TABLESPACES">
+ <tns:sql><![CDATA[
+ CREATE TABLE TABLESPACES (
+ SPACE_ID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ SPACE_NAME VARCHAR(128) NOT NULL CONSTRAINT SPACE_UNIQUE UNIQUE,
+ SPACE_HANDLER VARCHAR (1024) DEFAULT 'HDFS',
+ SPACE_URI VARCHAR (4096) NOT NULL,
+ CONSTRAINT C_SPACE_PK PRIMARY KEY (SPACE_ID)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="2" type="table" name="DATABASES_">
+ <tns:sql><![CDATA[
+ CREATE TABLE DATABASES_ (
+ DB_ID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ DB_NAME VARCHAR(128) NOT NULL CONSTRAINT DB_NAME_UNIQ UNIQUE,
+ SPACE_ID INT NOT NULL REFERENCES TABLESPACES (SPACE_ID),
+ CONSTRAINT DATABASES_PK PRIMARY KEY (DB_ID)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="3" type="index" name="IDX_DATABASE_DB_ID" dependsOn="DATABASES_">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_database_db_id on DATABASES_ (DB_ID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="4" type="table" name="TABLES">
+ <tns:sql><![CDATA[
+ CREATE TABLE TABLES (
+ TID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ DB_ID int NOT NULL REFERENCES DATABASES_ (DB_ID),
+ TABLE_NAME VARCHAR(128) NOT NULL,
+ TABLE_TYPE VARCHAR(128) NOT NULL,
+ PATH VARCHAR(4096),
+ STORE_TYPE CHAR(16),
+ CONSTRAINT TABLES_PK PRIMARY KEY (TID),
+ CONSTRAINT C_TABLE_ID_UNIQ UNIQUE (DB_ID, TABLE_NAME)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="5" type="index" name="IDX_TABLES_TID" dependsOn="TABLES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_tables_tid on TABLES (TID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="6" type="index" name="IDX_TABLES_NAME" dependsOn="TABLES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_tables_name on TABLES (DB_ID, TABLE_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="7" type="table" name="COLUMNS">
+ <tns:sql><![CDATA[
+ CREATE TABLE COLUMNS (
+ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
+ COLUMN_NAME VARCHAR(128) NOT NULL,
+ ORDINAL_POSITION INTEGER NOT NULL,
+ DATA_TYPE CHAR(16),
+ TYPE_LENGTH INTEGER,
+ CONSTRAINT COLUMNS_PK PRIMARY KEY (TID, COLUMN_NAME)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="8" type="index" name="IDX_FK_COLUMNS_TABLE_NAME" dependsOn="COLUMNS">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_fk_columns_table_name on COLUMNS (TID, COLUMN_NAME)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="9" type="table" name="OPTIONS">
+ <tns:sql><![CDATA[
+ CREATE TABLE OPTIONS (
+ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
+ KEY_ VARCHAR(255) NOT NULL,
+ VALUE_ VARCHAR(255) NOT NULL,
+ CONSTRAINT C_OPTIONS_UNIQUE UNIQUE (TID, KEY_, VALUE_)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="10" type="index" name="IDX_OPTIONS_KEY" dependsOn="OPTIONS">
+ <tns:sql><![CDATA[CREATE INDEX idx_options_key on OPTIONS (TID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="11" type="table" name="INDEXES">
+ <tns:sql><![CDATA[
+ CREATE TABLE INDEXES (
+ DB_ID INT NOT NULL REFERENCES DATABASES_ (DB_ID) ON DELETE CASCADE,
+ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
+ INDEX_NAME VARCHAR(128) NOT NULL,
+ COLUMN_NAME VARCHAR(128) NOT NULL,
+ DATA_TYPE VARCHAR(128) NOT NULL,
+ INDEX_TYPE CHAR(32) NOT NULL,
+ IS_UNIQUE BOOLEAN NOT NULL,
+ IS_CLUSTERED BOOLEAN NOT NULL,
+ IS_ASCENDING BOOLEAN NOT NULL,
+ CONSTRAINT C_INDEXES_PK PRIMARY KEY (DB_ID, INDEX_NAME)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="12" type="index" name="IDX_INDEXES_PK" dependsOn="INDEXES">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX idx_indexes_pk ON INDEXES (DB_ID,index_name)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="13" type="index" name="IDX_INDEXES_COLUMNS" dependsOn="INDEXES">
+ <tns:sql><![CDATA[CREATE INDEX idx_indexes_columns ON INDEXES (DB_ID,column_name)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="14" type="table" name="STATS">
+ <tns:sql><![CDATA[
+ CREATE TABLE STATS (
+ TID INT NOT NULL PRIMARY KEY,
+ NUM_ROWS BIGINT,
+ NUM_BYTES BIGINT,
+ FOREIGN KEY (TID) REFERENCES TABLES (TID) ON DELETE CASCADE
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="15" type="index" name="IDX_STATS_TABLE_NAME" dependsOn="STATS">
+ <tns:sql><![CDATA[CREATE UNIQUE INDEX IDX_STATS_TABLE_NAME ON STATS (TID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="16" type="table" name="PARTITION_METHODS">
+ <tns:sql><![CDATA[
+ CREATE TABLE PARTITION_METHODS (
+ TID INT NOT NULL REFERENCES TABLES (TID) ON DELETE CASCADE,
+ PARTITION_TYPE VARCHAR(10) NOT NULL,
+ EXPRESSION VARCHAR(1024) NOT NULL,
+ EXPRESSION_SCHEMA VARCHAR(1024) FOR BIT DATA NOT NULL
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="17" type="index" name="IDX_PARTITION_METHODS_TABLE_ID" dependsOn="PARTITION_METHODS">
+ <tns:sql><![CDATA[CREATE INDEX idx_partition_methods_table_id ON PARTITION_METHODS (TID)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="18" type="table" name="TABLESPACES_HIST">
+ <tns:sql><![CDATA[
+ CREATE TABLE TABLESPACES_HIST (
+ SPACE_HIST_ID int NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
+ SPACE_NAME VARCHAR(128) NOT NULL CONSTRAINT SPACE_HIST_UNIQUE UNIQUE,
+ SPACE_HANDLER VARCHAR (1024) DEFAULT 'HDFS',
+ SPACE_URI VARCHAR (4096) NOT NULL,
+ CONSTRAINT C_SPACE_HIST_PK PRIMARY KEY (SPACE_HIST_ID)
+ )]]>
+ </tns:sql>
+ </tns:Object>
+ <tns:Object order="19" type="trigger" name="TABLESPACES_HIST_TRG">
+ <tns:sql><![CDATA[
+ CREATE TRIGGER TABLESPACES_HIST_TRG
+ AFTER INSERT ON TABLESPACES
+ REFERENCING NEW AS NEWROW
+ FOR EACH ROW
+ INSERT INTO TABLESPACES_HIST
+ (SPACE_NAME, SPACE_URI)
+ VALUES
+ (NEWROW.SPACE_NAME, NEWROW.SPACE_URI)
+ ]]>
+ </tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:base>
+ <tns:existQueries>
+ <tns:existQuery type="trigger">
+ <tns:sql><![CDATA[
+ select a.TRIGGERNAME from SYS.SYSTRIGGERS a inner join SYS.SYSSCHEMAS b
+ on a.SCHEMAID = b.SCHEMAID where b.SCHEMANAME = ?
+ ]]></tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="sequence">
+ <tns:sql><![CDATA[
+ select a.SEQUENCENAME from SYS.SYSSEQUENCES a inner join SYS.SYSSCHEMAS b
+ on a.SCHEMAID = b.SCHEMAID where b.SCHEMANAME = ?
+ ]]></tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="view">
+ <tns:sql><![CDATA[
+ select a.TABLENAME from SYS.SYSTABLES a inner join SYS.SYSSCHEMAS b
+ on a.SCHEMAID = b.SCHEMAID where b.SCHEMANAME = ? and a.TABLETYPE = 'V'
+ ]]></tns:sql>
+ </tns:existQuery>
+ </tns:existQueries>
+</tns:store>
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/mergetest/base_version_1.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/mergetest/base_version_1.xml b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/mergetest/base_version_1.xml
new file mode 100644
index 0000000..5c44d29
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/mergetest/base_version_1.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<tns:store xmlns:tns="http://tajo.apache.org/catalogstore"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://tajo.apache.org/catalogstore ../../../../../main/resources/schemas/DBMSSchemaDefinition.xsd ">
+ <tns:base version="1">
+ <tns:objects>
+ <tns:Object order="0" type="table" name="TESTTABLE1">
+ <tns:sql><![CDATA[CREATE TABLE TESTTABLE1 (COL1 INT, COL2 VARCHAR(20))]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="1" type="index" name="TESTINDEX1" dependsOn="TESTTABLE1">
+ <tns:sql><![CDATA[CREATE INDEX TESTINDEX1 ON TESTTABLE1 (COL1)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="2" type="table" name="TESTTABLE2">
+ <tns:sql><![CDATA[CREATE TABLE TESTTABLE2 (COL1 INT, COL2 VARCHAR(10))]]></tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:base>
+</tns:store>
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/mergetest/base_version_2.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/mergetest/base_version_2.xml b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/mergetest/base_version_2.xml
new file mode 100644
index 0000000..706432c
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/mergetest/base_version_2.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<tns:store xmlns:tns="http://tajo.apache.org/catalogstore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../../../../../main/resources/schemas/DBMSSchemaDefinition.xsd ">
+ <tns:base version="2">
+ <tns:objects>
+ <tns:Object order="0" type="table" name="TESTTABLE1">
+ <tns:sql><![CDATA[CREATE TABLE TESTTABLE1 (COL1 INT, COL2 VARCHAR(20))]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="1" type="index" name="TESTINDEX1" dependsOn="TESTTABLE1">
+ <tns:sql><![CDATA[CREATE INDEX TESTINDEX1 ON TESTTABLE1 (COL1)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="2" type="table" name="TESTTABLE2">
+ <tns:sql><![CDATA[CREATE TABLE TESTTABLE2 (COL1 INT, COL2 VARCHAR(10))]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="3" type="trigger" name="TESTTRIGGER1">
+ <tns:sql><![CDATA[
+ CREATE TRIGGER TESTTRIGGER1
+ AFTER INSERT ON TESTTABLE1
+ REFERENCING NEW AS NEWROW
+ FOR EACH ROW
+ INSERT INTO TESTTABLE2
+ (COL1, COL2)
+ VALUES
+ (NEWROW.COL1, NEWROW.COL2)
+ ]]></tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:base>
+ <tns:patches>
+ <tns:patch priorVersion="1" nextVersion="2">
+ <tns:objects>
+ <tns:Object name="TESTTRIGGER1" type="trigger" order="0">
+ <tns:sql><![CDATA[
+ CREATE TRIGGER TESTTRIGGER1
+ AFTER INSERT ON TESTTABLE1
+ REFERENCING NEW AS NEWROW
+ FOR EACH ROW
+ INSERT INTO TESTTABLE2
+ (COL1, COL2)
+ VALUES
+ (NEWROW.COL1, NEWROW.COL2)
+ ]]></tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:patch>
+ </tns:patches>
+</tns:store>
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/querytest/derby.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/querytest/derby.xml b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/querytest/derby.xml
new file mode 100644
index 0000000..9016ccd
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/querytest/derby.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<tns:store xmlns:tns="http://tajo.apache.org/catalogstore"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://tajo.apache.org/catalogstore ../../../../../main/resources/schemas/DBMSSchemaDefinition.xsd ">
+ <tns:base version="1" schemaname="tajo">
+ <tns:objects>
+ <tns:Object order="0" type="table" name="TESTTABLE1">
+ <tns:sql><![CDATA[CREATE TABLE TESTTABLE1 (COL1 INT, COL2 VARCHAR(10))]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="1" type="index" name="TESTINDEX1" dependsOn="TESTTABLE1">
+ <tns:sql><![CDATA[CREATE INDEX TESTINDEX1 ON TESTTABLE1 (COL1)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="2" type="table" name="TESTTABLE2">
+ <tns:sql><![CDATA[CREATE TABLE TESTTABLE2 (COL1 INT, COL2 VARCHAR(10))]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="3" type="trigger" name="TESTTRIGGER1">
+ <tns:sql><![CDATA[
+ CREATE TRIGGER TESTTRIGGER1
+ AFTER INSERT ON TESTTABLE1
+ REFERENCING NEW AS NEWROW
+ FOR EACH ROW
+ INSERT INTO TESTTABLE2
+ (COL1, COL2)
+ VALUES
+ (NEWROW.COL1, NEWROW.COL2)
+ ]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="4" type="sequence" name="TESTSEQ">
+ <tns:sql><![CDATA[CREATE SEQUENCE TESTSEQ AS INT]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="5" type="view" name="TESTVIEW">
+ <tns:sql><![CDATA[CREATE VIEW TESTVIEW (TESTTEXT) AS VALUES 'Text1', 'Text2']]></tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:base>
+ <tns:existQueries>
+ <tns:existQuery type="trigger">
+ <tns:sql><![CDATA[
+ select a.TRIGGERNAME from SYS.SYSTRIGGERS a inner join SYS.SYSSCHEMAS b
+ on a.SCHEMAID = b.SCHEMAID where b.SCHEMANAME = ?
+ ]]></tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="sequence">
+ <tns:sql><![CDATA[
+ select a.SEQUENCENAME from SYS.SYSSEQUENCES a inner join SYS.SYSSCHEMAS b
+ on a.SCHEMAID = b.SCHEMAID where b.SCHEMANAME = ?
+ ]]></tns:sql>
+ </tns:existQuery>
+ <tns:existQuery type="view">
+ <tns:sql><![CDATA[
+ select a.TABLENAME from SYS.SYSTABLES a inner join SYS.SYSSCHEMAS b
+ on a.SCHEMAID = b.SCHEMAID where b.SCHEMANAME = ? and a.TABLETYPE = 'V'
+ ]]></tns:sql>
+ </tns:existQuery>
+ </tns:existQueries>
+ <tns:dropStatements>
+ <tns:dropStatement type="sequence">
+ <tns:sql>DROP SEQUENCE ? RESTRICT</tns:sql>
+ </tns:dropStatement>
+ </tns:dropStatements>
+</tns:store>
http://git-wip-us.apache.org/repos/asf/tajo/blob/00555685/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/upgradetest/base_version_2.xml
----------------------------------------------------------------------
diff --git a/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/upgradetest/base_version_2.xml b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/upgradetest/base_version_2.xml
new file mode 100644
index 0000000..f6a6675
--- /dev/null
+++ b/tajo-catalog/tajo-catalog-server/src/test/resources/schemas/derbytest/upgradetest/base_version_2.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<tns:store xmlns:tns="http://tajo.apache.org/catalogstore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tajo.apache.org/catalogstore ../../../../../main/resources/schemas/DBMSSchemaDefinition.xsd ">
+ <tns:base version="2" schemaname="tajo">
+ <tns:objects>
+ <tns:Object order="0" type="table" name="TESTTABLE1">
+ <tns:sql><![CDATA[CREATE TABLE TESTTABLE1 (COL1 INT, COL2 VARCHAR(20))]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="1" type="index" name="TESTINDEX1" dependsOn="TESTTABLE1">
+ <tns:sql><![CDATA[CREATE INDEX TESTINDEX1 ON TESTTABLE1 (COL1)]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="2" type="table" name="TESTTABLE2">
+ <tns:sql><![CDATA[CREATE TABLE TESTTABLE2 (COL1 INT, COL2 VARCHAR(20), COL3 VARCHAR(25))]]></tns:sql>
+ </tns:Object>
+ <tns:Object order="3" type="trigger" name="TESTTRIGGER1">
+ <tns:sql><![CDATA[
+ CREATE TRIGGER TESTTRIGGER1
+ AFTER INSERT ON TESTTABLE1
+ REFERENCING NEW AS NEWROW
+ FOR EACH ROW
+ INSERT INTO TESTTABLE2
+ (COL1, COL2)
+ VALUES
+ (NEWROW.COL1, NEWROW.COL2)
+ ]]></tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:base>
+ <tns:patches>
+ <tns:patch priorVersion="1" nextVersion="2">
+ <tns:objects>
+ <tns:Object name="TESTTABLE2" type="table" order="0">
+ <tns:sql><![CDATA[ALTER TABLE TESTTABLE2 ALTER COLUMN COL2 SET DATA TYPE VARCHAR(20)]]></tns:sql>
+ </tns:Object>
+ <tns:Object name="TESTTABLE2" type="table" order="1">
+ <tns:sql><![CDATA[ALTER TABLE TESTTABLE2 ADD COLUMN COL3 VARCHAR(25)]]></tns:sql>
+ </tns:Object>
+ </tns:objects>
+ </tns:patch>
+ </tns:patches>
+</tns:store>