mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-04 14:16:49 +02:00
dd7a8f66ed
The original implementation of TABLESAMPLE modeled the tablesample method API on index access methods, which wasn't a good choice because, without specialized DDL commands, there's no way to build an extension that can implement a TSM. (Raw inserts into system catalogs are not an acceptable thing to do, because we can't undo them during DROP EXTENSION, nor will pg_upgrade behave sanely.) Instead adopt an API more like procedural language handlers or foreign data wrappers, wherein the only SQL-level support object needed is a single handler function identified by having a special return type. This lets us get rid of the supporting catalog altogether, so that no custom DDL support is needed for the feature. Adjust the API so that it can support non-constant tablesample arguments (the original coding assumed we could evaluate the argument expressions at ExecInitSampleScan time, which is undesirable even if it weren't outright unsafe), and discourage sampling methods from looking at invisible tuples. Make sure that the BERNOULLI and SYSTEM methods are genuinely repeatable within and across queries, as required by the SQL standard, and deal more honestly with methods that can't support that requirement. Make a full code-review pass over the tablesample additions, and fix assorted bugs, omissions, infelicities, and cosmetic issues (such as failure to put the added code stanzas in a consistent ordering). Improve EXPLAIN's output of tablesample plans, too. Back-patch to 9.5 so that we don't have to support the original API in production.
193 lines
3.3 KiB
Plaintext
193 lines
3.3 KiB
Plaintext
VACUUM;
|
|
--
|
|
-- sanity check, if we don't have indices the test will take years to
|
|
-- complete. But skip TOAST relations (since they will have varying
|
|
-- names depending on the current OID counter) as well as temp tables
|
|
-- of other backends (to avoid timing-dependent behavior).
|
|
--
|
|
-- temporarily disable fancy output, so catalog changes create less diff noise
|
|
\a\t
|
|
SELECT relname, relhasindex
|
|
FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = relnamespace
|
|
WHERE relkind = 'r' AND (nspname ~ '^pg_temp_') IS NOT TRUE
|
|
ORDER BY relname;
|
|
a|f
|
|
a_star|f
|
|
abstime_tbl|f
|
|
aggtest|f
|
|
array_index_op_test|t
|
|
array_op_test|f
|
|
b|f
|
|
b_star|f
|
|
box_tbl|f
|
|
bprime|f
|
|
bt_f8_heap|t
|
|
bt_i4_heap|t
|
|
bt_name_heap|t
|
|
bt_txt_heap|t
|
|
c|f
|
|
c_star|f
|
|
char_tbl|f
|
|
check2_tbl|f
|
|
check_tbl|f
|
|
circle_tbl|t
|
|
city|f
|
|
copy_tbl|f
|
|
d|f
|
|
d_star|f
|
|
date_tbl|f
|
|
default_tbl|f
|
|
defaultexpr_tbl|f
|
|
dept|f
|
|
dupindexcols|t
|
|
e_star|f
|
|
emp|f
|
|
equipment_r|f
|
|
f_star|f
|
|
fast_emp4000|t
|
|
float4_tbl|f
|
|
float8_tbl|f
|
|
func_index_heap|t
|
|
hash_f8_heap|t
|
|
hash_i4_heap|t
|
|
hash_name_heap|t
|
|
hash_txt_heap|t
|
|
hobbies_r|f
|
|
ihighway|t
|
|
inet_tbl|f
|
|
inhf|f
|
|
inhx|t
|
|
insert_tbl|f
|
|
int2_tbl|f
|
|
int4_tbl|f
|
|
int8_tbl|f
|
|
interval_tbl|f
|
|
iportaltest|f
|
|
kd_point_tbl|t
|
|
line_tbl|f
|
|
log_table|f
|
|
lseg_tbl|f
|
|
main_table|f
|
|
money_data|f
|
|
num_data|f
|
|
num_exp_add|t
|
|
num_exp_div|t
|
|
num_exp_ln|t
|
|
num_exp_log10|t
|
|
num_exp_mul|t
|
|
num_exp_power_10_ln|t
|
|
num_exp_sqrt|t
|
|
num_exp_sub|t
|
|
num_input_test|f
|
|
num_result|f
|
|
onek|t
|
|
onek2|t
|
|
path_tbl|f
|
|
person|f
|
|
pg_aggregate|t
|
|
pg_am|t
|
|
pg_amop|t
|
|
pg_amproc|t
|
|
pg_attrdef|t
|
|
pg_attribute|t
|
|
pg_auth_members|t
|
|
pg_authid|t
|
|
pg_cast|t
|
|
pg_class|t
|
|
pg_collation|t
|
|
pg_constraint|t
|
|
pg_conversion|t
|
|
pg_database|t
|
|
pg_db_role_setting|t
|
|
pg_default_acl|t
|
|
pg_depend|t
|
|
pg_description|t
|
|
pg_enum|t
|
|
pg_event_trigger|t
|
|
pg_extension|t
|
|
pg_foreign_data_wrapper|t
|
|
pg_foreign_server|t
|
|
pg_foreign_table|t
|
|
pg_index|t
|
|
pg_inherits|t
|
|
pg_language|t
|
|
pg_largeobject|t
|
|
pg_largeobject_metadata|t
|
|
pg_namespace|t
|
|
pg_opclass|t
|
|
pg_operator|t
|
|
pg_opfamily|t
|
|
pg_pltemplate|t
|
|
pg_policy|t
|
|
pg_proc|t
|
|
pg_range|t
|
|
pg_replication_origin|t
|
|
pg_rewrite|t
|
|
pg_seclabel|t
|
|
pg_shdepend|t
|
|
pg_shdescription|t
|
|
pg_shseclabel|t
|
|
pg_statistic|t
|
|
pg_tablespace|t
|
|
pg_transform|t
|
|
pg_trigger|t
|
|
pg_ts_config|t
|
|
pg_ts_config_map|t
|
|
pg_ts_dict|t
|
|
pg_ts_parser|t
|
|
pg_ts_template|t
|
|
pg_type|t
|
|
pg_user_mapping|t
|
|
point_tbl|t
|
|
polygon_tbl|t
|
|
quad_point_tbl|t
|
|
radix_text_tbl|t
|
|
ramp|f
|
|
real_city|f
|
|
reltime_tbl|f
|
|
road|t
|
|
shighway|t
|
|
slow_emp4000|f
|
|
sql_features|f
|
|
sql_implementation_info|f
|
|
sql_languages|f
|
|
sql_packages|f
|
|
sql_parts|f
|
|
sql_sizing|f
|
|
sql_sizing_profiles|f
|
|
stud_emp|f
|
|
student|f
|
|
tenk1|t
|
|
tenk2|t
|
|
test_range_excl|t
|
|
test_range_gist|t
|
|
test_range_spgist|t
|
|
test_tsvector|f
|
|
testjsonb|f
|
|
text_tbl|f
|
|
time_tbl|f
|
|
timestamp_tbl|f
|
|
timestamptz_tbl|f
|
|
timetz_tbl|f
|
|
tinterval_tbl|f
|
|
varchar_tbl|f
|
|
-- restore normal output mode
|
|
\a\t
|
|
--
|
|
-- another sanity check: every system catalog that has OIDs should have
|
|
-- a unique index on OID. This ensures that the OIDs will be unique,
|
|
-- even after the OID counter wraps around.
|
|
-- We exclude non-system tables from the check by looking at nspname.
|
|
--
|
|
SELECT relname, nspname
|
|
FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = relnamespace
|
|
WHERE relhasoids
|
|
AND ((nspname ~ '^pg_') IS NOT FALSE)
|
|
AND NOT EXISTS (SELECT 1 FROM pg_index i WHERE indrelid = c.oid
|
|
AND indkey[0] = -2 AND indnatts = 1
|
|
AND indisunique AND indimmediate);
|
|
relname | nspname
|
|
---------+---------
|
|
(0 rows)
|
|
|