You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by db...@apache.org on 2016/04/01 00:16:31 UTC
[20/50] [abbrv] incubator-trafodion git commit: update
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/sqlcomp/CmpSeabaseDDLroutine.h
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLroutine.h b/core/sql/sqlcomp/CmpSeabaseDDLroutine.h
new file mode 100644
index 0000000..18b6d7a
--- /dev/null
+++ b/core/sql/sqlcomp/CmpSeabaseDDLroutine.h
@@ -0,0 +1,280 @@
+// @@@ START COPYRIGHT @@@
+//
+// 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.
+//
+// @@@ END COPYRIGHT @@@
+
+#ifndef _CMP_SEABASE_PROCEDURES_H_
+#define _CMP_SEABASE_PROCEDURES_H_
+
+#include "CmpSeabaseDDL.h"
+
+// To add a new procedure:
+// update export/lib/lib_mgmt.jar to include code for the new procedure
+// add a define representing the procedures below
+// add a static const QString representing the create procedure text
+// add a new entry in allLibmgrRoutineInfo
+// perform initialize trafodion, upgrade library management
+// recommend that new procedures are added in alphabetic order
+
+// At this time there is no support to drop or change the signature of an
+// existing procedure. Since customers may be using the procedures, it is
+// recommended that they not be dropped or changed - instead add new ones
+// to handle the required change.
+
+// List of supported system procedures - in alphabetic order
+#define SYSTEM_PROC_ADDLIB "ADDLIB"
+#define SYSTEM_PROC_ALTERLIB "ALTERLIB"
+#define SYSTEM_PROC_DROPLIB "DROPLIB"
+#define SYSTEM_PROC_GETFILE "GETFILE"
+#define SYSTEM_PROC_HELP "HELP"
+#define SYSTEM_PROC_LS "LS"
+#define SYSTEM_PROC_LSALL "LSALL"
+#define SYSTEM_PROC_PUT "PUT"
+#define SYSTEM_PROC_RM "RM"
+#define SYSTEM_PROC_RMREX "RMREX"
+
+// Create procedure text for system procedures
+static const QString seabaseProcAddlibDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\"."SYSTEM_PROC_ADDLIB" "},
+ {" ( "},
+ {" IN LIBNAME VARCHAR(1024) CHARACTER SET UTF8, "},
+ {" IN FILENAME VARCHAR(1024) CHARACTER SET UTF8, "},
+ {" IN HOSTNAME VARCHAR(1024) CHARACTER SET UTF8, "},
+ {" IN LOCALFILE VARCHAR(1024) CHARACTER SET UTF8) "},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.addLib (java.lang.String,java.lang.String,java.lang.String,java.lang.String)' "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" CONTAINS SQL "},
+ {" NO TRANSACTION REQUIRED "},
+ {" ; "}
+};
+
+static const QString seabaseProcAlterlibDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".ALTERLIB "},
+ {" ( "},
+ {" IN LIBNAME VARCHAR(1024) CHARACTER SET UTF8,"},
+ {" IN FILENAME VARCHAR(1024) CHARACTER SET UTF8,"},
+ {" IN HOSTNAME VARCHAR(1024) CHARACTER SET UTF8,"},
+ {" IN LOCALFILE VARCHAR(1024) CHARACTER SET UTF8) "},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.alterLib (java.lang.String,java.lang.String,java.lang.String,java.lang.String)' "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" CONTAINS SQL "},
+ {" NO TRANSACTION REQUIRED "},
+ {" ; "}
+};
+
+static const QString seabaseProcDroplibDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".DROPLIB "},
+ {" ( "},
+ {" IN LIBNAME VARCHAR(1024) CHARACTER SET UTF8, "},
+ {" IN MODETYPE VARCHAR(1024) CHARACTER SET ISO88591) "},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.dropLib (java.lang.String,java.lang.String)' "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" CONTAINS SQL "},
+ {" NO TRANSACTION REQUIRED "},
+ {" ; "}
+};
+
+static const QString seabaseProcGetfileDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".GETFILE "},
+ {" ( "},
+ {" IN FILENAME VARCHAR(256) CHARACTER SET UTF8,"},
+ {" IN OFFSET INTEGER,"},
+ {" OUT FILEDATA VARCHAR(12800) CHARACTER SET UTF8,"},
+ {" OUT DATALENGTH LARGEINT)"},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.get (java.lang.String,int,java.lang.String[],long[])' "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" READS SQL DATA "},
+ {" NO TRANSACTION REQUIRED "},
+ {" ; "}
+};
+
+static const QString seabaseProcHelpDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".HELP "},
+ {" ( "},
+ {" INOUT COMMANDNAME VARCHAR(2560) CHARACTER SET ISO88591) "},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.help (java.lang.String[])' "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" READS SQL DATA "},
+ {" ; "}
+};
+
+static const QString seabaseProcLsDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".LS "},
+ {" ( "},
+ {" IN FILENAME VARCHAR(256) CHARACTER SET UTF8, "},
+ {" OUT FILENAMES VARCHAR(10240) CHARACTER SET ISO88591) "},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.ls(java.lang.String,java.lang.String[])' "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" READS SQL DATA "},
+ {" NO TRANSACTION REQUIRED "},
+ {" ; "}
+};
+
+static const QString seabaseProcLsallDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".LSALL "},
+ {" ( "},
+ {" OUT FILENAMES VARCHAR(10240) CHARACTER SET ISO88591) "},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.lsAll(java.lang.String[])' "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" READS SQL DATA "},
+ {" NO TRANSACTION REQUIRED "},
+ {" ; "}
+};
+
+static const QString seabaseProcPutDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".PUT "},
+ {" ( "},
+ {" IN FILEDATA VARCHAR(102400) CHARACTER SET ISO88591, "},
+ {" IN FILENAME VARCHAR(256) CHARACTER SET UTF8, "},
+ {" IN CREATEFLAG INTEGER, "},
+ {" IN FILEOVERWRITE INTEGER) "},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.put(java.lang.String,java.lang.String,int,int)' "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" READS SQL DATA "},
+ {" NO TRANSACTION REQUIRED "},
+ {" ; "}
+};
+
+static const QString seabaseProcRmDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".RM "},
+ {" ( "},
+ {" IN FILENAME VARCHAR(256) CHARACTER SET UTF8) "},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.rm(java.lang.String)' "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" READS SQL DATA "},
+ {" NO TRANSACTION REQUIRED "},
+ {" ; "}
+};
+
+static const QString seabaseProcRmrexDDL[] =
+{
+ {" CREATE PROCEDURE IF NOT EXISTS %s.\"%s\".RMREX "},
+ {" ( "},
+ {" IN FILENAME VARCHAR(256) CHARACTER SET UTF8, "},
+ {" OUT FILENAMES VARCHAR(10240) CHARACTER SET ISO88591) "},
+ {" EXTERNAL NAME 'org.trafodion.libmgmt.FileMgmt.rmRex(java.lang.String, java.lang.String[])' "},
+ {" EXTERNAL SECURITY DEFINER "},
+ {" LIBRARY %s.\"%s\".%s "},
+ {" LANGUAGE JAVA "},
+ {" PARAMETER STYLE JAVA "},
+ {" READS SQL DATA "},
+ {" NO TRANSACTION REQUIRED "},
+ {" ; "}
+};
+
+struct LibmgrRoutineInfo
+{
+ // name of the procedure
+ const char * newName;
+
+ // ddl stmt corresponding to the current ddl.
+ const QString *newDDL;
+ Lng32 sizeOfnewDDL;
+};
+
+static const LibmgrRoutineInfo allLibmgrRoutineInfo[] = {
+ {SYSTEM_PROC_ADDLIB,
+ seabaseProcAddlibDDL,
+ sizeof(seabaseProcAddlibDDL)
+ },
+
+ {SYSTEM_PROC_ALTERLIB,
+ seabaseProcAlterlibDDL,
+ sizeof(seabaseProcAlterlibDDL)
+ },
+
+ {SYSTEM_PROC_DROPLIB,
+ seabaseProcDroplibDDL,
+ sizeof(seabaseProcDroplibDDL)
+ },
+
+ {SYSTEM_PROC_GETFILE,
+ seabaseProcGetfileDDL,
+ sizeof(seabaseProcGetfileDDL)
+ },
+
+ {SYSTEM_PROC_HELP,
+ seabaseProcHelpDDL,
+ sizeof(seabaseProcHelpDDL)
+ },
+
+ {SYSTEM_PROC_LS,
+ seabaseProcLsDDL,
+ sizeof(seabaseProcLsDDL)
+ },
+
+ {SYSTEM_PROC_LSALL,
+ seabaseProcLsallDDL,
+ sizeof(seabaseProcLsallDDL)
+ },
+
+ {SYSTEM_PROC_PUT,
+ seabaseProcPutDDL,
+ sizeof(seabaseProcPutDDL)
+ },
+
+ {SYSTEM_PROC_RM,
+ seabaseProcRmDDL,
+ sizeof(seabaseProcRmDDL)
+ },
+
+ {SYSTEM_PROC_RMREX,
+ seabaseProcRmrexDDL,
+ sizeof(seabaseProcRmrexDDL)
+ }
+
+};
+
+#endif
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp b/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
index 34a8cf0..921369f 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
+++ b/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
@@ -61,6 +61,7 @@ static bool dropOneTable(
const char * schemaName,
const char * objectName,
bool isVolatile,
+ bool ifExists,
bool ddlXns);
static bool transferObjectPrivs(
@@ -499,6 +500,8 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode)
// select objects in the schema to drop, don't return PRIMARY_KEY_CONSTRAINTS,
// they always get removed when the parent table is dropped.
+ // Filter out the LOB depenedent tables too - they will get dropped when
+ //the main LOB table is dropped.
str_sprintf(query,"SELECT TRIM(object_name), TRIM(object_type) "
"FROM %s.\"%s\".%s "
"WHERE catalog_name = '%s' AND schema_name = '%s' AND "
@@ -548,12 +551,12 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode)
dirtiedMetadata = TRUE;
if (dropOneTable(cliInterface,(char*)catName.data(),
(char*)schName.data(),(char*)objName.data(),
- isVolatile, dropSchemaNode->ddlXns()))
+ isVolatile, FALSE,dropSchemaNode->ddlXns()))
someObjectsCouldNotBeDropped = true;
}
}
- // Drop libraries, procedures (SPJs), UDFs (functions), and views
+ // Drop procedures (SPJs), UDFs (functions), and views
objectsQueue->position();
for (int idx = 0; idx < objectsQueue->numEntries(); idx++)
{
@@ -576,14 +579,9 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode)
case COM_REFERENTIAL_CONSTRAINT_OBJECT:
case COM_SEQUENCE_GENERATOR_OBJECT:
case COM_UNIQUE_CONSTRAINT_OBJECT:
- {
- continue;
- }
case COM_LIBRARY_OBJECT:
{
- objectTypeString = "LIBRARY";
- cascade = "CASCADE";
- break;
+ continue;
}
// If the library where procedures and functions reside is dropped
@@ -634,30 +632,85 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode)
someObjectsCouldNotBeDropped = true;
}
- // Drop all tables in the schema. This will also drop any associated constraints.
-
+ // Drop libraries in the schema
objectsQueue->position();
for (int idx = 0; idx < objectsQueue->numEntries(); idx++)
{
- OutputInfo * vi = (OutputInfo*)objectsQueue->getNext();
+ OutputInfo * vi = (OutputInfo*)objectsQueue->getNext();
- NAString objName = vi->get(0);
+ char * objName = vi->get(0);
NAString objType = vi->get(1);
- // drop user objects first
- if (objType == COM_BASE_TABLE_OBJECT_LIT)
+ if (objType == COM_LIBRARY_OBJECT_LIT)
{
- // histogram tables have already been dropped
- if (!isHistogramTable(objName))
- {
- dirtiedMetadata = TRUE;
- if (dropOneTable(cliInterface,(char*)catName.data(),
- (char*)schName.data(),(char*)objName.data(),
- isVolatile, dropSchemaNode->ddlXns()))
- someObjectsCouldNotBeDropped = true;
- }
- }
- }
+ char buf [1000];
+
+ dirtiedMetadata = TRUE;
+ str_sprintf(buf, "DROP LIBRARY \"%s\".\"%s\".\"%s\" CASCADE",
+ (char*)catName.data(), (char*)schName.data(), objName);
+ cliRC = cliInterface.executeImmediate(buf);
+
+ if (cliRC < 0 && cliRC != -CAT_OBJECT_DOES_NOT_EXIST_IN_TRAFODION)
+ someObjectsCouldNotBeDropped = true;
+ }
+ }
+
+ // Drop all tables in the schema. This will also drop any associated constraints.
+
+ objectsQueue->position();
+ for (int idx = 0; idx < objectsQueue->numEntries(); idx++)
+ {
+ OutputInfo * vi = (OutputInfo*)objectsQueue->getNext();
+
+ NAString objName = vi->get(0);
+ NAString objType = vi->get(1);
+
+ // drop user objects first
+ if (objType == COM_BASE_TABLE_OBJECT_LIT)
+ {
+ // histogram tables have already been dropped
+ // Avoid any tables that match LOB dependent tablenames.
+ // (there is no special type for these tables)
+ if (!isHistogramTable(objName) && !isLOBDependentNameMatch(objName))
+ {
+ dirtiedMetadata = TRUE;
+ if (dropOneTable(cliInterface,(char*)catName.data(),
+ (char*)schName.data(),(char*)objName.data(),
+ isVolatile, FALSE,dropSchemaNode->ddlXns()))
+ someObjectsCouldNotBeDropped = true;
+ }
+ }
+ }
+
+ // If there are any user tables having the LOB dependent name pattern, they
+ // will still be around. Drop those. The real LOB dependent tables, would
+ //have been dropped in the previous step
+
+
+ objectsQueue->position();
+ for (int idx = 0; idx < objectsQueue->numEntries(); idx++)
+ {
+ OutputInfo * vi = (OutputInfo*)objectsQueue->getNext();
+
+ NAString objName = vi->get(0);
+ NAString objType = vi->get(1);
+
+ if (objType == COM_BASE_TABLE_OBJECT_LIT)
+ {
+ if (!isHistogramTable(objName) && isLOBDependentNameMatch(objName))
+ {
+ dirtiedMetadata = TRUE;
+ // Pass in TRUE for "ifExists" since the lobDependent tables
+ // would have already been dropped and we don't want those to
+ // raise errors. We just want to catch any user tables that
+ // happen to have the same name patterns.
+ if (dropOneTable(cliInterface,(char*)catName.data(),
+ (char*)schName.data(),(char*)objName.data(),
+ isVolatile,TRUE, dropSchemaNode->ddlXns()))
+ someObjectsCouldNotBeDropped = true;
+ }
+ }
+ }
// Drop any remaining indexes.
@@ -1151,6 +1204,7 @@ static bool dropOneTable(
const char * schemaName,
const char * objectName,
bool isVolatile,
+ bool ifExists,
bool ddlXns)
{
@@ -1160,17 +1214,23 @@ char buf [1000];
bool someObjectsCouldNotBeDropped = false;
char volatileString[20] = {0};
+ char ifExistsString[20] = {0};
Lng32 cliRC = 0;
+
+
if (isVolatile)
strcpy(volatileString,"VOLATILE");
+ if (ifExists)
+ strcpy(ifExistsString,"IF EXISTS");
+
if (ComIsTrafodionExternalSchemaName(schemaName))
str_sprintf(buf,"DROP EXTERNAL TABLE \"%s\" FOR \"%s\".\"%s\".\"%s\" CASCADE",
objectName,catalogName,schemaName,objectName);
else
- str_sprintf(buf,"DROP %s TABLE \"%s\".\"%s\".\"%s\" CASCADE",
- volatileString,catalogName,schemaName,objectName);
+ str_sprintf(buf,"DROP %s %s TABLE \"%s\".\"%s\".\"%s\" CASCADE",
+ volatileString, ifExistsString, catalogName,schemaName,objectName);
ULng32 savedParserFlags = Get_SqlParser_Flags(0xFFFFFFFF);