blob: 58d22b983f9a8dc301c28d90d7057e2b00e8908c [file] [log] [blame]
-- ============================================================================
-- TEST132 - tests utility privilege checking
--
-- @@@ 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 @@@
--
-- This tests the following commands:
--
-- Library operations
-- POPULATE INDEX
-- SHOWDDL & INVOKE
-- UPDATE STATISTICS
--
-- Sections:
-- clean_up - removes database setup
-- set_up - prepares for test
-- test_<type> - runs tests for different commands
-- <operation>_<type> - runs tests for an operation by a user
-- ============================================================================
obey TEST132(clean_up);
cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';
obey TEST132(set_up);
log LOG132 clear;
obey TEST132(test_libraries);
obey TEST132(test_popindex);
obey TEST132(test_show);
obey TEST132(test_stats);
log;
obey TEST132(clean_up);
exit;
?section clean_up
set schema t132sch;
drop sequence t132_team_number_sequence;
cleanup schema t132sch;
drop schema t132sch_private cascade;
?section set_up
create shared schema t132sch;
-- Prepare library file
sh rm -f ./etest132.dll;
sh sh $$scriptsdir$$/tools/dll-compile.ksh etest132.cpp
2>&1 | tee LOG132-SECONDARY;
set pattern $$DLL$$ etest132.dll;
?section test_libraries
-- =================================================================
-- run tests to make sure users that create libraries have correct
-- privileges. To create a library, you must:
-- be DB__ROOT
-- be granted DB__ROOTROLE
-- have the MANAGE_LIBRARY and CREATE/CREATE_LIBARARY privileges
-- =================================================================
set schema t132sch;
get libraries;
get privileges on component sql_operations for "PUBLIC";
-- succeed: DB__ROOT can create a library
obey TEST132(manage_library);
-- fail: sql_user1 cannot create a library
changeuser sql_user1;
obey TEST132(manage_library);
changeuser db__root;
-- succeed: grant DB__ROOTROLE to sql_user1
grant role DB__ROOTROLE to sql_user1;
changeuser sql_user1;
obey TEST132(manage_library);
changeuser DB__ROOT;
-- fail: just grant the create privilege
grant component privilege CREATE_LIBRARY on sql_operations to sql_user2;
changeuser sql_user2;
obey TEST132(manage_library);
changeuser DB__ROOT;
-- succeed: now grant the manage_library privilege
grant component privilege MANAGE_LIBRARY on sql_operations to sql_user2;
get privileges on component sql_operation for sql_user2;
changeuser sql_user2;
obey TEST132(manage_library);
changeuser DB__ROOT;
-- reset
revoke role DB__ROOTROLE from sql_user1;
revoke component privilege MANAGE_LIBRARY on sql_operations from sql_user2;
revoke component privilege CREATE_LIBRARY on sql_operations from sql_user2;
get privileges on component sql_operations for "PUBLIC";
?section manage_library
set schema t132sch;
get libraries in schema t132sch;
create library t132_l1 file 'etest132.dll';
get libraries in schema t132sch;
drop library t132_l1;
get libraries in schema t132sch;
?section test_popindex
-- =================================================================
-- run tests to make sure users that populate indexes have correct
-- privileges. To populate an index, you must:
-- be DB__ROOT
-- be table owner
-- have the SELECT and INSERT privilege
-- =================================================================
set schema t132sch;
--set parserflags 131072;
--cqd DDL_TRANSACTIONS 'ON';
get tables, match '%T132%';
create table t132t1 (c1 int not null primary key, c2 int);
create index t132t1_ndx1 on t132t1 (c2) no populate;
create table t132t2 (c1 int not null primary key, c2 int)
attribute by sql_user1;
create index t132t2_ndx1 on t132t2(c2) no populate;
insert into t132t1 values (1,1), (2,2), (3,3),(4,4), (5,5),(6,6), (7,7),(8,8);
insert into t132t2 values (1,1), (2,2), (3,3),(4,4), (5,5),(6,6), (7,7),(8,8);
get tables, match '%T132%';
cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';
showddl t132t1;
showddl t132t2;
-- DB__ROOT can populate indexes
obey TEST132(populate_index);
obey TEST132(popindex_check_reset);
-- object owner can populate
-- sql_user1 owns t132t2 but not t132t1
-- popindex fails for t132t1 but works for the rest
changeuser sql_user1;
obey TEST132(populate_index);
changeuser db__root;
obey TEST132(popindex_check_reset);
-- if user belongs to DB__ROOTROLE, has DML privileges, so can populate indexes
grant role DB__ROOTROLE to sql_user2;
changeuser sql_user2;
obey TEST132(populate_index);
changeuser db__root;
obey TEST132(popindex_check_reset);
revoke role DB__ROOTROLE from sql_user2;
-- sql_user3 requires both SELECT and INSERT privileges
-- only t132t2 has granted both privileges
grant SELECT on t132t1 to sql_user3;
grant SELECT, INSERT on t132t2 to sql_user3 by sql_user1;
changeuser sql_user3;
obey TEST132(populate_index);
changeuser db__root;
obey TEST132(popindex_check_reset);
-- reset
drop table t132t1 cascade;
drop table t132t2 cascade;
get tables, match 'T132%';
?section populate_index
set schema t132sch;
populate index t132t1_ndx1 on t132t1;;
populate index t132t2_ndx1 on t132t2;
?section popindex_check_reset
set schema t132sch;
set parserflags 1;
select count(*) from table (index_table t132t1_ndx1);
select count(*) from table (index_table t132t2_ndx1);
cleanup index t132t1_ndx1;
create index t132t1_ndx1 on t132t1 (c2) no populate;
drop index t132t2_ndx1;
create index t132t2_ndx1 on t132t2 (c2) no populate;
?section test_show
-- =================================================================
-- run tests to make sure users that perform show commands have correct
-- privileges. To perform show commands, you must:
-- be DB__ROOT
-- be object owner
-- have the SHOW privilege (PUBLIC & DB__ROOTROLE has priv)
-- have SELECT privileges on object
-- =================================================================
set schema t132sch;
create table t132_teams
(team_number int not null primary key,
team_name char(20) not null,
team_contact varchar(50) not null,
team_contact_number char (10) not null
)
;
alter table t132_teams add constraint valid_team_no check (team_number > 0);
insert into t132_teams values
(1, 'White Socks', 'Sam','4082282222'),
(2, 'Giants', 'Joe', '5102839483'),
(3, 'Cardinals', 'Stella', '9513849384'),
(4, 'Indians', 'Matt', '5128383748'),
(5, 'Tigers', 'Ronit', '6198273827');
create table t132_games
( home_team_number int not null,
visitor_team_number int not null,
game_number int not null primary key,
game_time timestamp not null,
game_location varchar(50) not null)
attribute by sql_user1
;
create index t132_home_games on t132_games (home_team_number);
alter table t132_games add constraint valid_game_number check (game_number > 0);
insert into t132_games values
(1, 2, 1, timestamp '2009-04-23 19:30:00', 'California'),
(1, 3, 2, timestamp '2009-04-24 19:30:00', 'California'),
(1, 4, 3, timestamp '2009-04-25 10:00:00', 'Oklahoma'),
(2, 3, 4, timestamp '2009-04-25 13:30:00', 'Michigan'),
(1, 5, 5, timestamp '2009-04-25 15:00:00', 'Oklahoma'),
(2, 5, 6, timestamp '2009-04-27 17:00:00', 'New York'),
(3, 4, 7, timestamp '2009-04-28 17:00:00', 'Florida'),
(4, 2, 8, current_timestamp, 'Missouri');
create view t132_giants_games as
select game_number, game_time, game_location
from t132_games
where home_team_number = 2
order by 1,2,3;
select * from t132_giants_games;
create view t132_home_teams_games as
select t.team_number, g.game_number, g.game_time
from "T132_TEAMS" t,
"T132_GAMES" g
where t.team_number = g.home_team_number
order by 1, game_number, game_time;
select team_number, game_number from t132_home_teams_games;
create sequence t132_team_number_sequence;
-- revoke show prvilege from PUBLIC
get privileges on component sql_operations for "PUBLIC";
revoke component privilege "SHOW" on sql_operations from "PUBLIC";
get privileges on component sql_operations for "PUBLIC";
-- DB__ROOT has all privileges
obey TEST132(show_objects);
-- sql_user1 owns some of the objects but not all
changeuser sql_user1;
obey TEST132(show_objects);
-- sql_user2 get privileges through DB__ROOTROLE role SHOW privilege
-- first illustrate that sql_user2 has no privileges
changeuser sql_user2;
obey TEST132(show_objects);
changeuser db__root;
grant role DB__ROOTROLE to sql_user2;
-- now sql_user2 has privileges with the grant
changeuser sql_user2;
obey TEST132(show_objects);
changeuser db__root;
revoke role DB__ROOTROLE from sql_user2;
-- sql_user3 gets some privileges through SELECT grant
set schema t132sch;
grant SELECT on t132_teams to sql_user3;
changeuser sql_user3;
obey TEST132(show_objects);
changeuser db__root;
set schema t132sch;
revoke select on t132_teams from sql_user3;
-- regrant the show privs - everyone has privs
get privileges on component sql_operations for "PUBLIC";
grant component privilege "SHOW" on sql_operations to "PUBLIC";
get privileges on component sql_operations for "PUBLIC";
changeuser sql_user1;
obey TEST132(show_objects);
changeuser db__root;
set schema t132sch;
drop table t132_teams cascade;
drop table t132_games cascade;
drop sequence t132_team_number_sequence;
?section show_objects
set schema t132sch;
cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';
showddl t132_games;
showddl t132_teams;
showddl t132_giants_games;
showddl t132_home_teams_games;
showddl sequence t132_team_number_sequence;
invoke t132_games;
invoke t132_teams;
invoke t132_giants_games;
invoke t132_home_teams_games;
?section test_stats
-- =================================================================
-- run tests to make sure users that update statistics have correct
-- privileges. To update stats, you must:
-- be DB__ROOT
-- be table owner
-- have SELECT privilege
-- have the MANAGE_STATISTICS privilege (DB__ROOTROLE has priv)
-- =================================================================
set schema t132sch;
get tables, match '%T132%';
create table t132t1 (c1 int, c2 int);
create table t132t2 (c1 int, c2 int) attribute by sql_user1;
insert into t132t1 values (1,1), (2,2), (3,3),(4,4), (5,5),(6,6), (7,7),(8,8);
insert into t132t2 values (1,1), (2,2), (3,3),(4,4), (5,5),(6,6), (7,7),(8,8);
get tables, match '%T132%';
select count(*) from t132t1;
select count(*) from t132t2;
-- update statistics as DB__ROOT
obey TEST132(update_stats);
-- DB__ROOTROLE is granted MANAGE_STATISTICS privilege by default
-- first show that sql_user2 cannot perform operations
changeuser sql_user2;
obey TEST132(update_stats);
changeuser db__root;
-- now show privileges after being granted DB__ROOTROLE role
grant role DB__ROOTROLE to sql_user2;
changeuser sql_user2;
obey TEST132(update_stats);
changeuser DB__ROOT;
revoke role DB__ROOTROLE from sql_user2;
-- run as table owner, sql_user1 owns one table
-- update stats only works for t132t2, showstats works on both tables
changeuser sql_user1;
obey TEST132(show_update_stats);
changeuser DB__ROOT;
-- revoke SHOW privilege from public for the next set of tests
get privileges on component sql_operations for "PUBLIC";
revoke component privilege "SHOW" on sql_operations from "PUBLIC";
get privileges on component sql_operations for "PUBLIC";
-- Run with MANAGE_STATISTICS and no SHOW
-- first illustrate that sql_user3 has no privs
get privileges on component sql_operations for sql_user3;
changeuser sql_user3;
obey TEST132(show_update_stats);
changeuser db__root;
-- now show privileges after being granted MANAGE_STATISTICS
grant component privilege MANAGE_STATISTICS on sql_operations to sql_user3;
get privileges on component sql_operations for sql_user3;
changeuser sql_user3;
obey TEST132(show_update_stats);
changeuser db__root;
revoke component privilege MANAGE_STATISTICS on sql_operations from sql_user3;
get privileges on component sql_operations for sql_user3;
-- test showstats
-- showstats should no longer work
changeuser sql_user3;
obey TEST132(show_stats);
changeuser db__root;
-- grant select to allow showstats to work
set schema t132sch;
grant SELECT on t132t1 to sql_user4;
cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';
showddl t132t1;
changeuser sql_user4;
obey TEST132(show_stats);
changeuser db__root;
-- testcase for trafodion-2188 fix
create schema t132sch_private;
set schema t132sch_private;
CREATE TABLE t132t3
( c1 char(12) not null, c2 char(12) not null, c3 char(12) not null,
PRIMARY KEY (C1 ASC))
SALT USING 4 PARTITIONS
ON (C1);
upsert using load into t132t3
select
x1 || x2 || x3 || x4 || x5,
x2 || x4 || x1,
x5 || x3
-- the from clause below creates 100,000 rows, the cross product of
-- 5 copies of { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }
from (values('a'),('b'),('c'),('d'),('e'),('f'),('g'),('h'),('i'),('j')) T(x1)
transpose 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' as x2
transpose 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' as x3
transpose 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' as x4
transpose 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' as x5;
;
select count(*) from t132t3;
grant component privilege MANAGE_STATISTICS on sql_operations to sql_user3;
get privileges on component sql_operations for sql_user3;
changeuser sql_user3;
obey TEST132(update_stats1);
changeuser db__root;
set schema t132sch_private;
revoke component privilege MANAGE_STATISTICS on sql_operations from sql_user3;
cleanup schema t132sch_private;
set schema t132sch;
-- reset
revoke SELECT on t132t1 from sql_user4;
grant component privilege "SHOW" on sql_operations to "PUBLIC";
get privileges on component sql_operations for "PUBLIC";
drop table t132t1;
drop table t132t2;
get tables, match 'T132%';
?section show_update_stats
obey TEST132(update_stats);
obey TEST132(show_stats);
?section update_stats
set schema t132sch;
update statistics for table t132t1 on every column;
update statistics for table t132t2 on every column;
?section update_stats1
set schema t132sch_private;
update statistics for table t132t3 create sample random 10 percent;
?section show_stats
set schema t132sch;
showstats for table t132t1 on every column;
showstats for table t132t2 on every column;