>>obey TEST132(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;

--- SQL operation complete.
>>get libraries;

--- SQL operation complete.
>>get privileges on component sql_operations for "PUBLIC";

Privilege information on Component SQL_OPERATIONS for PUBLIC
============================================================

CREATE_SCHEMA
SHOW

=======================
 2 row(s) returned

--- SQL operation complete.
>>
>>-- succeed: DB__ROOT can create a library
>>obey TEST132(manage_library);
>>
>>set schema t132sch;

--- SQL operation complete.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>create library t132_l1 file 'etest132.dll';

--- SQL operation complete.
>>get libraries in schema t132sch;

Libraries in Schema TRAFODION.T132SCH
=====================================

T132_L1

=======================
 1 row(s) returned

--- SQL operation complete.
>>drop library t132_l1;

--- SQL operation complete.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>
>>
>>-- fail: sql_user1 cannot create a library
>>changeuser sql_user1;
>>obey TEST132(manage_library);
>>
>>set schema t132sch;

--- SQL operation complete.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>create library t132_l1 file 'etest132.dll';

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>drop library t132_l1;

*** ERROR[1389] Object TRAFODION.T132SCH.T132_L1 does not exist in Trafodion.

--- SQL operation failed with errors.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>
>>changeuser db__root;
>>
>>-- succeed: grant DB__ROOTROLE to sql_user1
>>grant role DB__ROOTROLE to sql_user1;

--- SQL operation complete.
>>changeuser sql_user1;
>>obey TEST132(manage_library);
>>
>>set schema t132sch;

--- SQL operation complete.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>create library t132_l1 file 'etest132.dll';

--- SQL operation complete.
>>get libraries in schema t132sch;

Libraries in Schema TRAFODION.T132SCH
=====================================

T132_L1

=======================
 1 row(s) returned

--- SQL operation complete.
>>drop library t132_l1;

--- SQL operation complete.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>
>>changeuser DB__ROOT;
>>
>>-- fail: just grant the create privilege
>>grant component privilege CREATE_LIBRARY on sql_operations to sql_user2;

--- SQL operation complete.
>>changeuser sql_user2;
>>obey TEST132(manage_library);
>>
>>set schema t132sch;

--- SQL operation complete.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>create library t132_l1 file 'etest132.dll';

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>drop library t132_l1;

*** ERROR[1389] Object TRAFODION.T132SCH.T132_L1 does not exist in Trafodion.

--- SQL operation failed with errors.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>
>>changeuser DB__ROOT;
>>
>>-- succeed: now grant the manage_library privilege
>>grant component privilege MANAGE_LIBRARY on sql_operations to sql_user2;

--- SQL operation complete.
>>get privileges on component sql_operation for sql_user2;

--- SQL operation complete.
>>changeuser sql_user2;
>>obey TEST132(manage_library);
>>
>>set schema t132sch;

--- SQL operation complete.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>create library t132_l1 file 'etest132.dll';

--- SQL operation complete.
>>get libraries in schema t132sch;

Libraries in Schema TRAFODION.T132SCH
=====================================

T132_L1

=======================
 1 row(s) returned

--- SQL operation complete.
>>drop library t132_l1;

--- SQL operation complete.
>>get libraries in schema t132sch;

--- SQL operation complete.
>>
>>changeuser DB__ROOT;
>>
>>-- reset 
>>revoke role DB__ROOTROLE from sql_user1;

--- SQL operation complete.
>>revoke component privilege MANAGE_LIBRARY on sql_operations from sql_user2;

--- SQL operation complete.
>>revoke component privilege CREATE_LIBRARY on sql_operations from sql_user2;

--- SQL operation complete.
>>get privileges on component sql_operations for "PUBLIC";

Privilege information on Component SQL_OPERATIONS for PUBLIC
============================================================

CREATE_SCHEMA
SHOW

=======================
 2 row(s) returned

--- SQL operation complete.
>>
>>obey TEST132(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;

--- SQL operation complete.
>>--set parserflags 131072;
>>--cqd DDL_TRANSACTIONS 'ON';
>>
>>get tables, match '%T132%';

--- SQL operation complete.
>>
>>create table t132t1 (c1 int not null primary key, c2 int);

--- SQL operation complete.
>>create index t132t1_ndx1 on t132t1 (c2) no populate;

--- SQL operation complete.
>>create table t132t2 (c1 int not null primary key, c2 int)
+>  attribute by sql_user1;

--- SQL operation complete.
>>create index t132t2_ndx1 on t132t2(c2) no populate;

--- SQL operation complete.
>>
>>insert into t132t1 values (1,1), (2,2), (3,3),(4,4), (5,5),(6,6), (7,7),(8,8);

--- 8 row(s) inserted.
>>insert into t132t2 values (1,1), (2,2), (3,3),(4,4), (5,5),(6,6), (7,7),(8,8);

--- 8 row(s) inserted.
>>
>>get tables, match '%T132%';

Tables in Schema TRAFODION.T132SCH
==================================

T132T1
T132T2

=======================
 2 row(s) returned

--- SQL operation complete.
>>cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';

--- SQL operation complete.
>>showddl t132t1;

CREATE TABLE TRAFODION.T132SCH.T132T1
  (
    C1                               INT NO DEFAULT NOT NULL NOT DROPPABLE
  , C2                               INT DEFAULT NULL
  , PRIMARY KEY (C1 ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132T1 TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132t2;

CREATE TABLE TRAFODION.T132SCH.T132T2
  (
    C1                               INT NO DEFAULT NOT NULL NOT DROPPABLE
  , C2                               INT DEFAULT NULL
  , PRIMARY KEY (C1 ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132T2 TO SQL_USER1 WITH GRANT OPTION;

--- SQL operation complete.
>>
>>-- DB__ROOT can populate indexes
>>obey TEST132(populate_index);
>>set schema t132sch;

--- SQL operation complete.
>>
>>populate index t132t1_ndx1 on t132t1;

--- SQL operation complete.
>>populate index t132t2_ndx1 on t132t2;

--- SQL operation complete.
>>
>>obey TEST132(popindex_check_reset);
>>set schema t132sch;

--- SQL operation complete.
>>set parserflags 1;

--- SQL operation complete.
>>
>>select count(*) from table (index_table t132t1_ndx1);

(EXPR)              
--------------------

                   8

--- 1 row(s) selected.
>>select count(*) from table (index_table t132t2_ndx1);

(EXPR)              
--------------------

                   8

--- 1 row(s) selected.
>>
>>cleanup index t132t1_ndx1;

--- SQL operation complete.
>>create index t132t1_ndx1 on t132t1 (c2) no populate;

--- SQL operation complete.
>>cleanup index t132t2_ndx1;

--- SQL operation complete.
>>create index t132t2_ndx1 on t132t2 (c2) no populate;

--- SQL operation complete.
>>
>>
>>-- 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);
>>set schema t132sch;

--- SQL operation complete.
>>
>>populate index t132t1_ndx1 on t132t1;

*** ERROR[4481] The user does not have SELECT privilege on table or view TRAFODION.T132SCH.T132T1.

*** ERROR[4481] The user does not have INSERT privilege on table or view TRAFODION.T132SCH.T132T1.

--- SQL operation failed with errors.
>>populate index t132t2_ndx1 on t132t2;

--- SQL operation complete.
>>
>>changeuser db__root;
>>obey TEST132(popindex_check_reset);
>>set schema t132sch;

--- SQL operation complete.
>>set parserflags 1;

--- SQL operation complete.
>>
>>select count(*) from table (index_table t132t1_ndx1);

(EXPR)              
--------------------

                   0

--- 1 row(s) selected.
>>select count(*) from table (index_table t132t2_ndx1);

(EXPR)              
--------------------

                   8

--- 1 row(s) selected.
>>
>>cleanup index t132t1_ndx1;

--- SQL operation complete.
>>create index t132t1_ndx1 on t132t1 (c2) no populate;

--- SQL operation complete.
>>cleanup index t132t2_ndx1;

--- SQL operation complete.
>>create index t132t2_ndx1 on t132t2 (c2) no populate;

--- SQL operation complete.
>>
>>
>>-- if user belongs to DB__ROOTROLE, DB__ROOTROLE does not have DML privileges
>>grant role DB__ROOTROLE to sql_user2;

--- SQL operation complete.
>>changeuser sql_user2;
>>obey TEST132(populate_index);
>>set schema t132sch;

--- SQL operation complete.
>>
>>populate index t132t1_ndx1 on t132t1;

*** ERROR[4481] The user does not have SELECT privilege on table or view TRAFODION.T132SCH.T132T1.

*** ERROR[4481] The user does not have INSERT privilege on table or view TRAFODION.T132SCH.T132T1.

--- SQL operation failed with errors.
>>populate index t132t2_ndx1 on t132t2;

*** ERROR[4481] The user does not have SELECT privilege on table or view TRAFODION.T132SCH.T132T2.

*** ERROR[4481] The user does not have INSERT privilege on table or view TRAFODION.T132SCH.T132T2.

--- SQL operation failed with errors.
>>
>>changeuser db__root;
>>obey TEST132(popindex_check_reset);
>>set schema t132sch;

--- SQL operation complete.
>>set parserflags 1;

--- SQL operation complete.
>>
>>select count(*) from table (index_table t132t1_ndx1);

(EXPR)              
--------------------

                   0

--- 1 row(s) selected.
>>select count(*) from table (index_table t132t2_ndx1);

(EXPR)              
--------------------

                   0

--- 1 row(s) selected.
>>
>>cleanup index t132t1_ndx1;

--- SQL operation complete.
>>create index t132t1_ndx1 on t132t1 (c2) no populate;

--- SQL operation complete.
>>cleanup index t132t2_ndx1;

--- SQL operation complete.
>>create index t132t2_ndx1 on t132t2 (c2) no populate;

--- SQL operation complete.
>>
>>revoke role DB__ROOTROLE from sql_user2;

--- SQL operation complete.
>>
>>-- sql_user3 requires both SELECT and INSERT privileges
>>-- only t132t2 has granted both privileges
>>grant SELECT on t132t1 to sql_user3;

--- SQL operation complete.
>>grant SELECT, INSERT on t132t2 to sql_user3 by sql_user1;

--- SQL operation complete.
>>changeuser sql_user3;
>>obey TEST132(populate_index);
>>set schema t132sch;

--- SQL operation complete.
>>
>>populate index t132t1_ndx1 on t132t1;

*** ERROR[4481] The user does not have INSERT privilege on table or view TRAFODION.T132SCH.T132T1.

--- SQL operation failed with errors.
>>populate index t132t2_ndx1 on t132t2;

--- SQL operation complete.
>>
>>changeuser db__root;
>>obey TEST132(popindex_check_reset);
>>set schema t132sch;

--- SQL operation complete.
>>set parserflags 1;

--- SQL operation complete.
>>
>>select count(*) from table (index_table t132t1_ndx1);

(EXPR)              
--------------------

                   0

--- 1 row(s) selected.
>>select count(*) from table (index_table t132t2_ndx1);

(EXPR)              
--------------------

                   8

--- 1 row(s) selected.
>>
>>cleanup index t132t1_ndx1;

--- SQL operation complete.
>>create index t132t1_ndx1 on t132t1 (c2) no populate;

--- SQL operation complete.
>>cleanup index t132t2_ndx1;

--- SQL operation complete.
>>create index t132t2_ndx1 on t132t2 (c2) no populate;

--- SQL operation complete.
>>
>>
>>-- reset
>>drop table t132t1 cascade;

--- SQL operation complete.
>>drop table t132t2 cascade;

--- SQL operation complete.
>>get tables, match 'T132%';

--- SQL operation complete.
>>
>>obey TEST132(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;

--- SQL operation complete.
>>
>>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
+>   )
+>  ;

--- SQL operation complete.
>>
>>alter table t132_teams add constraint valid_team_no check (team_number > 0);

--- SQL operation complete.
>>
>>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');

--- 5 row(s) inserted.
>>
>>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
+>  ;

--- SQL operation complete.
>>create index t132_home_games on t132_games (home_team_number);

--- SQL operation complete.
>>
>>alter table t132_games add constraint valid_game_number check (game_number > 0);

--- SQL operation complete.
>>
>>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');

--- 8 row(s) inserted.
>>
>>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;

--- SQL operation complete.
>>select * from t132_giants_games;

GAME_NUMBER  GAME_TIME                   GAME_LOCATION
-----------  --------------------------  --------------------------------------------------

          4  2009-04-25 13:30:00.000000  Michigan                                          
          6  2009-04-27 17:00:00.000000  New York                                          

--- 2 row(s) selected.
>>
>>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;

--- SQL operation complete.
>>select team_number, game_number from t132_home_teams_games;

TEAM_NUMBER  GAME_NUMBER
-----------  -----------

          1            1
          1            2
          1            3
          1            5
          2            4
          2            6
          3            7
          4            8

--- 8 row(s) selected.
>>
>>create sequence t132_team_number_sequence;

--- SQL operation complete.
>>
>>-- revoke show prvilege from PUBLIC
>>get privileges on component sql_operations for "PUBLIC";

Privilege information on Component SQL_OPERATIONS for PUBLIC
============================================================

CREATE_SCHEMA
SHOW

=======================
 2 row(s) returned

--- SQL operation complete.
>>revoke component privilege "SHOW" on sql_operations from "PUBLIC";

--- SQL operation complete.
>>get privileges on component sql_operations for "PUBLIC";

Privilege information on Component SQL_OPERATIONS for PUBLIC
============================================================

CREATE_SCHEMA

=======================
 1 row(s) returned

--- SQL operation complete.
>>
>>-- DB__ROOT has all privileges
>>obey TEST132(show_objects);
>>
>>set schema t132sch;

--- SQL operation complete.
>>cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';

--- SQL operation complete.
>>
>>showddl t132_games;

CREATE TABLE TRAFODION.T132SCH.T132_GAMES
  (
    HOME_TEAM_NUMBER                 INT NO DEFAULT NOT NULL NOT DROPPABLE
  , VISITOR_TEAM_NUMBER              INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , PRIMARY KEY (GAME_NUMBER ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

CREATE INDEX T132_HOME_GAMES ON TRAFODION.T132SCH.T132_GAMES
  (
    HOME_TEAM_NUMBER ASC
  )
;

ALTER TABLE TRAFODION.T132SCH.T132_GAMES ADD CONSTRAINT
  TRAFODION.T132SCH.VALID_GAME_NUMBER CHECK
  (TRAFODION.T132SCH.T132_GAMES.GAME_NUMBER > 0)

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_GAMES TO SQL_USER1 WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_teams;

CREATE TABLE TRAFODION.T132SCH.T132_TEAMS
  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_NAME                        CHAR(20) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT                     VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT_NUMBER              CHAR(10) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , PRIMARY KEY (TEAM_NUMBER ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

ALTER TABLE TRAFODION.T132SCH.T132_TEAMS ADD CONSTRAINT
  TRAFODION.T132SCH.VALID_TEAM_NO CHECK
  (TRAFODION.T132SCH.T132_TEAMS.TEAM_NUMBER > 0)

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_TEAMS TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_giants_games;

CREATE VIEW TRAFODION.T132SCH.T132_GIANTS_GAMES AS
  SELECT TRAFODION.T132SCH.T132_GAMES.GAME_NUMBER,
    TRAFODION.T132SCH.T132_GAMES.GAME_TIME,
    TRAFODION.T132SCH.T132_GAMES.GAME_LOCATION FROM
    TRAFODION.T132SCH.T132_GAMES WHERE
    TRAFODION.T132SCH.T132_GAMES.HOME_TEAM_NUMBER = 2 ORDER BY 1, 2, 3 ;

-- GRANT SELECT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_GIANTS_GAMES TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_home_teams_games;

CREATE VIEW TRAFODION.T132SCH.T132_HOME_TEAMS_GAMES AS
  SELECT T.TEAM_NUMBER, G.GAME_NUMBER, G.GAME_TIME FROM
    TRAFODION.T132SCH.T132_TEAMS T, TRAFODION.T132SCH.T132_GAMES G WHERE
    T.TEAM_NUMBER = G.HOME_TEAM_NUMBER ORDER BY 1, G.GAME_NUMBER, G.GAME_TIME
    ;

-- GRANT SELECT, REFERENCES ON TRAFODION.T132SCH.T132_HOME_TEAMS_GAMES TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl sequence t132_team_number_sequence;

CREATE SEQUENCE TRAFODION.T132SCH.T132_TEAM_NUMBER_SEQUENCE
  START WITH 1 /* NEXT AVAILABLE VALUE 1 */
  INCREMENT BY 1
  MAXVALUE 9223372036854775806
  MINVALUE 1
  CACHE 25
  NO CYCLE
  LARGEINT
;

-- GRANT USAGE ON SEQUENCE TRAFODION.T132SCH.T132_TEAM_NUMBER_SEQUENCE TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>
>>invoke t132_games;

-- Definition of Trafodion table TRAFODION.T132SCH.T132_GAMES
-- Definition current  Sun Oct 22 16:08:56 2017

  (
    HOME_TEAM_NUMBER                 INT NO DEFAULT NOT NULL NOT DROPPABLE
  , VISITOR_TEAM_NUMBER              INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )
  PRIMARY KEY (GAME_NUMBER ASC)

--- SQL operation complete.
>>invoke t132_teams;

-- Definition of Trafodion table TRAFODION.T132SCH.T132_TEAMS
-- Definition current  Sun Oct 22 16:08:59 2017

  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_NAME                        CHAR(20) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT                     VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT_NUMBER              CHAR(10) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )
  PRIMARY KEY (TEAM_NUMBER ASC)

--- SQL operation complete.
>>invoke t132_giants_games;

-- Definition of Trafodion view TRAFODION.T132SCH.T132_GIANTS_GAMES
-- Definition current  Sun Oct 22 16:09:02 2017

  (
    GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )

--- SQL operation complete.
>>invoke t132_home_teams_games;

-- Definition of Trafodion view TRAFODION.T132SCH.T132_HOME_TEAMS_GAMES
-- Definition current  Sun Oct 22 16:09:05 2017

  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  )

--- SQL operation complete.
>>
>>
>>-- sql_user1 owns some of the objects but not all
>>changeuser sql_user1;
>>obey TEST132(show_objects);
>>
>>set schema t132sch;

--- SQL operation complete.
>>cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';

--- SQL operation complete.
>>
>>showddl t132_games;

CREATE TABLE TRAFODION.T132SCH.T132_GAMES
  (
    HOME_TEAM_NUMBER                 INT NO DEFAULT NOT NULL NOT DROPPABLE
  , VISITOR_TEAM_NUMBER              INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , PRIMARY KEY (GAME_NUMBER ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

CREATE INDEX T132_HOME_GAMES ON TRAFODION.T132SCH.T132_GAMES
  (
    HOME_TEAM_NUMBER ASC
  )
;

ALTER TABLE TRAFODION.T132SCH.T132_GAMES ADD CONSTRAINT
  TRAFODION.T132SCH.VALID_GAME_NUMBER CHECK
  (TRAFODION.T132SCH.T132_GAMES.GAME_NUMBER > 0)

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_GAMES TO SQL_USER1 WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_teams;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl t132_giants_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl t132_home_teams_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl sequence t132_team_number_sequence;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>
>>invoke t132_games;

-- Definition of Trafodion table TRAFODION.T132SCH.T132_GAMES
-- Definition current  Sun Oct 22 16:09:18 2017

  (
    HOME_TEAM_NUMBER                 INT NO DEFAULT NOT NULL NOT DROPPABLE
  , VISITOR_TEAM_NUMBER              INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )
  PRIMARY KEY (GAME_NUMBER ASC)

--- SQL operation complete.
>>invoke t132_teams;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>invoke t132_giants_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>invoke t132_home_teams_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>
>>
>>-- 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);
>>
>>set schema t132sch;

--- SQL operation complete.
>>cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';

--- SQL operation complete.
>>
>>showddl t132_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl t132_teams;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl t132_giants_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl t132_home_teams_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl sequence t132_team_number_sequence;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>
>>invoke t132_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>invoke t132_teams;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>invoke t132_giants_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>invoke t132_home_teams_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>
>>changeuser db__root;
>>grant role DB__ROOTROLE to sql_user2;

--- SQL operation complete.
>>
>>-- now sql_user2 has privileges with the grant
>>changeuser sql_user2;
>>obey TEST132(show_objects);
>>
>>set schema t132sch;

--- SQL operation complete.
>>cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';

--- SQL operation complete.
>>
>>showddl t132_games;

CREATE TABLE TRAFODION.T132SCH.T132_GAMES
  (
    HOME_TEAM_NUMBER                 INT NO DEFAULT NOT NULL NOT DROPPABLE
  , VISITOR_TEAM_NUMBER              INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , PRIMARY KEY (GAME_NUMBER ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

CREATE INDEX T132_HOME_GAMES ON TRAFODION.T132SCH.T132_GAMES
  (
    HOME_TEAM_NUMBER ASC
  )
;

ALTER TABLE TRAFODION.T132SCH.T132_GAMES ADD CONSTRAINT
  TRAFODION.T132SCH.VALID_GAME_NUMBER CHECK
  (TRAFODION.T132SCH.T132_GAMES.GAME_NUMBER > 0)

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_GAMES TO SQL_USER1 WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_teams;

CREATE TABLE TRAFODION.T132SCH.T132_TEAMS
  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_NAME                        CHAR(20) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT                     VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT_NUMBER              CHAR(10) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , PRIMARY KEY (TEAM_NUMBER ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

ALTER TABLE TRAFODION.T132SCH.T132_TEAMS ADD CONSTRAINT
  TRAFODION.T132SCH.VALID_TEAM_NO CHECK
  (TRAFODION.T132SCH.T132_TEAMS.TEAM_NUMBER > 0)

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_TEAMS TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_giants_games;

CREATE VIEW TRAFODION.T132SCH.T132_GIANTS_GAMES AS
  SELECT TRAFODION.T132SCH.T132_GAMES.GAME_NUMBER,
    TRAFODION.T132SCH.T132_GAMES.GAME_TIME,
    TRAFODION.T132SCH.T132_GAMES.GAME_LOCATION FROM
    TRAFODION.T132SCH.T132_GAMES WHERE
    TRAFODION.T132SCH.T132_GAMES.HOME_TEAM_NUMBER = 2 ORDER BY 1, 2, 3 ;

-- GRANT SELECT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_GIANTS_GAMES TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_home_teams_games;

CREATE VIEW TRAFODION.T132SCH.T132_HOME_TEAMS_GAMES AS
  SELECT T.TEAM_NUMBER, G.GAME_NUMBER, G.GAME_TIME FROM
    TRAFODION.T132SCH.T132_TEAMS T, TRAFODION.T132SCH.T132_GAMES G WHERE
    T.TEAM_NUMBER = G.HOME_TEAM_NUMBER ORDER BY 1, G.GAME_NUMBER, G.GAME_TIME
    ;

-- GRANT SELECT, REFERENCES ON TRAFODION.T132SCH.T132_HOME_TEAMS_GAMES TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl sequence t132_team_number_sequence;

CREATE SEQUENCE TRAFODION.T132SCH.T132_TEAM_NUMBER_SEQUENCE
  START WITH 1 /* NEXT AVAILABLE VALUE 1 */
  INCREMENT BY 1
  MAXVALUE 9223372036854775806
  MINVALUE 1
  CACHE 25
  NO CYCLE
  LARGEINT
;

-- GRANT USAGE ON SEQUENCE TRAFODION.T132SCH.T132_TEAM_NUMBER_SEQUENCE TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>
>>invoke t132_games;

-- Definition of Trafodion table TRAFODION.T132SCH.T132_GAMES
-- Definition current  Sun Oct 22 16:09:50 2017

  (
    HOME_TEAM_NUMBER                 INT NO DEFAULT NOT NULL NOT DROPPABLE
  , VISITOR_TEAM_NUMBER              INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )
  PRIMARY KEY (GAME_NUMBER ASC)

--- SQL operation complete.
>>invoke t132_teams;

-- Definition of Trafodion table TRAFODION.T132SCH.T132_TEAMS
-- Definition current  Sun Oct 22 16:09:50 2017

  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_NAME                        CHAR(20) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT                     VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT_NUMBER              CHAR(10) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )
  PRIMARY KEY (TEAM_NUMBER ASC)

--- SQL operation complete.
>>invoke t132_giants_games;

-- Definition of Trafodion view TRAFODION.T132SCH.T132_GIANTS_GAMES
-- Definition current  Sun Oct 22 16:09:50 2017

  (
    GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )

--- SQL operation complete.
>>invoke t132_home_teams_games;

-- Definition of Trafodion view TRAFODION.T132SCH.T132_HOME_TEAMS_GAMES
-- Definition current  Sun Oct 22 16:09:50 2017

  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  )

--- SQL operation complete.
>>
>>changeuser db__root;
>>revoke role DB__ROOTROLE from sql_user2;

--- SQL operation complete.
>>
>>-- sql_user3 gets some privileges through SELECT grant
>>set schema t132sch;

--- SQL operation complete.
>>grant SELECT on t132_teams to sql_user3;

--- SQL operation complete.
>>changeuser sql_user3;
>>obey TEST132(show_objects);
>>
>>set schema t132sch;

--- SQL operation complete.
>>cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';

--- SQL operation complete.
>>
>>showddl t132_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl t132_teams;

CREATE TABLE TRAFODION.T132SCH.T132_TEAMS
  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_NAME                        CHAR(20) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT                     VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT_NUMBER              CHAR(10) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , PRIMARY KEY (TEAM_NUMBER ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

ALTER TABLE TRAFODION.T132SCH.T132_TEAMS ADD CONSTRAINT
  TRAFODION.T132SCH.VALID_TEAM_NO CHECK
  (TRAFODION.T132SCH.T132_TEAMS.TEAM_NUMBER > 0)

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_TEAMS TO DB__ROOT WITH GRANT OPTION;
  GRANT SELECT ON TRAFODION.T132SCH.T132_TEAMS TO SQL_USER3;

--- SQL operation complete.
>>showddl t132_giants_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl t132_home_teams_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>showddl sequence t132_team_number_sequence;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>
>>invoke t132_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>invoke t132_teams;

-- Definition of Trafodion table TRAFODION.T132SCH.T132_TEAMS
-- Definition current  Sun Oct 22 16:10:13 2017

  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_NAME                        CHAR(20) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT                     VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT_NUMBER              CHAR(10) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )
  PRIMARY KEY (TEAM_NUMBER ASC)

--- SQL operation complete.
>>invoke t132_giants_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>invoke t132_home_teams_games;

*** ERROR[1017] You are not authorized to perform this operation.

--- SQL operation failed with errors.
>>
>>changeuser db__root;
>>set schema t132sch;

--- SQL operation complete.
>>revoke select on t132_teams from sql_user3;

--- SQL operation complete.
>>
>>-- regrant the show privs - everyone has privs
>>get privileges on component sql_operations for "PUBLIC";

Privilege information on Component SQL_OPERATIONS for PUBLIC
============================================================

CREATE_SCHEMA

=======================
 1 row(s) returned

--- SQL operation complete.
>>grant component privilege "SHOW" on sql_operations to "PUBLIC";

--- SQL operation complete.
>>get privileges on component sql_operations for "PUBLIC";

Privilege information on Component SQL_OPERATIONS for PUBLIC
============================================================

CREATE_SCHEMA
SHOW

=======================
 2 row(s) returned

--- SQL operation complete.
>>changeuser sql_user1;
>>obey TEST132(show_objects);
>>
>>set schema t132sch;

--- SQL operation complete.
>>cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';

--- SQL operation complete.
>>
>>showddl t132_games;

CREATE TABLE TRAFODION.T132SCH.T132_GAMES
  (
    HOME_TEAM_NUMBER                 INT NO DEFAULT NOT NULL NOT DROPPABLE
  , VISITOR_TEAM_NUMBER              INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , PRIMARY KEY (GAME_NUMBER ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

CREATE INDEX T132_HOME_GAMES ON TRAFODION.T132SCH.T132_GAMES
  (
    HOME_TEAM_NUMBER ASC
  )
;

ALTER TABLE TRAFODION.T132SCH.T132_GAMES ADD CONSTRAINT
  TRAFODION.T132SCH.VALID_GAME_NUMBER CHECK
  (TRAFODION.T132SCH.T132_GAMES.GAME_NUMBER > 0)

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_GAMES TO SQL_USER1 WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_teams;

CREATE TABLE TRAFODION.T132SCH.T132_TEAMS
  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_NAME                        CHAR(20) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT                     VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT_NUMBER              CHAR(10) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , PRIMARY KEY (TEAM_NUMBER ASC)
  )
 ATTRIBUTES ALIGNED FORMAT
;

ALTER TABLE TRAFODION.T132SCH.T132_TEAMS ADD CONSTRAINT
  TRAFODION.T132SCH.VALID_TEAM_NO CHECK
  (TRAFODION.T132SCH.T132_TEAMS.TEAM_NUMBER > 0)

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_TEAMS TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_giants_games;

CREATE VIEW TRAFODION.T132SCH.T132_GIANTS_GAMES AS
  SELECT TRAFODION.T132SCH.T132_GAMES.GAME_NUMBER,
    TRAFODION.T132SCH.T132_GAMES.GAME_TIME,
    TRAFODION.T132SCH.T132_GAMES.GAME_LOCATION FROM
    TRAFODION.T132SCH.T132_GAMES WHERE
    TRAFODION.T132SCH.T132_GAMES.HOME_TEAM_NUMBER = 2 ORDER BY 1, 2, 3 ;

-- GRANT SELECT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132_GIANTS_GAMES TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl t132_home_teams_games;

CREATE VIEW TRAFODION.T132SCH.T132_HOME_TEAMS_GAMES AS
  SELECT T.TEAM_NUMBER, G.GAME_NUMBER, G.GAME_TIME FROM
    TRAFODION.T132SCH.T132_TEAMS T, TRAFODION.T132SCH.T132_GAMES G WHERE
    T.TEAM_NUMBER = G.HOME_TEAM_NUMBER ORDER BY 1, G.GAME_NUMBER, G.GAME_TIME
    ;

-- GRANT SELECT, REFERENCES ON TRAFODION.T132SCH.T132_HOME_TEAMS_GAMES TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>showddl sequence t132_team_number_sequence;

CREATE SEQUENCE TRAFODION.T132SCH.T132_TEAM_NUMBER_SEQUENCE
  START WITH 1 /* NEXT AVAILABLE VALUE 1 */
  INCREMENT BY 1
  MAXVALUE 9223372036854775806
  MINVALUE 1
  CACHE 25
  NO CYCLE
  LARGEINT
;

-- GRANT USAGE ON SEQUENCE TRAFODION.T132SCH.T132_TEAM_NUMBER_SEQUENCE TO DB__ROOT WITH GRANT OPTION;

--- SQL operation complete.
>>
>>invoke t132_games;

-- Definition of Trafodion table TRAFODION.T132SCH.T132_GAMES
-- Definition current  Sun Oct 22 16:10:48 2017

  (
    HOME_TEAM_NUMBER                 INT NO DEFAULT NOT NULL NOT DROPPABLE
  , VISITOR_TEAM_NUMBER              INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )
  PRIMARY KEY (GAME_NUMBER ASC)

--- SQL operation complete.
>>invoke t132_teams;

-- Definition of Trafodion table TRAFODION.T132SCH.T132_TEAMS
-- Definition current  Sun Oct 22 16:10:48 2017

  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_NAME                        CHAR(20) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT                     VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  , TEAM_CONTACT_NUMBER              CHAR(10) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )
  PRIMARY KEY (TEAM_NUMBER ASC)

--- SQL operation complete.
>>invoke t132_giants_games;

-- Definition of Trafodion view TRAFODION.T132SCH.T132_GIANTS_GAMES
-- Definition current  Sun Oct 22 16:10:48 2017

  (
    GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  , GAME_LOCATION                    VARCHAR(50) CHARACTER SET ISO88591 COLLATE
      DEFAULT NO DEFAULT NOT NULL NOT DROPPABLE
  )

--- SQL operation complete.
>>invoke t132_home_teams_games;

-- Definition of Trafodion view TRAFODION.T132SCH.T132_HOME_TEAMS_GAMES
-- Definition current  Sun Oct 22 16:10:49 2017

  (
    TEAM_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_NUMBER                      INT NO DEFAULT NOT NULL NOT DROPPABLE
  , GAME_TIME                        TIMESTAMP(6) NO DEFAULT NOT NULL NOT
      DROPPABLE
  )

--- SQL operation complete.
>>
>>
>>changeuser db__root;
>>set schema t132sch;

--- SQL operation complete.
>>drop table t132_teams cascade;

--- SQL operation complete.
>>drop table t132_games cascade;

--- SQL operation complete.
>>drop sequence t132_team_number_sequence;

--- SQL operation complete.
>>
>>obey TEST132(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;

--- SQL operation complete.
>>get tables, match '%T132%';

--- SQL operation complete.
>>
>>create table t132t1 (c1 int, c2 int);

--- SQL operation complete.
>>create table t132t2 (c1 int, c2 int) attribute by sql_user1;

--- SQL operation complete.
>>insert into t132t1 values (1,1), (2,2), (3,3),(4,4), (5,5),(6,6), (7,7),(8,8);

--- 8 row(s) inserted.
>>insert into t132t2 values (1,1), (2,2), (3,3),(4,4), (5,5),(6,6), (7,7),(8,8);

--- 8 row(s) inserted.
>>
>>get tables, match '%T132%';

Tables in Schema TRAFODION.T132SCH
==================================

T132T1
T132T2

=======================
 2 row(s) returned

--- SQL operation complete.
>>select count(*) from t132t1;

(EXPR)              
--------------------

                   8

--- 1 row(s) selected.
>>select count(*) from t132t2;

(EXPR)              
--------------------

                   8

--- 1 row(s) selected.
>>
>>-- update statistics as DB__ROOT
>>obey TEST132(update_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>update statistics for table t132t1 on every column;

--- SQL operation complete.
>>update statistics for table t132t2 on every column;

--- SQL operation complete.
>>
>>
>>-- DB__ROOTROLE is granted MANAGE_STATISTICS privilege by default
>>-- first show that sql_user2 cannot perform operations
>>changeuser sql_user2;
>>obey TEST132(update_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>update statistics for table t132t1 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T1.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T1.

--- SQL operation failed with errors.
>>update statistics for table t132t2 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T2.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T2.

--- SQL operation failed with errors.
>>
>>changeuser db__root;
>>
>>-- now show privileges after being granted DB__ROOTROLE role
>>grant role DB__ROOTROLE to sql_user2;

--- SQL operation complete.
>>changeuser sql_user2;
>>obey TEST132(update_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>update statistics for table t132t1 on every column;

--- SQL operation complete.
>>update statistics for table t132t2 on every column;

--- SQL operation complete.
>>
>>changeuser DB__ROOT;
>>revoke role DB__ROOTROLE from sql_user2;

--- SQL operation complete.
>>
>>-- 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);
>>obey TEST132(update_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>update statistics for table t132t1 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T1.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T1.

--- SQL operation failed with errors.
>>update statistics for table t132t2 on every column;

--- SQL operation complete.
>>
>>obey TEST132(show_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>showstats for table t132t1 on every column;

Histogram data for Table TRAFODION.T132SCH.T132T1
Table ID: 3703791059232936033

   Hist ID # Ints    Rowcount         UEC Colname(s)
========== ====== =========== =========== ===========================
1800623295      8           8           8 SYSKEY
1800623288      8           8           8 C1
1800623285      8           8           8 C2


--- SQL operation complete.
>>showstats for table t132t2 on every column;

Histogram data for Table TRAFODION.T132SCH.T132T2
Table ID: 3703791059232936201

   Hist ID # Ints    Rowcount         UEC Colname(s)
========== ====== =========== =========== ===========================
1824908698      8           8           8 SYSKEY
1824908693      8           8           8 C1
1824908688      8           8           8 C2


--- SQL operation complete.
>>
>>changeuser DB__ROOT;
>>
>>-- revoke SHOW privilege from public for the next set of tests
>>get privileges on component sql_operations for "PUBLIC";

Privilege information on Component SQL_OPERATIONS for PUBLIC
============================================================

CREATE_SCHEMA
SHOW

=======================
 2 row(s) returned

--- SQL operation complete.
>>revoke component privilege "SHOW" on sql_operations from "PUBLIC";

--- SQL operation complete.
>>get privileges on component sql_operations for "PUBLIC";

Privilege information on Component SQL_OPERATIONS for PUBLIC
============================================================

CREATE_SCHEMA

=======================
 1 row(s) returned

--- SQL operation complete.
>>
>>-- Run with MANAGE_STATISTICS and no SHOW
>>-- first illustrate that sql_user3 has no privs
>>get privileges on component sql_operations for sql_user3;

--- SQL operation complete.
>>changeuser sql_user3;
>>obey TEST132(show_update_stats);
>>obey TEST132(update_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>update statistics for table t132t1 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T1.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T1.

--- SQL operation failed with errors.
>>update statistics for table t132t2 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T2.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T2.

--- SQL operation failed with errors.
>>
>>obey TEST132(show_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>showstats for table t132t1 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T1.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T1.

--- SQL operation failed with errors.
>>showstats for table t132t2 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T2.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T2.

--- SQL operation failed with errors.
>>
>>changeuser db__root;
>>
>>-- now show privileges after being granted MANAGE_STATISTICS
>>grant component privilege MANAGE_STATISTICS on sql_operations to sql_user3;

--- SQL operation complete.
>>get privileges on component sql_operations for sql_user3;

Privilege information on Component SQL_OPERATIONS for SQL_USER3
===============================================================

MANAGE_STATISTICS

=======================
 1 row(s) returned

--- SQL operation complete.
>>changeuser sql_user3;
>>obey TEST132(show_update_stats);
>>obey TEST132(update_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>update statistics for table t132t1 on every column;

--- SQL operation complete.
>>update statistics for table t132t2 on every column;

--- SQL operation complete.
>>
>>obey TEST132(show_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>showstats for table t132t1 on every column;

Histogram data for Table TRAFODION.T132SCH.T132T1
Table ID: 3703791059232936033

   Hist ID # Ints    Rowcount         UEC Colname(s)
========== ====== =========== =========== ===========================
1800623294      8           8           8 SYSKEY
1800623289      8           8           8 C1
1800623284      8           8           8 C2


--- SQL operation complete.
>>showstats for table t132t2 on every column;

Histogram data for Table TRAFODION.T132SCH.T132T2
Table ID: 3703791059232936201

   Hist ID # Ints    Rowcount         UEC Colname(s)
========== ====== =========== =========== ===========================
1824908699      8           8           8 SYSKEY
1824908692      8           8           8 C1
1824908689      8           8           8 C2


--- SQL operation complete.
>>
>>changeuser db__root;
>>revoke component privilege MANAGE_STATISTICS on sql_operations from sql_user3;

--- SQL operation complete.
>>get privileges on component sql_operations for sql_user3;

--- SQL operation complete.
>>
>>-- test showstats
>>-- showstats should no longer work
>>changeuser sql_user3;
>>obey TEST132(show_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>showstats for table t132t1 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T1.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T1.

--- SQL operation failed with errors.
>>showstats for table t132t2 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T2.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T2.

--- SQL operation failed with errors.
>>changeuser db__root;
>>
>>-- grant select to allow showstats to work
>>set schema t132sch;

--- SQL operation complete.
>>grant SELECT on t132t1 to sql_user4;

--- SQL operation complete.
>>cqd SHOWDDL_DISPLAY_PRIVILEGE_GRANTS 'ON';

--- SQL operation complete.
>>showddl t132t1;

CREATE TABLE TRAFODION.T132SCH.T132T1
  (
    C1                               INT DEFAULT NULL
  , C2                               INT DEFAULT NULL
  )
 ATTRIBUTES ALIGNED FORMAT
;

-- GRANT SELECT, INSERT, DELETE, UPDATE, REFERENCES ON TRAFODION.T132SCH.T132T1 TO DB__ROOT WITH GRANT OPTION;
  GRANT SELECT ON TRAFODION.T132SCH.T132T1 TO SQL_USER4;

--- SQL operation complete.
>>changeuser sql_user4;
>>obey TEST132(show_stats);
>>set schema t132sch;

--- SQL operation complete.
>>
>>showstats for table t132t1 on every column;

Histogram data for Table TRAFODION.T132SCH.T132T1
Table ID: 3703791059232936033

   Hist ID # Ints    Rowcount         UEC Colname(s)
========== ====== =========== =========== ===========================
1800623294      8           8           8 SYSKEY
1800623289      8           8           8 C1
1800623284      8           8           8 C2


--- SQL operation complete.
>>showstats for table t132t2 on every column;

*** ERROR[4481] The user does not have SELECT or MANAGE_STATISTICS privilege on table or view TRAFODION.T132SCH.T132T2.

*** ERROR[9241] Insufficient privileges to perform the statistics request for table TRAFODION.T132SCH.T132T2.

--- SQL operation failed with errors.
>>changeuser db__root;
>>
>>-- testcase for trafodion-2188 fix
>>create schema t132sch_private;

--- SQL operation complete.
>>set schema t132sch_private;

--- SQL operation complete.
>>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);

--- SQL operation complete.
>>
>>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;

--- 100000 row(s) inserted.
>>
>>select count(*) from t132t3;

(EXPR)              
--------------------

              100000

--- 1 row(s) selected.
>>
>>grant component privilege MANAGE_STATISTICS on sql_operations to sql_user3;

--- SQL operation complete.
>>get privileges on component sql_operations for sql_user3;

Privilege information on Component SQL_OPERATIONS for SQL_USER3
===============================================================

MANAGE_STATISTICS

=======================
 1 row(s) returned

--- SQL operation complete.
>>changeuser sql_user3;
>>obey TEST132(update_stats1);
>>set schema t132sch_private;

--- SQL operation complete.
>>update statistics for table t132t3 create sample random 10 percent;

--- SQL operation complete.
>>
>>changeuser db__root;
>>set schema t132sch_private;

--- SQL operation complete.
>>revoke component privilege MANAGE_STATISTICS on sql_operations from sql_user3;

--- SQL operation complete.
>>cleanup schema t132sch_private;

--- SQL operation complete.
>>set schema t132sch;

--- SQL operation complete.
>>
>>-- reset
>>revoke SELECT on t132t1 from sql_user4;

--- SQL operation complete.
>>grant component privilege "SHOW" on sql_operations to "PUBLIC";

--- SQL operation complete.
>>get privileges on component sql_operations for "PUBLIC";

Privilege information on Component SQL_OPERATIONS for PUBLIC
============================================================

CREATE_SCHEMA
SHOW

=======================
 2 row(s) returned

--- SQL operation complete.
>>
>>drop table t132t1;

--- SQL operation complete.
>>drop table t132t2;

--- SQL operation complete.
>>
>>get tables, match 'T132%';

--- SQL operation complete.
>>
>>log;
