blob: ca708303848bd775017b12e6072c826441a82e1a [file] [log] [blame]
-- start_matchsubs
-- m/^LOG: In mode on_change, command INSERT.* modifying 10 tuples caused Auto-ANALYZE./
-- s/\(dboid,tableoid\)=\(\d+,\d+\)/\(dboid,tableoid\)=\(XXXXX,XXXXX\)/
-- m/LOG: Auto-stats did not issue ANALYZE on tableoid \d+ since the user does not have table-owner level permissions./
-- s/tableoid \d+/tableoid XXXXX/
-- end_matchsubs
-- start_matchignore
-- m/^LOG: .*Feature not supported: Queries on master-only tables./
-- m/^LOG: .*Falling back to Postgres-based planner because GPORCA does not support the following feature: Queries on master-only tables./
-- m/^LOG:.*ERROR,"PG exception raised"/
-- end_matchignore
set gp_autostats_mode=on_change;
set gp_autostats_on_change_threshold=9;
set log_autostats=on;
set client_min_messages=log;
reset optimizer_trace_fallback;
drop table if exists autostats_test;
create table autostats_test (a INTEGER);
drop user if exists autostats_nonowner;
create user autostats_nonowner;
-- Make sure rel_tuples starts at zero
select relname, reltuples from pg_class where relname='autostats_test';
-- Try it with gp_autostats_allow_nonowner GUC enabled, but as a non-owner
-- without INSERT permission. Should fail with permission denied, without
-- triggering autostats collection
set gp_autostats_allow_nonowner=on;
set role=autostats_nonowner;
insert into autostats_test select generate_series(1, 10);
select relname, reltuples from pg_class where relname='autostats_test';
reset role;
-- Try it with GUC enabled, after granting INSERT, stats should update to 10
grant insert on table autostats_test to autostats_nonowner;
set role=autostats_nonowner;
insert into autostats_test select generate_series(11, 20);
select relname, reltuples from pg_class where relname='autostats_test';
-- Try running analyze manually as nonowner, should fail
set role=autostats_nonowner;
analyze autostats_test;
select relname, reltuples from pg_class where relname='autostats_test';
-- Try to disable allow_nonowner GUC as ordinary user, should fail
set gp_autostats_allow_nonowner=off;
show gp_autostats_allow_nonowner;
-- GUC should still be enabled, stats should update to 20
insert into autostats_test select generate_series(21, 30);
select relname, reltuples from pg_class where relname='autostats_test';
reset role;
-- Change allow_nonowner GUC as admin, should work
set gp_autostats_allow_nonowner=off;
show gp_autostats_allow_nonowner;
-- GUC should be disabled, stats should not update
set role=autostats_nonowner;
insert into autostats_test select generate_series(31, 40);
select relname, reltuples from pg_class where relname='autostats_test';
reset role;
-- Try to enable allow_nonowner GUC as ordinary user, should fail
-- GUC should still be disabled, stats should update from 20 to 40
insert into autostats_test select generate_series(21, 30);
reset client_min_messages;
select relname, reltuples from pg_class where relname='autostats_test';
reset role;
-- After 4 successful inserts, final row count should also be 40
select COUNT(*) from autostats_test;
drop table if exists autostats_test;
drop user autostats_nonowner;
-- test inFunction
-- udf
create function test_auto_stats_in_function(sql text, load_data boolean, check_relname text) returns void as
$$
declare
ntuples int;
begin
execute 'create table t_test_auto_stats_in_function(a int) distributed randomly';
set gp_autostats_mode=none;
set gp_autostats_mode_in_functions=none;
if load_data then execute 'insert into t_test_auto_stats_in_function values (1)'; end if;
execute sql;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=none, gp_autostats_mode_in_functions=none, ntuples=%', ntuples;
execute 'drop table t_test_auto_stats_in_function';
execute 'drop table if exists tmp_test_auto_stats_in_function';
execute 'create table t_test_auto_stats_in_function(a int) distributed randomly';
set gp_autostats_mode=on_no_stats;
set gp_autostats_mode_in_functions=none;
if load_data then execute 'insert into t_test_auto_stats_in_function values (1)'; end if;
execute sql;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=on_no_stats, gp_autostats_mode_in_functions=none, ntuples=%', ntuples;
execute 'drop table t_test_auto_stats_in_function';
execute 'drop table if exists tmp_test_auto_stats_in_function';
execute 'create table t_test_auto_stats_in_function(a int) distributed randomly';
set gp_autostats_mode=none;
set gp_autostats_mode_in_functions=on_no_stats;
if load_data then execute 'insert into t_test_auto_stats_in_function values (1)'; end if;
execute sql;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=none, gp_autostats_mode_in_functions=on_no_stats, ntuples=%', ntuples;
execute 'drop table t_test_auto_stats_in_function';
execute 'drop table if exists tmp_test_auto_stats_in_function';
execute 'create table t_test_auto_stats_in_function(a int) distributed randomly';
set gp_autostats_mode=none;
set gp_autostats_mode_in_functions=on_no_stats;
if load_data then execute 'insert into t_test_auto_stats_in_function values (1)'; end if;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=none, gp_autostats_mode_in_functions=on_no_stats, ntuples=%', ntuples;
set gp_autostats_mode_in_functions=on_change;
set gp_autostats_on_change_threshold=0;
execute sql;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=none, gp_autostats_mode_in_functions=on_change, ntuples=%', ntuples;
execute 'drop table t_test_auto_stats_in_function';
execute 'drop table if exists tmp_test_auto_stats_in_function';
end;
$$
language plpgsql;
select test_auto_stats_in_function('copy t_test_auto_stats_in_function from program ''echo 1''',
false, 't_test_auto_stats_in_function');
select test_auto_stats_in_function('create table tmp_test_auto_stats_in_function as select * from t_test_auto_stats_in_function distributed randomly',
true, 'tmp_test_auto_stats_in_function');
select test_auto_stats_in_function('delete from t_test_auto_stats_in_function',
true, 't_test_auto_stats_in_function');
drop function test_auto_stats_in_function(text, boolean, text);
-- procedure
create procedure test_auto_stats_in_function(sql text, load_data boolean, check_relname text) as
$$
declare
ntuples int;
begin
execute 'create table t_test_auto_stats_in_function(a int) distributed randomly';
set gp_autostats_mode=none;
set gp_autostats_mode_in_functions=none;
if load_data then execute 'insert into t_test_auto_stats_in_function values (1)'; end if;
execute sql;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=none, gp_autostats_mode_in_functions=none, ntuples=%', ntuples;
execute 'drop table t_test_auto_stats_in_function';
execute 'drop table if exists tmp_test_auto_stats_in_function';
execute 'create table t_test_auto_stats_in_function(a int) distributed randomly';
set gp_autostats_mode=on_no_stats;
set gp_autostats_mode_in_functions=none;
if load_data then execute 'insert into t_test_auto_stats_in_function values (1)'; end if;
execute sql;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=on_no_stats, gp_autostats_mode_in_functions=none, ntuples=%', ntuples;
execute 'drop table t_test_auto_stats_in_function';
execute 'drop table if exists tmp_test_auto_stats_in_function';
execute 'create table t_test_auto_stats_in_function(a int) distributed randomly';
set gp_autostats_mode=none;
set gp_autostats_mode_in_functions=on_no_stats;
if load_data then execute 'insert into t_test_auto_stats_in_function values (1)'; end if;
execute sql;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=none, gp_autostats_mode_in_functions=on_no_stats, ntuples=%', ntuples;
execute 'drop table t_test_auto_stats_in_function';
execute 'drop table if exists tmp_test_auto_stats_in_function';
execute 'create table t_test_auto_stats_in_function(a int) distributed randomly';
set gp_autostats_mode=none;
set gp_autostats_mode_in_functions=on_no_stats;
if load_data then execute 'insert into t_test_auto_stats_in_function values (1)'; end if;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=none, gp_autostats_mode_in_functions=on_no_stats, ntuples=%', ntuples;
set gp_autostats_mode_in_functions=on_change;
set gp_autostats_on_change_threshold=0;
execute sql;
select reltuples into ntuples from pg_class where relname = check_relname;
raise info 'gp_autostats_mode=none, gp_autostats_mode_in_functions=on_change, ntuples=%', ntuples;
execute 'drop table t_test_auto_stats_in_function';
execute 'drop table if exists tmp_test_auto_stats_in_function';
end;
$$
language plpgsql;
call test_auto_stats_in_function('copy t_test_auto_stats_in_function from program ''echo 1''',
false, 't_test_auto_stats_in_function');
call test_auto_stats_in_function('create table tmp_test_auto_stats_in_function as select * from t_test_auto_stats_in_function distributed randomly',
true, 'tmp_test_auto_stats_in_function');
call test_auto_stats_in_function('delete from t_test_auto_stats_in_function',
true, 't_test_auto_stats_in_function');
drop procedure test_auto_stats_in_function(text, boolean, text);
create table t_test_auto_stats_in_function(a int);
set gp_autostats_mode_in_functions = none;
set gp_autostats_mode = on_no_stats;
copy t_test_auto_stats_in_function from program 'echo 1';
select reltuples from pg_class where relname = 't_test_auto_stats_in_function';
drop table t_test_auto_stats_in_function;
create table t_test_auto_stats_in_function(a int);
copy t_test_auto_stats_in_function from program 'echo 1';
set gp_autostats_mode_in_functions = none;
set gp_autostats_mode = on_no_stats;
create table tmp_test_auto_stats_in_function as select * from t_test_auto_stats_in_function distributed randomly;
select reltuples from pg_class where relname = 't_test_auto_stats_in_function';
drop table t_test_auto_stats_in_function;
drop table tmp_test_auto_stats_in_function;
-- reset GUCs
reset gp_autostats_mode;
reset gp_autostats_mode_in_functions;
reset gp_autostats_on_change_threshold;
reset log_autostats;
reset gp_autostats_allow_nonowner;