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);
