Repository: trafodion Updated Branches: refs/heads/master 5fa28f37b -> a5b67c9e9
http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/regress/seabase/EXPECTED022 ---------------------------------------------------------------------- diff --git a/core/sql/regress/seabase/EXPECTED022 b/core/sql/regress/seabase/EXPECTED022 index b1efc0f..bbdb252 100644 --- a/core/sql/regress/seabase/EXPECTED022 +++ b/core/sql/regress/seabase/EXPECTED022 @@ -8,6 +8,8 @@ >> >>drop hbase table T022HBT1; +*** WARNING[1004] Object T022HBT1 does not exist or object type is invalid for the current operation. + --- SQL operation complete. >>create hbase table T022HBT1 (column family 'cf'); @@ -15,6 +17,8 @@ >> >>drop hbase table T022HBT2; +*** WARNING[1004] Object T022HBT2 does not exist or object type is invalid for the current operation. + --- SQL operation complete. >>create hbase table T022HBT2 (column family 'cf'); @@ -406,7 +410,7 @@ ROW_ID (EXPR) >>insert into hbase."_ROW_".t022hbt1 values ('2', column_create(':b', '201')); -*** ERROR[1426] An invalid HBase column name :b was specified. A valid name must be of the format: <ColumnFamily>:<ColumnName> +*** ERROR[1426] An invalid HBase column name :b was specified. A valid name must be of the format: <ColumnFamily>:<ColumnName> --- 0 row(s) inserted. >>insert into hbase."_ROW_".t022hbt1 values ('2', '100'); @@ -426,7 +430,7 @@ ROW_ID (EXPR) >>invoke hbase."_CELL_".t022hbt2; -- Definition of Trafodion table HBASE."_CELL_".T022HBT2 --- Definition current Mon May 15 01:28:23 2017 +-- Definition current Wed May 9 21:08:44 2018 ( ROW_ID VARCHAR(100) CHARACTER SET ISO88591 @@ -445,7 +449,7 @@ ROW_ID (EXPR) >>invoke hbase."_ROW_".t022hbt2; -- Definition of Trafodion table HBASE."_ROW_".T022HBT2 --- Definition current Mon May 15 01:28:24 2017 +-- Definition current Wed May 9 21:08:44 2018 ( ROW_ID VARCHAR(100) CHARACTER SET ISO88591 @@ -465,7 +469,7 @@ ROW_ID (EXPR) >>invoke hbase."_CELL_".t022hbt2; -- Definition of Trafodion table HBASE."_CELL_".T022HBT2 --- Definition current Mon May 15 01:28:24 2017 +-- Definition current Wed May 9 21:08:45 2018 ( ROW_ID VARCHAR(100) CHARACTER SET ISO88591 @@ -484,7 +488,7 @@ ROW_ID (EXPR) >>invoke hbase."_ROW_".t022hbt2; -- Definition of Trafodion table HBASE."_ROW_".T022HBT2 --- Definition current Mon May 15 01:28:25 2017 +-- Definition current Wed May 9 21:08:45 2018 ( ROW_ID VARCHAR(100) CHARACTER SET ISO88591 @@ -576,6 +580,8 @@ ROW_ID (EXPR) >> >>drop hbase table t022hbm1; +*** WARNING[1004] Object T022HBM1 does not exist or object type is invalid for the current operation. + --- SQL operation complete. >>create hbase table t022hbm1 (column family 'cf'); @@ -603,7 +609,7 @@ ROW_ID (EXPR) >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:28:41 2017 +-- Definition current Wed May 9 21:09:03 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -619,7 +625,7 @@ ROW_ID (EXPR) >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:28:41 2017 +-- Definition current Wed May 9 21:09:04 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -636,7 +642,7 @@ ROW_ID (EXPR) >>invoke t022hbm1; -- Definition of Trafodion table TRAFODION.SCH.T022HBM1 --- Definition current Mon May 15 01:28:44 2017 +-- Definition current Wed May 9 21:09:09 2018 ( SYSKEY LARGEINT NO DEFAULT NOT NULL NOT DROPPABLE @@ -667,7 +673,7 @@ LC RC OP OPERATOR OPT DESCRIPTION CARD >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:28:50 2017 +-- Definition current Wed May 9 21:09:18 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -727,7 +733,7 @@ a2 ? >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:28:55 2017 +-- Definition current Wed May 9 21:09:27 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -750,7 +756,7 @@ a2 ? >>invoke t022hbm1_like; -- Definition of Trafodion table TRAFODION.SCH.T022HBM1_LIKE --- Definition current Mon May 15 01:29:01 2017 +-- Definition current Wed May 9 21:09:36 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -812,7 +818,7 @@ a2 ? ? >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:29:22 2017 +-- Definition current Wed May 9 21:10:05 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -829,7 +835,7 @@ a2 ? ? >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:29:25 2017 +-- Definition current Wed May 9 21:10:14 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -845,7 +851,7 @@ a2 ? ? >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:29:28 2017 +-- Definition current Wed May 9 21:10:18 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -908,7 +914,7 @@ a2 ? ? >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:29:41 2017 +-- Definition current Wed May 9 21:10:29 2018 ( "cf".A INT NO DEFAULT NOT NULL NOT DROPPABLE @@ -968,7 +974,7 @@ A B C >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:29:47 2017 +-- Definition current Wed May 9 21:10:40 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -991,7 +997,7 @@ A B C >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:29:52 2017 +-- Definition current Wed May 9 21:10:50 2018 ( "cf".A CHAR(4) CHARACTER SET ISO88591 COLLATE @@ -1013,7 +1019,7 @@ A B C >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:29:56 2017 +-- Definition current Wed May 9 21:10:56 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -1035,7 +1041,7 @@ A B C >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:30:01 2017 +-- Definition current Wed May 9 21:11:02 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -1058,7 +1064,7 @@ A B C >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:30:06 2017 +-- Definition current Wed May 9 21:11:08 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -1082,7 +1088,7 @@ A B C >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:30:11 2017 +-- Definition current Wed May 9 21:11:14 2018 ( "cf".A CHAR(4) CHARACTER SET ISO88591 COLLATE @@ -1105,7 +1111,7 @@ A B C >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:30:15 2017 +-- Definition current Wed May 9 21:11:20 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -1157,7 +1163,7 @@ A B C >>invoke t022hbm2; -- Definition of Trafodion HBase mapped table T022HBM2 --- Definition current Mon May 15 01:30:31 2017 +-- Definition current Wed May 9 21:12:10 2018 ( "cf1".A INT DEFAULT NULL @@ -1203,7 +1209,7 @@ A B Z >>invoke t022hbm2; -- Definition of Trafodion HBase mapped table T022HBM2 --- Definition current Mon May 15 01:30:52 2017 +-- Definition current Wed May 9 21:12:38 2018 ( "cf1".A INT DEFAULT NULL @@ -1245,9 +1251,21 @@ CREATE TABLE HBASE."_CELL_".T022HBM2 /* HBase DDL */ CREATE HBASE TABLE T022HBM2 ( COLUMN FAMILY '#1') +REGISTER /*INTERNAL*/ HBASE TABLE T022HBM2; +/* ObjectUID = 6815232663752156408 */ + --- SQL operation complete. >>get hbase registered tables in catalog trafodion, match '%T022HBM2%'; +HBase Registered Tables in Catalog TRAFODION +============================================ + +"_CELL_".T022HBM2 +"_ROW_".T022HBM2 + +--- SQL operation complete. +>>unregister hbase table t022hbm2; + --- SQL operation complete. >>register hbase table t022hbm2; @@ -1284,7 +1302,7 @@ CREATE TABLE HBASE."_CELL_".T022HBM2 CREATE HBASE TABLE T022HBM2 ( COLUMN FAMILY '#1') REGISTER HBASE TABLE T022HBM2; -/* ObjectUID = 8642537124144485947 */ +/* ObjectUID = 6733604920502068557 */ --- SQL operation complete. >>showddl hbase."_ROW_".t022hbm2; @@ -1305,7 +1323,7 @@ CREATE TABLE HBASE."_ROW_".T022HBM2 CREATE HBASE TABLE T022HBM2 ( COLUMN FAMILY '#1') REGISTER HBASE TABLE T022HBM2; -/* ObjectUID = 8642537124144485957 */ +/* ObjectUID = 6733604920502068566 */ --- SQL operation complete. >>unregister hbase table t022hbm2; @@ -1345,15 +1363,15 @@ CREATE HBASE TABLE T022HBM2 ( COLUMN FAMILY '#1') >>showstats for table hbase."_CELL_".t022hbm2 on every column; Histogram data for Table HBASE."_CELL_".T022HBM2 -Table ID: 8849702707055529909 +Table ID: 7262214926783681707 Hist ID # Ints Rowcount UEC Colname(s) ========== ====== =========== =========== =========================== -2003317081 1 2 1 ROW_ID -2003317076 2 2 2 COL_FAMILY -2003317071 2 2 2 COL_NAME -2003317066 1 2 1 COL_TIMESTAMP -2003317061 2 2 2 COL_VALUE +1401377310 1 2 1 ROW_ID +1401377305 2 2 2 COL_FAMILY +1401377300 2 2 2 COL_NAME +1401377295 1 2 1 COL_TIMESTAMP +1401377290 2 2 2 COL_VALUE --- SQL operation complete. @@ -1387,6 +1405,9 @@ CREATE TABLE HBASE."_CELL_".T022HBM2 /* HBase DDL */ CREATE HBASE TABLE T022HBM2 ( COLUMN FAMILY '#1') +REGISTER /*INTERNAL*/ HBASE TABLE T022HBM2; +/* ObjectUID = 7262214926783681707 */ + --- SQL operation complete. >> >>showstats for table hbase."_ROW_".t022hbm2 on every column; @@ -1407,15 +1428,15 @@ No Histograms exist for the requested columns or groups >>showstats for table hbase."_CELL_".t022hbm2 on every column; Histogram data for Table HBASE."_CELL_".T022HBM2 -Table ID: 8849702707055529909 +Table ID: 7262214926783681707 Hist ID # Ints Rowcount UEC Colname(s) ========== ====== =========== =========== =========================== -2003317080 1 2 1 ROW_ID -2003317077 2 2 2 COL_FAMILY -2003317070 2 2 2 COL_NAME -2003317067 1 2 1 COL_TIMESTAMP -2003317060 2 2 2 COL_VALUE +1401377311 1 2 1 ROW_ID +1401377304 2 2 2 COL_FAMILY +1401377301 2 2 2 COL_NAME +1401377294 1 2 1 COL_TIMESTAMP +1401377291 2 2 2 COL_VALUE --- SQL operation complete. @@ -1449,12 +1470,15 @@ CREATE TABLE HBASE."_CELL_".T022HBM2 /* HBase DDL */ CREATE HBASE TABLE T022HBM2 ( COLUMN FAMILY '#1') +REGISTER /*INTERNAL*/ HBASE TABLE T022HBM2; +/* ObjectUID = 7262214926783681707 */ + --- SQL operation complete. >> >>showstats for table hbase."_MAP_".t022hbm2 on every column; Histogram data for Table HBASE."_MAP_".T022HBM2 -Table ID: 8642537124144485432 +Table ID: 6733604920502066913 Hist ID # Ints Rowcount UEC Colname(s) ========== ====== =========== =========== =========================== @@ -1469,13 +1493,13 @@ No Histograms exist for the requested columns or groups >>showstats for table hbase."_MAP_".t022hbm2 on every column; Histogram data for Table HBASE."_MAP_".T022HBM2 -Table ID: 8642537124144485432 +Table ID: 6733604920502066913 Hist ID # Ints Rowcount UEC Colname(s) ========== ====== =========== =========== =========================== -2023711938 1 1 1 A -2023711933 1 1 1 B -2023711928 1 1 1 Z +1428445837 1 1 1 A +1428445832 1 1 1 B +1428445827 1 1 1 Z --- SQL operation complete. @@ -1515,7 +1539,7 @@ a1 10 >>invoke t022hbm1; -- Definition of Trafodion HBase mapped table T022HBM1 --- Definition current Mon May 15 01:31:41 2017 +-- Definition current Wed May 9 21:13:46 2018 ( "cf".A VARCHAR(4) CHARACTER SET ISO88591 COLLATE @@ -1688,6 +1712,12 @@ a1 10 >>create hbase table t022hbm1 (column family 'cf'); --- SQL operation complete. +>>create external table t022hbm1 (a varchar(4) not null, b int) ++> primary key (a) ++> attribute default column family 'cf' ++> map to hbase table t022hbm1; + +--- SQL operation complete. >>insert into hbase."_ROW_".t022hbm1 values ('a1234567', +> column_create(('cf:B', '10'))); @@ -1705,6 +1735,12 @@ a1 10 >>create hbase table t022hbm1 (column family 'cf'); --- SQL operation complete. +>>create external table t022hbm1 (a varchar(4) not null, b int) ++> primary key (a) ++> attribute default column family 'cf' ++> map to hbase table t022hbm1; + +--- SQL operation complete. >>insert into hbase."_ROW_".t022hbm1 values ('a1', +> column_create(('cf:B', '1000000'))); http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/regress/seabase/EXPECTED026 ---------------------------------------------------------------------- diff --git a/core/sql/regress/seabase/EXPECTED026 b/core/sql/regress/seabase/EXPECTED026 index fb16c30..744bc4f 100644 --- a/core/sql/regress/seabase/EXPECTED026 +++ b/core/sql/regress/seabase/EXPECTED026 @@ -307,9 +307,8 @@ Metadata Cleanup: done --- SQL operation complete. ->>drop hbase table "TRAFODION.SCH026.T026T10"; - ---- SQL operation complete. +>>-- drop hbase table "TRAFODION.SCH026.T026T10" from hbase shell +>>sh regrhbase.ksh $REGRTSTDIR/TEST026_drop_hbase &> $REGRRUNDIR/TEST026_drop_hbase.log ; >>set parserflags 131072; --- SQL operation complete. @@ -358,14 +357,14 @@ Metadata Cleanup: started, check only Start: Cleanup Inconsistent Objects Entries Entry #1(OBJECT): TRAFODION.SCH026.T026T12 - Entry #2(OBJECT): TRAFODION.SCH026.T026T20_438564838_6459 - Entry #3(OBJECT): TRAFODION.SCH026.T026T2_442664838_6459 + Entry #2(OBJECT): TRAFODION.SCH026.T026T20_623875359_1692 + Entry #3(OBJECT): TRAFODION.SCH026.T026T2_736875359_1692 Entry #4(OBJECT): TRAFODION.SCH026.SB_HISTOGRAMS_PK Entry #5(OBJECT): TRAFODION.SCH026.SB_HISTOGRAM_INTERVALS_PK Entry #6(OBJECT): TRAFODION.SCH026.SB_PERSISTENT_SAMPLES_PK - Entry #7(OBJECT): TRAFODION.SCH026.LOBMD__0210724475547_466795482_9143 - Entry #8(OBJECT): TRAFODION.SCH026.LOBDescChunks__02107_334895482_9143 - Entry #9(UID): 2107244755479165497 + Entry #7(OBJECT): TRAFODION.SCH026.LOBMD__0550637332294_683639881_4496 + Entry #8(OBJECT): TRAFODION.SCH026.LOBDescChunks__05506_433739881_4496 + Entry #9(UID): 5506373322942721563 End: Cleanup Inconsistent Objects Entries (9 entries found) Start: Cleanup Inconsistent Views Entries @@ -391,14 +390,14 @@ Metadata Cleanup: started Start: Cleanup Inconsistent Objects Entries Entry #1(OBJECT): TRAFODION.SCH026.T026T12 - Entry #2(OBJECT): TRAFODION.SCH026.T026T20_438564838_6459 - Entry #3(OBJECT): TRAFODION.SCH026.T026T2_442664838_6459 + Entry #2(OBJECT): TRAFODION.SCH026.T026T20_623875359_1692 + Entry #3(OBJECT): TRAFODION.SCH026.T026T2_736875359_1692 Entry #4(OBJECT): TRAFODION.SCH026.SB_HISTOGRAMS_PK Entry #5(OBJECT): TRAFODION.SCH026.SB_HISTOGRAM_INTERVALS_PK Entry #6(OBJECT): TRAFODION.SCH026.SB_PERSISTENT_SAMPLES_PK - Entry #7(OBJECT): TRAFODION.SCH026.LOBMD__0210724475547_466795482_9143 - Entry #8(OBJECT): TRAFODION.SCH026.LOBDescChunks__02107_334895482_9143 - Entry #9(UID): 2107244755479165497 + Entry #7(OBJECT): TRAFODION.SCH026.LOBMD__0550637332294_683639881_4496 + Entry #8(OBJECT): TRAFODION.SCH026.LOBDescChunks__05506_433739881_4496 + Entry #9(UID): 5506373322942721563 End: Cleanup Inconsistent Objects Entries (9 entries cleaned up) Start: Cleanup Inconsistent Views Entries http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/regress/seabase/TEST022 ---------------------------------------------------------------------- diff --git a/core/sql/regress/seabase/TEST022 b/core/sql/regress/seabase/TEST022 index 39da1c7..f68224d 100644 --- a/core/sql/regress/seabase/TEST022 +++ b/core/sql/regress/seabase/TEST022 @@ -386,6 +386,7 @@ select * from t022hbm2; showddl hbase."_CELL_".t022hbm2; get hbase registered tables in catalog trafodion, match '%T022HBM2%'; +unregister hbase table t022hbm2; register hbase table t022hbm2; get hbase registered tables in catalog trafodion, match '%T022HBM2%'; showddl hbase."_CELL_".t022hbm2; @@ -493,6 +494,10 @@ select * from t022hbm1; drop hbase table t022hbm1; create hbase table t022hbm1 (column family 'cf'); +create external table t022hbm1 (a varchar(4) not null, b int) + primary key (a) + attribute default column family 'cf' + map to hbase table t022hbm1; insert into hbase."_ROW_".t022hbm1 values ('a1234567', column_create(('cf:B', '10'))); -- primary key col length must be big enough to hold rowID @@ -500,6 +505,10 @@ select * from t022hbm1; drop hbase table t022hbm1; create hbase table t022hbm1 (column family 'cf'); +create external table t022hbm1 (a varchar(4) not null, b int) + primary key (a) + attribute default column family 'cf' + map to hbase table t022hbm1; insert into hbase."_ROW_".t022hbm1 values ('a1', column_create(('cf:B', '1000000'))); -- buffer to retrieve column value must be big enough @@ -519,4 +528,5 @@ drop table t022hbm1_like; drop table t022hbm1_ctas; drop table t022t1; drop table t022hbm1 cascade; +drop table t022hbm2; http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/regress/seabase/TEST026 ---------------------------------------------------------------------- diff --git a/core/sql/regress/seabase/TEST026 b/core/sql/regress/seabase/TEST026 index fcc27f8..b16ba51 100644 --- a/core/sql/regress/seabase/TEST026 +++ b/core/sql/regress/seabase/TEST026 @@ -125,7 +125,8 @@ create table t026t10(a int); create table t026t11(a int); create table t026t12(a int); cleanup metadata, check; -drop hbase table "TRAFODION.SCH026.T026T10"; +-- drop hbase table "TRAFODION.SCH026.T026T10" from hbase shell +sh regrhbase.ksh $REGRTSTDIR/TEST026_drop_hbase &> $REGRRUNDIR/TEST026_drop_hbase.log ; set parserflags 131072; delete from "_MD_".objects where schema_name = 'SCH026' and object_name = 'T026T11'; set parserflags 1; http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/regress/seabase/TEST026_drop_hbase ---------------------------------------------------------------------- diff --git a/core/sql/regress/seabase/TEST026_drop_hbase b/core/sql/regress/seabase/TEST026_drop_hbase new file mode 100644 index 0000000..3586da0 --- /dev/null +++ b/core/sql/regress/seabase/TEST026_drop_hbase @@ -0,0 +1,26 @@ +####################################################################### +# @@@ 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 @@@ +####################################################################### +disable 'TRAFODION.SCH026.T026T10' +drop 'TRAFODION.SCH026.T026T10' +exit + http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/CmpDDLCatErrorCodes.h ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/CmpDDLCatErrorCodes.h b/core/sql/sqlcomp/CmpDDLCatErrorCodes.h index b58189e..3c22d90 100644 --- a/core/sql/sqlcomp/CmpDDLCatErrorCodes.h +++ b/core/sql/sqlcomp/CmpDDLCatErrorCodes.h @@ -58,7 +58,7 @@ enum CatErrorCode { CAT_FIRST_ERROR = 1000 // unused = 1023 // unused = 1024 , CAT_DEPENDENT_OBJECTS_EXIST = 1025 - // unused = 1026 + , CAT_REG_UNREG_OBJECTS = 1026 , CAT_COLUMN_PRIVILEGE_NOT_ALLOWED = 1027 , CAT_SCHEMA_IS_NOT_EMPTY = 1028 , CAT_UNABLE_TO_CREATE_OBJECT = 1029 http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/CmpDescribe.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/CmpDescribe.cpp b/core/sql/sqlcomp/CmpDescribe.cpp index 7eaf0d6..97f2014 100644 --- a/core/sql/sqlcomp/CmpDescribe.cpp +++ b/core/sql/sqlcomp/CmpDescribe.cpp @@ -3007,6 +3007,16 @@ short CmpDescribeSeabaseTable ( { if (type != 3) { + // For native HBase tables that have no objectUID, we can't check + // user privileges so only allow operation for privileged users + if (isHbaseCellOrRowTable && + !ComUser::isRootUserID() && !ComUser::currentUserHasRole(HBASE_ROLE_ID) && + naTable->objectUid().get_value() == 0) + { + *CmpCommon::diags() << DgSqlCode(-CAT_UNABLE_TO_RETRIEVE_PRIVS); + return -1; + } + PrivMgrUserPrivs privs; PrivMgrUserPrivs *pPrivInfo = NULL; @@ -3028,7 +3038,7 @@ short CmpDescribeSeabaseTable ( *CmpCommon::diags() << DgSqlCode(-CAT_UNABLE_TO_RETRIEVE_PRIVS); return -1; } - + PrivStatus retcode = privInterface.getPrivileges((int64_t)naTable->objectUid().get_value(), naTable->getObjectType(), ComUser::getCurrentUser(), @@ -3047,11 +3057,15 @@ short CmpDescribeSeabaseTable ( else pPrivInfo = naTable->getPrivInfo(); - - if (!CmpDescribeIsAuthorized(SQLOperation::UNKNOWN, - pPrivInfo, - COM_BASE_TABLE_OBJECT)) - return -1; + // Allow object owners to perform showddl operation + if ((naTable->getOwner() != ComUser::getCurrentUser()) && + !ComUser::currentUserHasRole(naTable->getOwner())) + { + if (!CmpDescribeIsAuthorized(SQLOperation::UNKNOWN, + pPrivInfo, + COM_BASE_TABLE_OBJECT)) + return -1; + } } } http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/CmpSeabaseDDL.h ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/CmpSeabaseDDL.h b/core/sql/sqlcomp/CmpSeabaseDDL.h index c6ff74b..a08a345 100644 --- a/core/sql/sqlcomp/CmpSeabaseDDL.h +++ b/core/sql/sqlcomp/CmpSeabaseDDL.h @@ -1406,12 +1406,14 @@ protected: void createNativeHbaseTable( - StmtDDLCreateHbaseTable * createTableNode, - NAString &currCatName, NAString &currSchName); + ExeCliInterface *cliInterface, + StmtDDLCreateHbaseTable * createTableNode, + NAString &currCatName, NAString &currSchName); void dropNativeHbaseTable( - StmtDDLDropHbaseTable * createTableNode, - NAString &currCatName, NAString &currSchName); + ExeCliInterface *cliInterface, + StmtDDLDropHbaseTable * dropTableNode, + NAString &currCatName, NAString &currSchName); void initSeabaseMD(NABoolean ddlXns, NABoolean minimal); void dropSeabaseMD(NABoolean ddlXns); http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp b/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp index 314486e..b97feba 100644 --- a/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp +++ b/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp @@ -9138,7 +9138,7 @@ short CmpSeabaseDDL::executeSeabaseDDL(DDLExpr * ddlExpr, ExprNode * ddlNode, StmtDDLCreateHbaseTable * createTableParseNode = ddlNode->castToStmtDDLNode()->castToStmtDDLCreateHbaseTable(); - createNativeHbaseTable(createTableParseNode, currCatName, currSchName); + createNativeHbaseTable(&cliInterface, createTableParseNode, currCatName, currSchName); } else if (ddlNode->getOperatorType() == DDL_DROP_TABLE) { @@ -9154,7 +9154,7 @@ short CmpSeabaseDDL::executeSeabaseDDL(DDLExpr * ddlExpr, ExprNode * ddlNode, StmtDDLDropHbaseTable * dropTableParseNode = ddlNode->castToStmtDDLNode()->castToStmtDDLDropHbaseTable(); - dropNativeHbaseTable(dropTableParseNode, currCatName, currSchName); + dropNativeHbaseTable(&cliInterface, dropTableParseNode, currCatName, currSchName); } else if (ddlNode->getOperatorType() == DDL_CREATE_INDEX) { http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/CmpSeabaseDDLtable.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/CmpSeabaseDDLtable.cpp b/core/sql/sqlcomp/CmpSeabaseDDLtable.cpp index a2eb2a4..46c92b3 100644 --- a/core/sql/sqlcomp/CmpSeabaseDDLtable.cpp +++ b/core/sql/sqlcomp/CmpSeabaseDDLtable.cpp @@ -9915,6 +9915,20 @@ void CmpSeabaseDDL::seabaseGrantRevoke( std::string objectName (extTableName.data()); + // Map hbase map table to external name + if (ComIsHBaseMappedIntFormat(catalogNamePart, schemaNamePart)) + { + NAString newCatName; + NAString newSchName; + ComConvertHBaseMappedIntToExt(catalogNamePart, schemaNamePart, + newCatName, newSchName); + objectName = newCatName.data() + std::string(".\""); + objectName += newSchName.data() + std::string("\"."); + objectName += tableName.getObjectNamePart().getExternalName(); + } + else + objectName = extTableName.data(); + // For now, only support one grantee per request // TBD: support multiple grantees - a testing effort? if (pGranteeArray.entries() > 1) @@ -10221,12 +10235,24 @@ void CmpSeabaseDDL::hbaseGrantRevoke( } void CmpSeabaseDDL::createNativeHbaseTable( + ExeCliInterface *cliInterface, StmtDDLCreateHbaseTable * createTableNode, NAString &currCatName, NAString &currSchName) { Lng32 retcode = 0; Lng32 cliRC = 0; + // Verify that user has privilege to create HBase tables - must be DB__ROOT + // or granted the DB__HBASEROLE + if (isAuthorizationEnabled() && + !ComUser::isRootUserID() && + !ComUser::currentUserHasRole(HBASE_ROLE_ID)) + { + *CmpCommon::diags() << DgSqlCode (-CAT_NOT_AUTHORIZED); + processReturn(); + return; + } + ComObjectName tableName(createTableNode->getTableName()); const NAString catalogNamePart = tableName.getCatalogNamePartAsAnsiString(); const NAString schemaNamePart = tableName.getSchemaNamePartAsAnsiString(TRUE); @@ -10239,6 +10265,17 @@ void CmpSeabaseDDL::createNativeHbaseTable( return; } + // If table already exists, return + retcode = existsInHbase(objectNamePart, ehi); + if (retcode) + { + *CmpCommon::diags() << DgSqlCode(CAT_TABLE_ALREADY_EXISTS) + << DgTableName(objectNamePart.data()); + deallocEHI(ehi); + processReturn(); + return; + } + std::vector<NAString> colFamVec; for (Lng32 i = 0; i < createTableNode->csl()->entries(); i++) { @@ -10273,23 +10310,44 @@ void CmpSeabaseDDL::createNativeHbaseTable( return; } + // Register the table + char query[(ComMAX_ANSI_IDENTIFIER_EXTERNAL_LEN) + 100]; + snprintf(query, sizeof(query), + "register internal hbase table if not exists \"%s\"", + objectNamePart.data()); + cliRC = cliInterface->executeImmediate(query); + if (cliRC < 0) + { + cliInterface->retrieveSQLDiagnostics(CmpCommon::diags()); + return; + } + } void CmpSeabaseDDL::dropNativeHbaseTable( + ExeCliInterface *cliInterface, StmtDDLDropHbaseTable * dropTableNode, NAString &currCatName, NAString &currSchName) { Lng32 retcode = 0; Lng32 cliRC = 0; + // Verify that user has privilege to drop HBase tables - must be DB__ROOT + // or granted the DB__HBASEROLE + if (isAuthorizationEnabled() && + !ComUser::isRootUserID() && + !ComUser::currentUserHasRole(HBASE_ROLE_ID)) + { + *CmpCommon::diags() << DgSqlCode (-CAT_NOT_AUTHORIZED); + processReturn(); + return; + } + ComObjectName tableName(dropTableNode->getTableName()); const NAString catalogNamePart = tableName.getCatalogNamePartAsAnsiString(); const NAString schemaNamePart = tableName.getSchemaNamePartAsAnsiString(TRUE); const NAString objectNamePart = tableName.getObjectNamePartAsAnsiString(TRUE); - // TDB - add a check to see if there is an external HBASE table that should be - // removed - ExpHbaseInterface * ehi = allocEHI(); if (ehi == NULL) { @@ -10297,6 +10355,71 @@ void CmpSeabaseDDL::dropNativeHbaseTable( return; } + // If table does not exist, return + retcode = existsInHbase(objectNamePart, ehi); + if (retcode == 0) + { + *CmpCommon::diags() << DgSqlCode(CAT_TABLE_DOES_NOT_EXIST_ERROR) + << DgTableName(objectNamePart.data()); + deallocEHI(ehi); + processReturn(); + return; + } + + // Load definitions into cache + BindWA bindWA(ActiveSchemaDB(),CmpCommon::context(),FALSE/*inDDL*/); + CorrName cnCell(objectNamePart,STMTHEAP, HBASE_CELL_SCHEMA, HBASE_SYSTEM_CATALOG); + NATable *naCellTable = bindWA.getNATableInternal(cnCell); + CorrName cnRow(objectNamePart,STMTHEAP, HBASE_ROW_SCHEMA, HBASE_SYSTEM_CATALOG); + NATable *naRowTable = bindWA.getNATableInternal(cnRow); + + // unregister tables + char query[(ComMAX_ANSI_IDENTIFIER_EXTERNAL_LEN*4) + 100]; + snprintf(query, sizeof(query), + "unregister hbase table %s", tableName.getObjectNamePart().getExternalName().data()); + cliRC = cliInterface->executeImmediate(query); + if (cliRC < 0 && cliRC != -CAT_REG_UNREG_OBJECTS && cliRC != -3251) + { + cliInterface->retrieveSQLDiagnostics(CmpCommon::diags()); + deallocEHI(ehi); + processReturn(); + return; + } + + // Drop external mapping table + //ComObjectName externalName(objectNamePart); + snprintf(query, sizeof(query), + "drop external table if exists %s ", + tableName.getObjectNamePart().getExternalName().data()); + cliRC = cliInterface->executeImmediate(query); + if (cliRC < 0) + { + cliInterface->retrieveSQLDiagnostics(CmpCommon::diags()); + deallocEHI(ehi); + processReturn(); + return; + } + + // Remove cell and row tables from cache. + if (naCellTable) + { + ActiveSchemaDB()->getNATableDB()->removeNATable + (cnCell, + ComQiScope::REMOVE_FROM_ALL_USERS, + COM_BASE_TABLE_OBJECT, + dropTableNode->ddlXns(), FALSE); + } + + if (naRowTable) + { + ActiveSchemaDB()->getNATableDB()->removeNATable + (cnRow, + ComQiScope::REMOVE_FROM_ALL_USERS, + COM_BASE_TABLE_OBJECT, + dropTableNode->ddlXns(), FALSE); + } + + // Remove table from HBase HbaseStr hbaseTable; hbaseTable.val = (char*)objectNamePart.data(); hbaseTable.len = objectNamePart.length(); @@ -10304,12 +10427,9 @@ void CmpSeabaseDDL::dropNativeHbaseTable( if (retcode < 0) { deallocEHI(ehi); - processReturn(); - return; } - } short CmpSeabaseDDL::registerNativeTable http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/PrivMgr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/PrivMgr.cpp b/core/sql/sqlcomp/PrivMgr.cpp index c8a1a20..679bf28 100644 --- a/core/sql/sqlcomp/PrivMgr.cpp +++ b/core/sql/sqlcomp/PrivMgr.cpp @@ -920,6 +920,15 @@ ComObjectType PrivMgr::ObjectLitToEnum(const char *objectLiteral) //********************* End of PrivMgr::ObjectLitToEnum ************************ +static void translateObjectName( + const std::string inputName, + std::string &outputName) +{ + char prefix[inputName.length()]; + snprintf(prefix, sizeof(prefix), "%s.\"%s\"", + HBASE_SYSTEM_CATALOG, HBASE_EXT_MAP_SCHEMA); +} + // ---------------------------------------------------------------------------- // method: isAuthorizationEnabled // http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/PrivMgr.h ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/PrivMgr.h b/core/sql/sqlcomp/PrivMgr.h index 925a9af..d04c410 100644 --- a/core/sql/sqlcomp/PrivMgr.h +++ b/core/sql/sqlcomp/PrivMgr.h @@ -136,6 +136,10 @@ class PrivMgr bitmap.set(REFERENCES_PRIV); } + static void translateObjectName( + const std::string inputName, + std::string &outputName); + static void log( const std::string filename, const std::string message, http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/PrivMgrCommands.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/PrivMgrCommands.cpp b/core/sql/sqlcomp/PrivMgrCommands.cpp index 55cf3a6..05aaec9 100644 --- a/core/sql/sqlcomp/PrivMgrCommands.cpp +++ b/core/sql/sqlcomp/PrivMgrCommands.cpp @@ -45,158 +45,6 @@ #include <algorithm> // **************************************************************************** -// Class: PrivMgrObjectInfo -// **************************************************************************** -PrivMgrObjectInfo::PrivMgrObjectInfo( - const NATable *naTable) -: objectOwner_ (naTable->getOwner()), - schemaOwner_ (naTable->getSchemaOwner()), - objectUID_ (naTable->objectUid().get_value()), - objectName_ (naTable->getTableName().getQualifiedNameAsAnsiString().data()), - objectType_ (naTable->getObjectType()) -{ - const NAColumnArray &colNameArray = naTable->getNAColumnArray(); - for (size_t i = 0; i < colNameArray.entries(); i++) - { - const NAColumn * naCol = colNameArray.getColumn(i); - std::string columnName(naCol->getColName().data()); - columnList_.push_back( columnName); - } -} - -// **************************************************************************** -// Class: PrivMgrUserPrivs -// **************************************************************************** -bool PrivMgrUserPrivs::initUserPrivs( - const std::vector<int32_t> & roleIDs, - const TrafDesc *priv_desc, - const int32_t userID, - const int64_t objectUID, - ComSecurityKeySet & secKeySet) -{ - hasPublicPriv_ = false; - - // generate PrivMgrUserPrivs from the priv_desc structure - TrafDesc *priv_grantees_desc = priv_desc->privDesc()->privGrantees; - NAList<PrivMgrDesc> descList(NULL); - - // Find relevant descs for the user - while (priv_grantees_desc) - { - Int32 grantee = priv_grantees_desc->privGranteeDesc()->grantee; - bool addDesc = false; - if (grantee == userID) - addDesc = true; - - if (PrivMgr::isRoleID(grantee)) - { - if ((std::find(roleIDs.begin(), roleIDs.end(), grantee)) != roleIDs.end()) - addDesc = true; - } - - if (ComUser::isPublicUserID(grantee)) - { - addDesc = true; - hasPublicPriv_ = true; - } - - // Create a list of PrivMgrDesc contain privileges for user, user's roles, - // and public - if (addDesc) - { - TrafDesc *objectPrivs = priv_grantees_desc->privGranteeDesc()->objectBitmap; - - PrivMgrCoreDesc objectDesc(objectPrivs->privBitmapDesc()->privBitmap, - objectPrivs->privBitmapDesc()->privWGOBitmap); - - TrafDesc *priv_grantee_desc = priv_grantees_desc->privGranteeDesc(); - TrafDesc *columnPrivs = priv_grantee_desc->privGranteeDesc()->columnBitmaps; - NAList<PrivMgrCoreDesc> columnDescs(NULL); - while (columnPrivs) - { - PrivMgrCoreDesc columnDesc(columnPrivs->privBitmapDesc()->privBitmap, - columnPrivs->privBitmapDesc()->privWGOBitmap, - columnPrivs->privBitmapDesc()->columnOrdinal); - columnDescs.insert(columnDesc); - columnPrivs = columnPrivs->next; - } - - PrivMgrDesc privs(priv_grantees_desc->privGranteeDesc()->grantee); - privs.setTablePrivs(objectDesc); - privs.setColumnPrivs(columnDescs); - privs.setHasPublicPriv(hasPublicPriv_); - - descList.insert(privs); - } - priv_grantees_desc = priv_grantees_desc->next; - } - - // Union privileges from all grantees together to create a single set of - // bitmaps. Create security invalidation keys - for (int i = 0; i < descList.entries(); i++) - { - PrivMgrDesc privs = descList[i]; - - // Set up object level privileges - objectBitmap_ |= privs.getTablePrivs().getPrivBitmap(); - grantableBitmap_ |= privs.getTablePrivs().getWgoBitmap(); - - // Set up column level privileges - NAList<PrivMgrCoreDesc> columnPrivs = privs.getColumnPrivs(); - std::map<size_t,PrivColumnBitmap>::iterator it; - for (int j = 0; j < columnPrivs.entries(); j++) - { - PrivMgrCoreDesc colDesc = columnPrivs[j]; - Int32 columnOrdinal = colDesc.getColumnOrdinal(); - it = colPrivsList_.find(columnOrdinal); - if (it == colPrivsList_.end()) - { - colPrivsList_[columnOrdinal] = colDesc.getPrivBitmap(); - colGrantableList_[columnOrdinal] = colDesc.getWgoBitmap(); - } - else - { - colPrivsList_[columnOrdinal] |= colDesc.getPrivBitmap(); - colGrantableList_[columnOrdinal] |= colDesc.getWgoBitmap(); - } - } - - // set up security invalidation keys - if (!buildSecurityKeys(userID, privs.getGrantee(), objectUID, privs.getTablePrivs(), secKeySet)) - return false; - - for (int k = 0; k < colPrivsList_.size(); k++) - { - PrivMgrCoreDesc colDesc(colPrivsList_[k], colGrantableList_[k]); - if (!buildSecurityKeys(userID, privs.getGrantee(), objectUID, colDesc, secKeySet)) - return false; - } - } - - // TBD - add schema privilege bitmaps - return true; -} - -// ---------------------------------------------------------------------------- -// method: initUserPrivs -// -// Creates a PrivMgrUserPrivs object from a PrivMgrDesc object -// ---------------------------------------------------------------------------- -void PrivMgrUserPrivs::initUserPrivs(PrivMgrDesc &privsOfTheUser) -{ - objectBitmap_ = privsOfTheUser.getTablePrivs().getPrivBitmap(); - grantableBitmap_ = privsOfTheUser.getTablePrivs().getWgoBitmap(); - - for (int32_t i = 0; i < privsOfTheUser.getColumnPrivs().entries(); i++) - { - const int32_t columnOrdinal = privsOfTheUser.getColumnPrivs()[i].getColumnOrdinal(); - colPrivsList_[columnOrdinal] = privsOfTheUser.getColumnPrivs()[i].getPrivBitmap(); - colGrantableList_[columnOrdinal] = privsOfTheUser.getColumnPrivs()[i].getWgoBitmap(); - } - hasPublicPriv_ = privsOfTheUser.getHasPublicPriv(); -} - -// **************************************************************************** // Class: PrivMgrCommands // **************************************************************************** @@ -570,6 +418,14 @@ PrivStatus PrivMgrCommands::getPrivileges( PrivMgrDesc emptyDesc; userPrivs.initUserPrivs(emptyDesc); } + + // if an hbase table and is not registered, assume no privs + else if ((naTable->isHbaseCellTable() || naTable->isHbaseRowTable()) && + (!naTable->hasExternalTable() && !naTable->isRegistered())) + { + PrivMgrDesc emptyDesc; + userPrivs.initUserPrivs(emptyDesc); + } else { PrivMgrPrivileges objectPrivs (metadataLocation_, pDiags_); http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/PrivMgrCommands.h ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/PrivMgrCommands.h b/core/sql/sqlcomp/PrivMgrCommands.h index e1e06b4..312cbab 100644 --- a/core/sql/sqlcomp/PrivMgrCommands.h +++ b/core/sql/sqlcomp/PrivMgrCommands.h @@ -32,6 +32,7 @@ #include "PrivMgrDefs.h" #include "TrafDDLdesc.h" #include "ComSecurityKey.h" +#include "PrivMgrUserPrivs.h" class ComDiagsArea; class ComSecurityKey; @@ -48,371 +49,12 @@ struct TrafDesc; // ***************************************************************************** // Contents of file -class PrivMgrObjectInfo; -class ObjectPrivsRow; -class PrivMgrUserPrivs; class PrivMgrCommands; // Forward references class PrivMgrPrivileges; class NATable; -// **************************************************************************** -// * -// * Class: PrivMgrObjectInfo -// * Description: This class describes object details needed to perform -// * describe requests -// * -// **************************************************************************** -class PrivMgrObjectInfo -{ - public: - - PrivMgrObjectInfo( const int64_t objectUID, - const std::string objectName, - const int32_t objectOwner, - const int32_t schemaOwner, - const ComObjectType objectType) - : objectOwner_ (objectOwner), - objectName_ (objectName), - schemaOwner_ (schemaOwner), - objectUID_ (objectUID), - objectType_ (objectType) - {} - - - PrivMgrObjectInfo(const NATable *naTable); - - const int32_t getObjectOwner() { return objectOwner_; } - const std::string getObjectName() { return objectName_; } - const int32_t getSchemaOwner() { return schemaOwner_; } - const int64_t getObjectUID() { return objectUID_; } - const ComObjectType getObjectType() { return objectType_; } - const std::vector<std::string> &getColumnList() { return columnList_; } - - private: - - int64_t objectUID_; - std::string objectName_; - int32_t objectOwner_; - int32_t schemaOwner_; - ComObjectType objectType_; - std::vector<std::string> columnList_; -}; - -// **************************************************************************** -// class: ObjectPrivsRow -// -// **************************************************************************** -class ObjectPrivsRow -{ -public: - char objectName[(MAX_SQL_IDENTIFIER_NAME_LEN*3) + 2 + 1]; - ComObjectType objectType; - int32_t granteeID; - char granteeName[MAX_USERNAME_LEN * 2 + 1]; - ComGranteeType granteeType; - int32_t grantorID; - char grantorName[MAX_USERNAME_LEN * 2 + 1]; - ComGrantorType grantorType; - int64_t privilegesBitmap; - int64_t grantableBitmap; -}; - - -// ***************************************************************************** -// * -// * Class: PrivMgrUserPrivs -// * Description: This class encapsulates privileges associated with an object -// * for a user. -// * -// ***************************************************************************** -class PrivMgrUserPrivs -{ - public: - - PrivMgrUserPrivs() - : hasPublicPriv_(false) - {} - - static std::string convertPrivTypeToLiteral(PrivType which) - { - std::string privilege; - switch (which) - { - case SELECT_PRIV: - privilege = "SELECT"; - break; - case INSERT_PRIV: - privilege = "INSERT"; - break; - case DELETE_PRIV: - privilege = "DELETE"; - break; - case UPDATE_PRIV: - privilege = "UPDATE"; - break; - case USAGE_PRIV: - privilege = "USAGE"; - break; - case REFERENCES_PRIV: - privilege = "REFERENCES"; - break; - case EXECUTE_PRIV: - privilege = "EXECUTE"; - break; - case CREATE_PRIV: - privilege = "CREATE"; - break; - case ALTER_PRIV: - privilege = "ALTER"; - break; - case DROP_PRIV: - privilege = "DROP"; - break; - case ALL_DML: - privilege = "ALL_DML"; - break; - case ALL_DDL: - privilege = "ALL_DDL"; - break; - case ALL_PRIVS: - privilege = "ALL"; - break; - default: - privilege = "UNKNOWN"; - } - return privilege; -} - - - // Object level - bool hasObjectSelectPriv() const {return objectBitmap_.test(SELECT_PRIV);} - bool hasObjectInsertPriv() const {return objectBitmap_.test(INSERT_PRIV);} - bool hasObjectDeletePriv() const {return objectBitmap_.test(DELETE_PRIV);} - bool hasObjectUpdatePriv() const {return objectBitmap_.test(UPDATE_PRIV);} - bool hasObjectUsagePriv() const {return objectBitmap_.test(USAGE_PRIV);} - bool hasObjectReferencePriv() const {return objectBitmap_.test(REFERENCES_PRIV);} - bool hasObjectExecutePriv() const {return objectBitmap_.test(EXECUTE_PRIV);} - bool hasObjectAlterPriv() const {return objectBitmap_.test(ALTER_PRIV);} - bool hasObjectDropPriv() const {return objectBitmap_.test(DROP_PRIV);} - bool hasSelectPriv() const {return schemaPrivBitmap_.test(SELECT_PRIV) || objectBitmap_.test(SELECT_PRIV);} - bool hasInsertPriv() const {return schemaPrivBitmap_.test(INSERT_PRIV) || objectBitmap_.test(INSERT_PRIV);} - bool hasDeletePriv() const {return schemaPrivBitmap_.test(DELETE_PRIV) || objectBitmap_.test(DELETE_PRIV);} - bool hasUpdatePriv() const {return schemaPrivBitmap_.test(UPDATE_PRIV) || objectBitmap_.test(UPDATE_PRIV);} - bool hasUsagePriv() const {return schemaPrivBitmap_.test(USAGE_PRIV) || objectBitmap_.test(USAGE_PRIV);} - bool hasReferencePriv() const {return schemaPrivBitmap_.test(REFERENCES_PRIV) || objectBitmap_.test(REFERENCES_PRIV);} - bool hasExecutePriv() const {return schemaPrivBitmap_.test(EXECUTE_PRIV) || objectBitmap_.test(EXECUTE_PRIV);} - bool hasCreatePriv() const {return schemaPrivBitmap_.test(CREATE_PRIV);} - bool hasAlterPriv() const {return schemaPrivBitmap_.test(ALTER_PRIV) || objectBitmap_.test(ALTER_PRIV);} - bool hasDropPriv() const {return schemaPrivBitmap_.test(DROP_PRIV) || objectBitmap_.test(DROP_PRIV);} - bool hasAllObjectPriv() const {return objectBitmap_.all();} - bool hasAnyObjectPriv() const {return objectBitmap_.any();} - bool hasPriv(PrivType which) const - { - bool hasPriv = false; - switch (which) - { - case SELECT_PRIV: - hasPriv = hasSelectPriv(); - break; - case INSERT_PRIV: - hasPriv = hasInsertPriv(); - break; - case DELETE_PRIV: - hasPriv = hasDeletePriv(); - break; - case UPDATE_PRIV: - hasPriv = hasUpdatePriv(); - break; - case USAGE_PRIV: - hasPriv = hasUsagePriv(); - break; - case REFERENCES_PRIV: - hasPriv = hasReferencePriv(); - break; - case EXECUTE_PRIV: - hasPriv = hasExecutePriv(); - break; - - // other privileges defined in the PrivType enum are not yet supported - default: - hasPriv = false; - } - return hasPriv; - } - - bool hasObjectPriv(PrivType which) const - { - bool hasPriv = false; - switch (which) - { - case SELECT_PRIV: - hasPriv = hasObjectSelectPriv(); - break; - case INSERT_PRIV: - hasPriv = hasObjectInsertPriv(); - break; - case DELETE_PRIV: - hasPriv = hasObjectDeletePriv(); - break; - case UPDATE_PRIV: - hasPriv = hasObjectUpdatePriv(); - break; - case USAGE_PRIV: - hasPriv = hasObjectUsagePriv(); - break; - case REFERENCES_PRIV: - hasPriv = hasObjectReferencePriv(); - break; - case EXECUTE_PRIV: - hasPriv = hasObjectExecutePriv(); - break; - - // other privileges defined in the PrivType enum are not yet supported - default: - hasPriv = false; - } - return hasPriv; - } - - bool hasAllDMLPriv() const - { - return (hasSelectPriv() && - hasInsertPriv() && - hasDeletePriv() && - hasUpdatePriv() && - hasReferencePriv()); - } - - bool hasAllLibraryPriv() const - { return (hasUpdatePriv() && hasUsagePriv()); } - - bool hasAllUdrPriv() const - { return hasExecutePriv(); } - - bool hasAllDDLPriv() const - {return (hasCreatePriv() && hasAlterPriv() && hasDropPriv());} - - bool hasWGOOption(PrivType privType) const - {return grantableBitmap_.test(privType);} - - bool hasColSelectPriv(const int32_t ordinal) const {return hasColPriv(SELECT_PRIV,ordinal);} - bool hasColInsertPriv(const int32_t ordinal) const {return hasColPriv(INSERT_PRIV,ordinal);} - bool hasColUpdatePriv(const int32_t ordinal) const {return hasColPriv(UPDATE_PRIV,ordinal);} - bool hasColReferencePriv(const int32_t ordinal) const {return hasColPriv(REFERENCES_PRIV,ordinal);} - bool hasAnyColPriv() const - { - return (!colPrivsList_.empty()); - } - - bool hasAnyColPriv(const PrivType privType) const - { - - PrivColIterator columnIterator; - for (columnIterator = colPrivsList_.begin(); - columnIterator != colPrivsList_.end(); ++columnIterator) - { - if (columnIterator->second.test(privType)) - return true; - - } - - return false; - } - - - bool hasColPriv(PrivType privType,const int32_t ordinal) const - { - // If no privileges for that column, return false. - if (colPrivsList_.count(ordinal) <= 0) - return false; - - switch (privType) - { - case SELECT_PRIV: - case INSERT_PRIV: - case REFERENCES_PRIV: - case UPDATE_PRIV: - { - PrivColIterator columnIterator = colPrivsList_.find(ordinal); - if (columnIterator == colPrivsList_.end()) - return false; - - return columnIterator->second.test(privType); - break; - } - // other privileges not column privs - default: - return false; - } - return false; - } - - PrivColList & getColPrivList() {return colPrivsList_;} - void setColPrivList(PrivColList colPrivsList) - {colPrivsList_ = colPrivsList;} - - PrivColList & getColGrantableList() {return colGrantableList_;} - void setColGrantableList(PrivColList colGrantableList) - {colGrantableList_ = colGrantableList;} - - PrivColumnBitmap getColumnPrivBitmap(const int32_t ordinal) - { - if (colPrivsList_.empty() || colPrivsList_.count(ordinal) == 0) - return emptyBitmap_; - - return colPrivsList_[ordinal]; - } - - PrivColumnBitmap getColumnGrantableBitmap(const int32_t ordinal) - { - if (colGrantableList_.empty() || colGrantableList_.count(ordinal) == 0) - return emptyBitmap_; - - return colGrantableList_[ordinal]; - } - - PrivMgrBitmap getObjectBitmap() {return objectBitmap_;} - void setObjectBitmap (PrivMgrBitmap objectBitmap) - {objectBitmap_ = objectBitmap;} - - PrivMgrBitmap getGrantableBitmap() {return grantableBitmap_;} - void setGrantableBitmap (PrivMgrBitmap grantableBitmap) - {grantableBitmap_ = grantableBitmap;} - - void setOwnerDefaultPrivs() - { objectBitmap_.set(); grantableBitmap_.set(); } - - PrivSchemaBitmap getSchemaPrivBitmap() {return schemaPrivBitmap_;} - void setSchemaPrivBitmap (PrivSchemaBitmap schemaPrivBitmap) - {schemaPrivBitmap_ = schemaPrivBitmap;} - - PrivSchemaBitmap getSchemaGrantableBitmap() {return schemaGrantableBitmap_;} - void setSchemaGrantableBitmap (PrivSchemaBitmap schemaGrantableBitmap) - {schemaGrantableBitmap_ = schemaGrantableBitmap;} - - bool getHasPublicPriv() { return hasPublicPriv_; } - void setHasPublicPriv(bool hasPublicPriv) {hasPublicPriv_ = hasPublicPriv;} - void initUserPrivs (PrivMgrDesc &privsOfTheGrantor); - bool initUserPrivs ( const std::vector<int32_t> &roleIDs, - const TrafDesc *priv_desc, - const int32_t userID, - const int64_t objectUID, - NASet<ComSecurityKey> & secKeySet); - - private: - PrivObjectBitmap objectBitmap_; - PrivObjectBitmap grantableBitmap_; - PrivColList colPrivsList_; - PrivColList colGrantableList_; - PrivSchemaBitmap schemaPrivBitmap_; - PrivSchemaBitmap schemaGrantableBitmap_; - PrivColumnBitmap emptyBitmap_; - bool hasPublicPriv_; -}; - - // ***************************************************************************** // * // * Class: PrivMgrCommands http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/PrivMgrComponentPrivileges.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/PrivMgrComponentPrivileges.cpp b/core/sql/sqlcomp/PrivMgrComponentPrivileges.cpp index bbf85ee..a82da0f 100644 --- a/core/sql/sqlcomp/PrivMgrComponentPrivileges.cpp +++ b/core/sql/sqlcomp/PrivMgrComponentPrivileges.cpp @@ -204,6 +204,12 @@ using namespace ComponentPrivileges; // ----------------------------------------------------------------------- // Construct a PrivMgrComponentPrivileges object for a new component operation. // ----------------------------------------------------------------------- +PrivMgrComponentPrivileges::PrivMgrComponentPrivileges() +: PrivMgr(), + fullTableName_(metadataLocation_ + "." + PRIVMGR_COMPONENT_PRIVILEGES), + myTable_(*new MyTable(fullTableName_,pDiags_)) +{ }; + PrivMgrComponentPrivileges::PrivMgrComponentPrivileges( const std::string & metadataLocation, ComDiagsArea * pDiags) http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/PrivMgrComponentPrivileges.h ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/PrivMgrComponentPrivileges.h b/core/sql/sqlcomp/PrivMgrComponentPrivileges.h index 2081a0f..b87e31f 100644 --- a/core/sql/sqlcomp/PrivMgrComponentPrivileges.h +++ b/core/sql/sqlcomp/PrivMgrComponentPrivileges.h @@ -48,6 +48,8 @@ public: // ------------------------------------------------------------------- // Constructors and destructors: // ------------------------------------------------------------------- + PrivMgrComponentPrivileges(); + PrivMgrComponentPrivileges( const std::string & metadataLocation, ComDiagsArea * pDiags = NULL); @@ -140,8 +142,6 @@ public: PrivDropBehavior dropBehavior); private: - PrivMgrComponentPrivileges(); - bool grantExists( const std::string componentUIDString, const std::string operationCode, http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/PrivMgrUserPrivs.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/PrivMgrUserPrivs.cpp b/core/sql/sqlcomp/PrivMgrUserPrivs.cpp new file mode 100644 index 0000000..fcdf247 --- /dev/null +++ b/core/sql/sqlcomp/PrivMgrUserPrivs.cpp @@ -0,0 +1,208 @@ +//***************************************************************************** +// @@@ 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 @@@ +//***************************************************************************** + +// ========================================================================== +// Contains non inline methods in the following classes +// PrivMgrObjectInfo +// PrivMgrCommands +// ========================================================================== + +#include "PrivMgrCommands.h" +#include "PrivMgrMD.h" +#include "DgBaseType.h" +#include "NATable.h" +#include "NAColumn.h" +#include "ComSecurityKey.h" +#include "ComUser.h" +#include "ComMisc.h" +#include "CmpSeabaseDDL.h" +#include <cstdio> +#include <algorithm> + +// **************************************************************************** +// Class: PrivMgrObjectInfo +// **************************************************************************** +PrivMgrObjectInfo::PrivMgrObjectInfo( + const NATable *naTable) +: objectOwner_ (naTable->getOwner()), + schemaOwner_ (naTable->getSchemaOwner()), + objectUID_ (naTable->objectUid().get_value()), + objectType_ (naTable->getObjectType()) +{ + // Map hbase map table to external name + if (ComIsHBaseMappedIntFormat(naTable->getTableName().getCatalogName(), + naTable->getTableName().getSchemaName())) + { + NAString newCatName; + NAString newSchName; + ComConvertHBaseMappedIntToExt(naTable->getTableName().getCatalogName(), + naTable->getTableName().getSchemaName(), + newCatName, newSchName); + CONCAT_CATSCH(objectName_, newCatName, newSchName); + objectName_ += std::string(".") + + naTable->getTableName().getUnqualifiedObjectNameAsAnsiString().data(); + } + else + objectName_ = naTable->getTableName().getQualifiedNameAsAnsiString().data(); + + const NAColumnArray &colNameArray = naTable->getNAColumnArray(); + for (size_t i = 0; i < colNameArray.entries(); i++) + { + const NAColumn * naCol = colNameArray.getColumn(i); + std::string columnName(naCol->getColName().data()); + columnList_.push_back( columnName); + } +} + +// **************************************************************************** +// Class: PrivMgrUserPrivs +// **************************************************************************** +bool PrivMgrUserPrivs::initUserPrivs( + const std::vector<int32_t> & roleIDs, + const TrafDesc *priv_desc, + const int32_t userID, + const int64_t objectUID, + ComSecurityKeySet & secKeySet) +{ + hasPublicPriv_ = false; + + // generate PrivMgrUserPrivs from the priv_desc structure + TrafDesc *priv_grantees_desc = priv_desc->privDesc()->privGrantees; + NAList<PrivMgrDesc> descList(NULL); + + // Find relevant descs for the user + while (priv_grantees_desc) + { + Int32 grantee = priv_grantees_desc->privGranteeDesc()->grantee; + bool addDesc = false; + if (grantee == userID) + addDesc = true; + + if (PrivMgr::isRoleID(grantee)) + { + if ((std::find(roleIDs.begin(), roleIDs.end(), grantee)) != roleIDs.end()) + addDesc = true; + } + + if (ComUser::isPublicUserID(grantee)) + { + addDesc = true; + hasPublicPriv_ = true; + } + + // Create a list of PrivMgrDesc contain privileges for user, user's roles, + // and public + if (addDesc) + { + TrafDesc *objectPrivs = priv_grantees_desc->privGranteeDesc()->objectBitmap; + + PrivMgrCoreDesc objectDesc(objectPrivs->privBitmapDesc()->privBitmap, + objectPrivs->privBitmapDesc()->privWGOBitmap); + + TrafDesc *priv_grantee_desc = priv_grantees_desc->privGranteeDesc(); + TrafDesc *columnPrivs = priv_grantee_desc->privGranteeDesc()->columnBitmaps; + NAList<PrivMgrCoreDesc> columnDescs(NULL); + while (columnPrivs) + { + PrivMgrCoreDesc columnDesc(columnPrivs->privBitmapDesc()->privBitmap, + columnPrivs->privBitmapDesc()->privWGOBitmap, + columnPrivs->privBitmapDesc()->columnOrdinal); + columnDescs.insert(columnDesc); + columnPrivs = columnPrivs->next; + } + + PrivMgrDesc privs(priv_grantees_desc->privGranteeDesc()->grantee); + privs.setTablePrivs(objectDesc); + privs.setColumnPrivs(columnDescs); + privs.setHasPublicPriv(hasPublicPriv_); + + descList.insert(privs); + } + priv_grantees_desc = priv_grantees_desc->next; + } + + // Union privileges from all grantees together to create a single set of + // bitmaps. Create security invalidation keys + for (int i = 0; i < descList.entries(); i++) + { + PrivMgrDesc privs = descList[i]; + + // Set up object level privileges + objectBitmap_ |= privs.getTablePrivs().getPrivBitmap(); + grantableBitmap_ |= privs.getTablePrivs().getWgoBitmap(); + + // Set up column level privileges + NAList<PrivMgrCoreDesc> columnPrivs = privs.getColumnPrivs(); + std::map<size_t,PrivColumnBitmap>::iterator it; + for (int j = 0; j < columnPrivs.entries(); j++) + { + PrivMgrCoreDesc colDesc = columnPrivs[j]; + Int32 columnOrdinal = colDesc.getColumnOrdinal(); + it = colPrivsList_.find(columnOrdinal); + if (it == colPrivsList_.end()) + { + colPrivsList_[columnOrdinal] = colDesc.getPrivBitmap(); + colGrantableList_[columnOrdinal] = colDesc.getWgoBitmap(); + } + else + { + colPrivsList_[columnOrdinal] |= colDesc.getPrivBitmap(); + colGrantableList_[columnOrdinal] |= colDesc.getWgoBitmap(); + } + } + + // set up security invalidation keys + if (!buildSecurityKeys(userID, privs.getGrantee(), objectUID, privs.getTablePrivs(), secKeySet)) + return false; + + for (int k = 0; k < colPrivsList_.size(); k++) + { + PrivMgrCoreDesc colDesc(colPrivsList_[k], colGrantableList_[k]); + if (!buildSecurityKeys(userID, privs.getGrantee(), objectUID, colDesc, secKeySet)) + return false; + } + } + + // TBD - add schema privilege bitmaps + return true; +} + +// ---------------------------------------------------------------------------- +// method: initUserPrivs +// +// Creates a PrivMgrUserPrivs object from a PrivMgrDesc object +// ---------------------------------------------------------------------------- +void PrivMgrUserPrivs::initUserPrivs(PrivMgrDesc &privsOfTheUser) +{ + objectBitmap_ = privsOfTheUser.getTablePrivs().getPrivBitmap(); + grantableBitmap_ = privsOfTheUser.getTablePrivs().getWgoBitmap(); + + for (int32_t i = 0; i < privsOfTheUser.getColumnPrivs().entries(); i++) + { + const int32_t columnOrdinal = privsOfTheUser.getColumnPrivs()[i].getColumnOrdinal(); + colPrivsList_[columnOrdinal] = privsOfTheUser.getColumnPrivs()[i].getPrivBitmap(); + colGrantableList_[columnOrdinal] = privsOfTheUser.getColumnPrivs()[i].getWgoBitmap(); + } + hasPublicPriv_ = privsOfTheUser.getHasPublicPriv(); +} + http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/sqlcomp/PrivMgrUserPrivs.h ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/PrivMgrUserPrivs.h b/core/sql/sqlcomp/PrivMgrUserPrivs.h new file mode 100644 index 0000000..a5264c5 --- /dev/null +++ b/core/sql/sqlcomp/PrivMgrUserPrivs.h @@ -0,0 +1,400 @@ +//***************************************************************************** +// @@@ 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 PRIVMGR_USERP_H +#define PRIVMGR_USERP_H + +#include <string> +#include <vector> +#include <bitset> +#include "PrivMgrDefs.h" + +class ComSecurityKey; +class ComDiagsArea; + +// Contents of file +class PrivMgrObjectInfo; +class ObjectPrivsRow; +class PrivMgrUserPrivs; + +// Forward references +class PrivMgrPrivileges; +class NATable; + +// **************************************************************************** +// * +// * Class: PrivMgrObjectInfo +// * Description: This class describes object details needed to perform +// * describe requests +// * +// **************************************************************************** +class PrivMgrObjectInfo +{ + public: + + PrivMgrObjectInfo( const int64_t objectUID, + const std::string objectName, + const int32_t objectOwner, + const int32_t schemaOwner, + const ComObjectType objectType) + : objectOwner_ (objectOwner), + objectName_ (objectName), + schemaOwner_ (schemaOwner), + objectUID_ (objectUID), + objectType_ (objectType) + {} + + + PrivMgrObjectInfo(const NATable *naTable); + + const int32_t getObjectOwner() { return objectOwner_; } + const std::string getObjectName() { return objectName_; } + const int32_t getSchemaOwner() { return schemaOwner_; } + const int64_t getObjectUID() { return objectUID_; } + const ComObjectType getObjectType() { return objectType_; } + const std::vector<std::string> &getColumnList() { return columnList_; } + + private: + + int64_t objectUID_; + std::string objectName_; + int32_t objectOwner_; + int32_t schemaOwner_; + ComObjectType objectType_; + std::vector<std::string> columnList_; +}; + +// **************************************************************************** +// class: ObjectPrivsRow +// +// **************************************************************************** +class ObjectPrivsRow +{ +public: + char objectName[(MAX_SQL_IDENTIFIER_NAME_LEN*3) + 2 + 1]; + ComObjectType objectType; + int32_t granteeID; + char granteeName[MAX_USERNAME_LEN * 2 + 1]; + ComGranteeType granteeType; + int32_t grantorID; + char grantorName[MAX_USERNAME_LEN * 2 + 1]; + ComGrantorType grantorType; + int64_t privilegesBitmap; + int64_t grantableBitmap; +}; + + +// ***************************************************************************** +// * +// * Class: PrivMgrUserPrivs +// * Description: This class encapsulates privileges associated with an object +// * for a user. +// * +// ***************************************************************************** +class PrivMgrUserPrivs +{ + public: + + PrivMgrUserPrivs() + : hasPublicPriv_(false) + {} + + static std::string convertPrivTypeToLiteral(PrivType which) + { + std::string privilege; + switch (which) + { + case SELECT_PRIV: + privilege = "SELECT"; + break; + case INSERT_PRIV: + privilege = "INSERT"; + break; + case DELETE_PRIV: + privilege = "DELETE"; + break; + case UPDATE_PRIV: + privilege = "UPDATE"; + break; + case USAGE_PRIV: + privilege = "USAGE"; + break; + case REFERENCES_PRIV: + privilege = "REFERENCES"; + break; + case EXECUTE_PRIV: + privilege = "EXECUTE"; + break; + case CREATE_PRIV: + privilege = "CREATE"; + break; + case ALTER_PRIV: + privilege = "ALTER"; + break; + case DROP_PRIV: + privilege = "DROP"; + break; + case ALL_DML: + privilege = "ALL_DML"; + break; + case ALL_DDL: + privilege = "ALL_DDL"; + break; + case ALL_PRIVS: + privilege = "ALL"; + break; + default: + privilege = "UNKNOWN"; + } + return privilege; +} + + + // Object level + bool hasObjectSelectPriv() const {return objectBitmap_.test(SELECT_PRIV);} + bool hasObjectInsertPriv() const {return objectBitmap_.test(INSERT_PRIV);} + bool hasObjectDeletePriv() const {return objectBitmap_.test(DELETE_PRIV);} + bool hasObjectUpdatePriv() const {return objectBitmap_.test(UPDATE_PRIV);} + bool hasObjectUsagePriv() const {return objectBitmap_.test(USAGE_PRIV);} + bool hasObjectReferencePriv() const {return objectBitmap_.test(REFERENCES_PRIV);} + bool hasObjectExecutePriv() const {return objectBitmap_.test(EXECUTE_PRIV);} + bool hasObjectAlterPriv() const {return objectBitmap_.test(ALTER_PRIV);} + bool hasObjectDropPriv() const {return objectBitmap_.test(DROP_PRIV);} + bool hasSelectPriv() const {return schemaPrivBitmap_.test(SELECT_PRIV) || objectBitmap_.test(SELECT_PRIV);} + bool hasInsertPriv() const {return schemaPrivBitmap_.test(INSERT_PRIV) || objectBitmap_.test(INSERT_PRIV);} + bool hasDeletePriv() const {return schemaPrivBitmap_.test(DELETE_PRIV) || objectBitmap_.test(DELETE_PRIV);} + bool hasUpdatePriv() const {return schemaPrivBitmap_.test(UPDATE_PRIV) || objectBitmap_.test(UPDATE_PRIV);} + bool hasUsagePriv() const {return schemaPrivBitmap_.test(USAGE_PRIV) || objectBitmap_.test(USAGE_PRIV);} + bool hasReferencePriv() const {return schemaPrivBitmap_.test(REFERENCES_PRIV) || objectBitmap_.test(REFERENCES_PRIV);} + bool hasExecutePriv() const {return schemaPrivBitmap_.test(EXECUTE_PRIV) || objectBitmap_.test(EXECUTE_PRIV);} + bool hasCreatePriv() const {return schemaPrivBitmap_.test(CREATE_PRIV);} + bool hasAlterPriv() const {return schemaPrivBitmap_.test(ALTER_PRIV) || objectBitmap_.test(ALTER_PRIV);} + bool hasDropPriv() const {return schemaPrivBitmap_.test(DROP_PRIV) || objectBitmap_.test(DROP_PRIV);} + bool hasAllObjectPriv() const {return objectBitmap_.all();} + bool hasAnyObjectPriv() const {return objectBitmap_.any();} + bool hasPriv(PrivType which) const + { + bool hasPriv = false; + switch (which) + { + case SELECT_PRIV: + hasPriv = hasSelectPriv(); + break; + case INSERT_PRIV: + hasPriv = hasInsertPriv(); + break; + case DELETE_PRIV: + hasPriv = hasDeletePriv(); + break; + case UPDATE_PRIV: + hasPriv = hasUpdatePriv(); + break; + case USAGE_PRIV: + hasPriv = hasUsagePriv(); + break; + case REFERENCES_PRIV: + hasPriv = hasReferencePriv(); + break; + case EXECUTE_PRIV: + hasPriv = hasExecutePriv(); + break; + + // other privileges defined in the PrivType enum are not yet supported + default: + hasPriv = false; + } + return hasPriv; + } + + bool hasObjectPriv(PrivType which) const + { + bool hasPriv = false; + switch (which) + { + case SELECT_PRIV: + hasPriv = hasObjectSelectPriv(); + break; + case INSERT_PRIV: + hasPriv = hasObjectInsertPriv(); + break; + case DELETE_PRIV: + hasPriv = hasObjectDeletePriv(); + break; + case UPDATE_PRIV: + hasPriv = hasObjectUpdatePriv(); + break; + case USAGE_PRIV: + hasPriv = hasObjectUsagePriv(); + break; + case REFERENCES_PRIV: + hasPriv = hasObjectReferencePriv(); + break; + case EXECUTE_PRIV: + hasPriv = hasObjectExecutePriv(); + break; + + // other privileges defined in the PrivType enum are not yet supported + default: + hasPriv = false; + } + return hasPriv; + } + + bool hasAllDMLPriv() const + { + return (hasSelectPriv() && + hasInsertPriv() && + hasDeletePriv() && + hasUpdatePriv() && + hasReferencePriv()); + } + + bool hasAllLibraryPriv() const + { return (hasUpdatePriv() && hasUsagePriv()); } + + bool hasAllUdrPriv() const + { return hasExecutePriv(); } + + bool hasAllDDLPriv() const + {return (hasCreatePriv() && hasAlterPriv() && hasDropPriv());} + + bool hasWGOOption(PrivType privType) const + {return grantableBitmap_.test(privType);} + + bool hasColSelectPriv(const int32_t ordinal) const {return hasColPriv(SELECT_PRIV,ordinal);} + bool hasColInsertPriv(const int32_t ordinal) const {return hasColPriv(INSERT_PRIV,ordinal);} + bool hasColUpdatePriv(const int32_t ordinal) const {return hasColPriv(UPDATE_PRIV,ordinal);} + bool hasColReferencePriv(const int32_t ordinal) const {return hasColPriv(REFERENCES_PRIV,ordinal);} + bool hasAnyColPriv() const + { + return (!colPrivsList_.empty()); + } + + bool hasAnyColPriv(const PrivType privType) const + { + + PrivColIterator columnIterator; + for (columnIterator = colPrivsList_.begin(); + columnIterator != colPrivsList_.end(); ++columnIterator) + { + if (columnIterator->second.test(privType)) + return true; + + } + + return false; + } + + + bool hasColPriv(PrivType privType,const int32_t ordinal) const + { + // If no privileges for that column, return false. + if (colPrivsList_.count(ordinal) <= 0) + return false; + + switch (privType) + { + case SELECT_PRIV: + case INSERT_PRIV: + case REFERENCES_PRIV: + case UPDATE_PRIV: + { + PrivColIterator columnIterator = colPrivsList_.find(ordinal); + if (columnIterator == colPrivsList_.end()) + return false; + + return columnIterator->second.test(privType); + break; + } + // other privileges not column privs + default: + return false; + } + return false; + } + + PrivColList & getColPrivList() {return colPrivsList_;} + void setColPrivList(PrivColList colPrivsList) + {colPrivsList_ = colPrivsList;} + + PrivColList & getColGrantableList() {return colGrantableList_;} + void setColGrantableList(PrivColList colGrantableList) + {colGrantableList_ = colGrantableList;} + + PrivColumnBitmap getColumnPrivBitmap(const int32_t ordinal) + { + if (colPrivsList_.empty() || colPrivsList_.count(ordinal) == 0) + return emptyBitmap_; + + return colPrivsList_[ordinal]; + } + + PrivColumnBitmap getColumnGrantableBitmap(const int32_t ordinal) + { + if (colGrantableList_.empty() || colGrantableList_.count(ordinal) == 0) + return emptyBitmap_; + + return colGrantableList_[ordinal]; + } + + PrivMgrBitmap getObjectBitmap() {return objectBitmap_;} + void setObjectBitmap (PrivMgrBitmap objectBitmap) + {objectBitmap_ = objectBitmap;} + + PrivMgrBitmap getGrantableBitmap() {return grantableBitmap_;} + void setGrantableBitmap (PrivMgrBitmap grantableBitmap) + {grantableBitmap_ = grantableBitmap;} + + void setOwnerDefaultPrivs() + { objectBitmap_.set(); grantableBitmap_.set(); } + + PrivSchemaBitmap getSchemaPrivBitmap() {return schemaPrivBitmap_;} + void setSchemaPrivBitmap (PrivSchemaBitmap schemaPrivBitmap) + {schemaPrivBitmap_ = schemaPrivBitmap;} + + PrivSchemaBitmap getSchemaGrantableBitmap() {return schemaGrantableBitmap_;} + void setSchemaGrantableBitmap (PrivSchemaBitmap schemaGrantableBitmap) + {schemaGrantableBitmap_ = schemaGrantableBitmap;} + + bool getHasPublicPriv() { return hasPublicPriv_; } + void setHasPublicPriv(bool hasPublicPriv) {hasPublicPriv_ = hasPublicPriv;} + void initUserPrivs (PrivMgrDesc &privsOfTheGrantor); + bool initUserPrivs ( const std::vector<int32_t> &roleIDs, + const TrafDesc *priv_desc, + const int32_t userID, + const int64_t objectUID, + NASet<ComSecurityKey> & secKeySet); + + private: + PrivObjectBitmap objectBitmap_; + PrivObjectBitmap grantableBitmap_; + PrivColList colPrivsList_; + PrivColList colGrantableList_; + PrivSchemaBitmap schemaPrivBitmap_; + PrivSchemaBitmap schemaGrantableBitmap_; + PrivColumnBitmap emptyBitmap_; + bool hasPublicPriv_; +}; + +#endif + http://git-wip-us.apache.org/repos/asf/trafodion/blob/b178915d/core/sql/ustat/hs_globals.cpp ---------------------------------------------------------------------- diff --git a/core/sql/ustat/hs_globals.cpp b/core/sql/ustat/hs_globals.cpp index 7267862..1caf904 100644 --- a/core/sql/ustat/hs_globals.cpp +++ b/core/sql/ustat/hs_globals.cpp @@ -3688,10 +3688,7 @@ NABoolean HSGlobalsClass::isAuthorized(NABoolean isShowStats) if (!CmpCommon::context()->isAuthorizationEnabled()) return TRUE; - // no privilege support available for hbase and hive tables - HS_ASSERT (objDef->getNATable()); - if (CmpSeabaseDDL::isHbase(objDef->getCatName())) - return TRUE; + HS_ASSERT (objDef->getNATable()); // Let keep track of how long authorization takes HSLogMan *LM = HSLogMan::Instance();