mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	Make tablesample work with partitioned tables.
This was an oversight in the original partitioning commit. Amit Langote, reviewed by David Fetter Discussion: http://postgr.es/m/59af6590-8ace-04c4-c36c-ea35d435c60e@lab.ntt.co.jp
This commit is contained in:
		| @@ -907,7 +907,8 @@ transformFromClauseItem(ParseState *pstate, Node *n, | ||||
| 		rte = rt_fetch(rtr->rtindex, pstate->p_rtable); | ||||
| 		/* We only support this on plain relations and matviews */ | ||||
| 		if (rte->relkind != RELKIND_RELATION && | ||||
| 			rte->relkind != RELKIND_MATVIEW) | ||||
| 			rte->relkind != RELKIND_MATVIEW && | ||||
| 			rte->relkind != RELKIND_PARTITIONED_TABLE) | ||||
| 			ereport(ERROR, | ||||
| 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED), | ||||
| 					 errmsg("TABLESAMPLE clause can only be applied to tables and materialized views"), | ||||
|   | ||||
| @@ -313,3 +313,21 @@ SELECT q.* FROM (SELECT * FROM test_tablesample) as q TABLESAMPLE BERNOULLI (5); | ||||
| ERROR:  syntax error at or near "TABLESAMPLE" | ||||
| LINE 1: ...CT q.* FROM (SELECT * FROM test_tablesample) as q TABLESAMPL... | ||||
|                                                              ^ | ||||
| -- check partitioned tables support tablesample | ||||
| create table parted_sample (a int) partition by list (a); | ||||
| create table parted_sample_1 partition of parted_sample for values in (1); | ||||
| create table parted_sample_2 partition of parted_sample for values in (2); | ||||
| explain (costs off) | ||||
|   select * from parted_sample tablesample bernoulli (100); | ||||
|                 QUERY PLAN                  | ||||
| ------------------------------------------- | ||||
|  Append | ||||
|    ->  Sample Scan on parted_sample | ||||
|          Sampling: bernoulli ('100'::real) | ||||
|    ->  Sample Scan on parted_sample_1 | ||||
|          Sampling: bernoulli ('100'::real) | ||||
|    ->  Sample Scan on parted_sample_2 | ||||
|          Sampling: bernoulli ('100'::real) | ||||
| (7 rows) | ||||
|  | ||||
| drop table parted_sample, parted_sample_1, parted_sample_2; | ||||
|   | ||||
| @@ -100,3 +100,11 @@ WITH query_select AS (SELECT * FROM test_tablesample) | ||||
| SELECT * FROM query_select TABLESAMPLE BERNOULLI (5.5) REPEATABLE (1); | ||||
|  | ||||
| SELECT q.* FROM (SELECT * FROM test_tablesample) as q TABLESAMPLE BERNOULLI (5); | ||||
|  | ||||
| -- check partitioned tables support tablesample | ||||
| create table parted_sample (a int) partition by list (a); | ||||
| create table parted_sample_1 partition of parted_sample for values in (1); | ||||
| create table parted_sample_2 partition of parted_sample for values in (2); | ||||
| explain (costs off) | ||||
|   select * from parted_sample tablesample bernoulli (100); | ||||
| drop table parted_sample, parted_sample_1, parted_sample_2; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user