// ***************************************************************************** // * * // * Function: dropOneTable * // * * // * Drops a table and all its dependent objects. * // * * // ***************************************************************************** // * * // * Parameters: * // * * // * <cliInterface> ExeCliInterface & In * // * is a reference to an Executor CLI interface handle. * // * * // * <catalogName> const char * In * // * is the catalog of the table to drop. * // * * // * <schemaName> const char * In * // * is the schema of the table to drop. * // * * // * <objectName> const char * In * // * is the name of the table to drop. * // * * // * <isVolatile> bool In * // * is true if the object is volatile or part of a volatile schema. * // * * // ***************************************************************************** // * * // * Returns: bool * // * * // * true: Could not drop table or one of its dependent objects. * // * false: Drop successful or could not set CQD for NATable cache reload. * // * * // ***************************************************************************** static bool dropOneTable( ExeCliInterface & cliInterface, const char * catalogName, const char * schemaName, const char * objectName, bool isVolatile) { char buf [1000]; bool someObjectsCouldNotBeDropped = false; char volatileString[20] = {0}; Lng32 cliRC = 0; if (isVolatile) strcpy(volatileString,"VOLATILE"); 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); ULng32 savedParserFlags = Get_SqlParser_Flags(0xFFFFFFFF); try { Set_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL); cliRC = cliInterface.executeImmediate(buf); } catch (...) { // Restore parser flags settings to what they originally were Assign_SqlParser_Flags(savedParserFlags); throw; } // Restore parser flags settings to what they originally were Set_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL); if (cliRC < 0 && cliRC != -CAT_OBJECT_DOES_NOT_EXIST_IN_TRAFODION) someObjectsCouldNotBeDropped = true; // remove NATable entry for this table CorrName cn(objectName,STMTHEAP,schemaName,catalogName); ActiveSchemaDB()->getNATableDB()->removeNATable(cn, NATableDB::REMOVE_FROM_ALL_USERS, COM_BASE_TABLE_OBJECT); return someObjectsCouldNotBeDropped; }
// ***************************************************************************** // * * // * Function: PrivMgrMDTable::CLIFetch * // * * // * This method calls the CLI to fetch a row from a table. * // * * // ***************************************************************************** // * * // * Parameters: * // * * // * <cliInterface> ExeCliInterface & In * // * is the handle to the CLI interface. * // * * // * <SQLStatement> const std::string & In * // * is the SQL statement to be executed. Note, it can be any SQL * // * statement, but unless data is being fetch the simpler CLIImmediate * // * can be used instead. * // * * // ***************************************************************************** // * * // * Returns: PrivStatus * // * * // * STATUS_GOOD, * // * STATUS_WARNING: Row read successfully. * // * STATUS_NOTFOUND: Statement executed successfully, but there were no rows. * // * *: Read failed. A CLI error is put into the diags area. * // * * // ***************************************************************************** PrivStatus PrivMgrMDTable::CLIFetch( ExeCliInterface & cliInterface, const std::string & SQLStatement) { // set pointer in diags area int32_t diagsMark = pDiags_->mark(); int32_t cliRC = cliInterface.fetchRowsPrologue(SQLStatement.c_str(),true/*no exec*/); if (cliRC < 0) { cliInterface.retrieveSQLDiagnostics(pDiags_); return STATUS_ERROR; } cliRC = cliInterface.clearExecFetchClose(NULL, 0); if (cliRC < 0) { cliInterface.retrieveSQLDiagnostics(pDiags_); return STATUS_ERROR; } if (cliRC == 100) // did not find any rows { pDiags_->rewind(diagsMark); return STATUS_NOTFOUND; } if (cliRC > 0) return STATUS_WARNING; return STATUS_GOOD; }
// ***************************************************************************** // * * // * Function: CmpSeabaseDDL::addSchemaObject * // * * // * Inserts a schema object row into the OBJECTS table. * // * * // ***************************************************************************** // * * // * Parameters: * // * * // * <cliInterface> ExeCliInterface & In * // * is a reference to an Executor CLI interface handle. * // * * // * <schemaName> const ComSchemaName & In * // * is a reference to a ComSchemaName instance. The catalog name must be * // * set. * // * * // * <schemaClass> ComSchemaClass In * // * is the class (private or shared) of the schema to be added. * // * * // * <ownerID> Int32 In * // * is the authorization ID that will own the schema. * // * * // * <ignoreIfExists> NABoolean In * // * do not return an error is schema already exists * // ***************************************************************************** // * * // * Returns: PrivStatus * // * * // * 0: Schema as added * // * -1: Schema was not added. A CLI error is put into the diags area. * // * * // ***************************************************************************** int CmpSeabaseDDL::addSchemaObject( ExeCliInterface & cliInterface, const ComSchemaName & schemaName, ComSchemaClass schemaClass, Int32 ownerID, NABoolean ignoreIfExists) { NAString catalogName = schemaName.getCatalogNamePartAsAnsiString(); ComAnsiNamePart schemaNameAsComAnsi = schemaName.getSchemaNamePart(); NAString schemaNamePart = schemaNameAsComAnsi.getInternalName(); ComObjectName objName(catalogName,schemaNamePart,NAString(SEABASE_SCHEMA_OBJECTNAME), COM_TABLE_NAME,TRUE); if (isSeabaseReservedSchema(objName) && !Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL)) { *CmpCommon::diags() << DgSqlCode(-CAT_RESERVED_METADATA_SCHEMA_NAME) << DgSchemaName(schemaName.getExternalName().data()); return -1; } NAString objectNamePart = objName.getObjectNamePartAsAnsiString(TRUE); Lng32 retcode = existsInSeabaseMDTable(&cliInterface,catalogName,schemaNamePart, objectNamePart, COM_UNKNOWN_OBJECT, FALSE); if (retcode < 0) return -1; if (retcode == 1 ) // already exists { if (ignoreIfExists) return 0; else *CmpCommon::diags() << DgSqlCode(-CAT_SCHEMA_ALREADY_EXISTS) << DgSchemaName(schemaName.getExternalName().data()); return -1; } char buf[4000]; ComUID schemaUID; schemaUID.make_UID(); Int64 schemaObjectUID = schemaUID.get_value(); Int64 createTime = NA_JulianTimestamp(); NAString quotedSchName; NAString quotedObjName; ToQuotedString(quotedSchName,schemaNamePart,FALSE); ToQuotedString(quotedObjName,NAString(SEABASE_SCHEMA_OBJECTNAME),FALSE); char schemaObjectLit[3] = {0}; switch (schemaClass) { case COM_SCHEMA_CLASS_PRIVATE: { strncpy(schemaObjectLit,COM_PRIVATE_SCHEMA_OBJECT_LIT,2); break; } case COM_SCHEMA_CLASS_SHARED: { strncpy(schemaObjectLit,COM_SHARED_SCHEMA_OBJECT_LIT,2); break; } case COM_SCHEMA_CLASS_DEFAULT: default: { // Schemas are private by default, but could choose a different // default class here based on CQD or other attribute. strncpy(schemaObjectLit,COM_PRIVATE_SCHEMA_OBJECT_LIT,2); break; } } str_sprintf(buf, "insert into %s.\"%s\".%s values ('%s', '%s', '%s', '%s', %Ld, %Ld, %Ld, '%s', '%s', %d, %d, 0)", getSystemCatalog(),SEABASE_MD_SCHEMA,SEABASE_OBJECTS, catalogName.data(), quotedSchName.data(), quotedObjName.data(), schemaObjectLit, schemaObjectUID, createTime, createTime, COM_YES_LIT, // valid_def COM_NO_LIT, // droppable ownerID,ownerID); Int32 cliRC = cliInterface.executeImmediate(buf); if (cliRC < 0) { cliInterface.retrieveSQLDiagnostics(CmpCommon::diags()); return -1; } return 0; }