Files
impala/testdata/datasets/functional/schema_constraints.csv
Zoltan Borok-Nagy da34d34a42 IMPALA-9859: Full ACID Milestone 4: Part 2 Reading modified tables (complex types)
This implements scanning full ACID tables that contain complex types.
The same technique works that we use for primitive types. I.e. we add
a LEFT ANTI JOIN on top of the Hdfs scan node in order to subtract
the deleted rows from the inserted rows.

However, there were some types of queries where we couldn't do that.
These are the queries that scan the nested collection items directly.

E.g.: SELECT item FROM complextypestbl.int_array;

The above query only creates a single tuple descriptor that holds the
collection items. Since this tuple descriptor is not at the table-level,
we cannot add slot references to the hidden ACID column which are at the
top level of the table schema.

To resolve this I added a statement rewriter that rewrites the above
statement to the following:

  SELECT item FROM complextypestbl $a$1, $a$1.int_array;

Now in this example we'll have two tuple descriptors, one for the
table-level, and one for the collection item. So we can add the ACID
slot refs to the table-level tuple descriptor. The rewrite is
implemented by the new AcidRewriter class.

Performance

I executed the following query with num_nodes=1 on a non-transactional
table (without the rewrite), and on an ACID table (with the rewrite):

  select count(*) from customer_nested.c_orders.o_lineitems;

Without the rewrite:
Fetched 1 row(s) in 0.41s
+--------------+--------+-------+----------+----------+-------+------------+----------+---------------+---------------------------------------------------+
| Operator     | #Hosts | #Inst | Avg Time | Max Time | #Rows | Est. #Rows | Peak Mem | Est. Peak Mem | Detail                                            |
+--------------+--------+-------+----------+----------+-------+------------+----------+---------------+---------------------------------------------------+
| F00:ROOT     | 1      | 1     | 13.61us  | 13.61us  |       |            | 0 B      | 0 B           |                                                   |
| 01:AGGREGATE | 1      | 1     | 3.68ms   | 3.68ms   | 1     | 1          | 16.00 KB | 10.00 MB      | FINALIZE                                          |
| 00:SCAN HDFS | 1      | 1     | 280.47ms | 280.47ms | 6.00M | 15.00M     | 56.98 MB | 8.00 MB       | tpch_nested_orc_def.customer.c_orders.o_lineitems |
+--------------+--------+-------+----------+----------+-------+------------+----------+---------------+---------------------------------------------------+

With the rewrite:
Fetched 1 row(s) in 0.42s
+---------------------------+--------+-------+----------+----------+---------+------------+----------+---------------+---------------------------------------+
| Operator                  | #Hosts | #Inst | Avg Time | Max Time | #Rows   | Est. #Rows | Peak Mem | Est. Peak Mem | Detail                                |
+---------------------------+--------+-------+----------+----------+---------+------------+----------+---------------+---------------------------------------+
| F00:ROOT                  | 1      | 1     | 25.16us  | 25.16us  |         |            | 0 B      | 0 B           |                                       |
| 05:AGGREGATE              | 1      | 1     | 3.44ms   | 3.44ms   | 1       | 1          | 63.00 KB | 10.00 MB      | FINALIZE                              |
| 01:SUBPLAN                | 1      | 1     | 16.52ms  | 16.52ms  | 6.00M   | 125.92M    | 47.00 KB | 0 B           |                                       |
| |--04:NESTED LOOP JOIN    | 1      | 1     | 188.47ms | 188.47ms | 0       | 10         | 24.00 KB | 12 B          | CROSS JOIN                            |
| |  |--02:SINGULAR ROW SRC | 1      | 1     | 0ns      | 0ns      | 0       | 1          | 0 B      | 0 B           |                                       |
| |  03:UNNEST              | 1      | 1     | 25.37ms  | 25.37ms  | 0       | 10         | 0 B      | 0 B           | $a$1.c_orders.o_lineitems o_lineitems |
| 00:SCAN HDFS              | 1      | 1     | 96.26ms  | 96.26ms  | 100.00K | 12.59M     | 38.19 MB | 72.00 MB      | default.customer_nested $a$1          |
+---------------------------+--------+-------+----------+----------+---------+------------+----------+---------------+---------------------------------------+

So the overhead is very little.

Testing
* Added planner tests to PlannerTest/acid-scans.test
* E2E query tests to QueryTest/full-acid-complex-type-scans.test
* E2E tests for rowid-generation: QueryTest/full-acid-rowid.test

Change-Id: I8b2c6cd3d87c452c5b96a913b14c90ada78d4c6f
Reviewed-on: http://gerrit.cloudera.org:8080/16228
Reviewed-by: Zoltan Borok-Nagy <boroknagyz@cloudera.com>
Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
Reviewed-by: Tim Armstrong <tarmstrong@cloudera.com>
2020-08-12 17:45:50 +00:00

19 KiB

1# Table level constraints:
2# Allows for defining constraints on which file formats to generate for an individual
3# table. The table name should match the base table name defined in the schema template
4# file.
5table_name:stringids, constraint:restrict_to, table_format:hbase/none/none
6table_name:hbasecolumnfamilies, constraint:restrict_to, table_format:hbase/none/none
7table_name:insertalltypesagg, constraint:restrict_to, table_format:hbase/none/none
8table_name:alltypessmallbinary, constraint:restrict_to, table_format:hbase/none/none
9table_name:insertalltypesaggbinary, constraint:restrict_to, table_format:hbase/none/none
10table_name:hbasealltypeserror, constraint:restrict_to, table_format:hbase/none/none
11table_name:hbasealltypeserrornonulls, constraint:restrict_to, table_format:hbase/none/none
12table_name:alltypesinsert, constraint:restrict_to, table_format:text/none/none
13table_name:alltypes_promoted, constraint:restrict_to, table_format:orc/def/block
14table_name:alltypes_deleted_rows, constraint:restrict_to, table_format:orc/def/block
15table_name:stringpartitionkey, constraint:restrict_to, table_format:text/none/none
16table_name:alltypesnopart_insert, constraint:restrict_to, table_format:text/none/none
17table_name:insert_overwrite_nopart, constraint:restrict_to, table_format:text/none/none
18table_name:insert_overwrite_partitioned, constraint:restrict_to, table_format:text/none/none
19table_name:insert_string_partitioned, constraint:restrict_to, table_format:text/none/none
20table_name:alltypesinsert, constraint:restrict_to, table_format:parquet/none/none
21table_name:alltypesnopart_insert, constraint:restrict_to, table_format:parquet/none/none
22table_name:alltypesinsert, constraint:restrict_to, table_format:text/none/none
23table_name:alltypesnopart_insert, constraint:restrict_to, table_format:text/none/none
24table_name:insert_overwrite_nopart, constraint:restrict_to, table_format:text/none/none
25table_name:insert_overwrite_partitioned, constraint:restrict_to, table_format:text/none/none
26table_name:insert_string_partitioned, constraint:restrict_to, table_format:text/none/none
27table_name:alltypesinsert, constraint:restrict_to, table_format:parquet/none/none
28table_name:alltypesnopart_insert, constraint:restrict_to, table_format:parquet/none/none
29table_name:insert_overwrite_nopart, constraint:restrict_to, table_format:parquet/none/none
30table_name:insert_overwrite_partitioned, constraint:restrict_to, table_format:parquet/none/none
31table_name:insert_string_partitioned, constraint:restrict_to, table_format:parquet/none/none
32table_name:old_rcfile_table, constraint:restrict_to, table_format:rc/none/none
33table_name:bad_text_gzip, constraint:restrict_to, table_format:text/gzip/block
34table_name:bad_seq_snap, constraint:restrict_to, table_format:seq/snap/block
35table_name:bad_avro_snap_strings, constraint:restrict_to, table_format:avro/snap/block
36table_name:bad_avro_snap_floats, constraint:restrict_to, table_format:avro/snap/block
37table_name:bad_avro_decimal_schema, constraint:restrict_to, table_format:avro/snap/block
38table_name:bad_avro_date_out_of_range, constraint:restrict_to, table_format:avro/snap/block
39table_name:hive2_bad_avro_date_pre_gregorian, constraint:restrict_to, table_format:avro/snap/block
40table_name:hive3_avro_date_pre_gregorian, constraint:restrict_to, table_format:avro/snap/block
41table_name:bad_parquet, constraint:restrict_to, table_format:parquet/none/none
42table_name:bad_parquet_strings_negative_len, constraint:restrict_to, table_format:parquet/none/none
43table_name:bad_parquet_strings_out_of_bounds, constraint:restrict_to, table_format:parquet/none/none
44table_name:bad_magic_number, constraint:restrict_to, table_format:parquet/none/none
45table_name:bad_metadata_len, constraint:restrict_to, table_format:parquet/none/none
46table_name:bad_dict_page_offset, constraint:restrict_to, table_format:parquet/none/none
47table_name:bad_compressed_size, constraint:restrict_to, table_format:parquet/none/none
48table_name:alltypesagg_hive_13_1, constraint:restrict_to, table_format:parquet/none/none
49table_name:kite_required_fields, constraint:restrict_to, table_format:parquet/none/none
50table_name:bad_column_metadata, constraint:restrict_to, table_format:parquet/none/none
51table_name:lineitem_multiblock, constraint:restrict_to, table_format:parquet/none/none
52table_name:lineitem_sixblocks, constraint:restrict_to, table_format:parquet/none/none
53table_name:lineitem_multiblock_one_row_group, constraint:restrict_to, table_format:parquet/none/none
54table_name:customer_multiblock, constraint:restrict_to, table_format:parquet/none/none
55table_name:hudi_partitioned, constraint:restrict_to, table_format:parquet/none/none
56table_name:hudi_non_partitioned, constraint:restrict_to, table_format:parquet/none/none
57table_name:hudi_as_parquet, constraint:restrict_to, table_format:parquet/none/none
58# TODO: Support Avro. Data loading currently fails for Avro because complex types
59# cannot be converted to the corresponding Avro types yet.
60table_name:allcomplextypes, constraint:restrict_to, table_format:text/none/none
61table_name:allcomplextypes, constraint:restrict_to, table_format:parquet/none/none
62table_name:allcomplextypes, constraint:restrict_to, table_format:hbase/none/none
63table_name:functional, constraint:restrict_to, table_format:text/none/none
64table_name:complextypes_fileformat, constraint:restrict_to, table_format:text/none/none
65table_name:complextypes_fileformat, constraint:restrict_to, table_format:parquet/none/none
66table_name:complextypes_fileformat, constraint:restrict_to, table_format:avro/snap/block
67table_name:complextypes_fileformat, constraint:restrict_to, table_format:rc/snap/block
68table_name:complextypes_fileformat, constraint:restrict_to, table_format:seq/snap/block
69table_name:complextypes_fileformat, constraint:restrict_to, table_format:orc/def/block
70table_name:complextypes_multifileformat, constraint:restrict_to, table_format:text/none/none
71# TODO: Avro
72table_name:complextypestbl, constraint:restrict_to, table_format:parquet/none/none
73table_name:complextypestbl, constraint:restrict_to, table_format:orc/def/block
74table_name:complextypestbl_minor_compacted, constraint:restrict_to, table_format:orc/def/block
75table_name:complextypestbl_deleted_rows, constraint:restrict_to, table_format:orc/def/block
76table_name:complextypestbl_medium, constraint:restrict_to, table_format:parquet/none/none
77table_name:complextypestbl_medium, constraint:restrict_to, table_format:orc/def/block
78table_name:complextypestbl_non_transactional, constraint:restrict_to, table_format:orc/def/block
79table_name:alltypeserror, constraint:exclude, table_format:parquet/none/none
80table_name:alltypeserrornonulls, constraint:exclude, table_format:parquet/none/none
81table_name:unsupported_types, constraint:exclude, table_format:parquet/none/none
82table_name:escapechartesttable, constraint:exclude, table_format:parquet/none/none
83table_name:TblWithRaggedColumns, constraint:exclude, table_format:parquet/none/none
84# the text_ tables are for testing test delimiters and escape chars in text files
85table_name:text_comma_backslash_newline, constraint:restrict_to, table_format:text/none/none
86table_name:text_dollar_hash_pipe, constraint:restrict_to, table_format:text/none/none
87table_name:text_thorn_ecirc_newline, constraint:restrict_to, table_format:text/none/none
88table_name:bad_serde, constraint:restrict_to, table_format:text/none/none
89table_name:rcfile_lazy_binary_serde, constraint:restrict_to, table_format:rc/none/none
90table_name:unsupported_partition_types, constraint:restrict_to, table_format:text/none/none
91table_name:nullformat_custom, constraint:exclude, table_format:parquet/none/none
92table_name:alltypes_view, constraint:restrict_to, table_format:text/none/none
93table_name:allcomplextypes_view, constraint:restrict_to, table_format:text/none/none
94table_name:alltypes_view, constraint:restrict_to, table_format:seq/snap/block
95table_name:alltypes_hive_view, constraint:restrict_to, table_format:text/none/none
96table_name:alltypes_view_sub, constraint:restrict_to, table_format:text/none/none
97table_name:alltypes_view_sub, constraint:restrict_to, table_format:seq/snap/block
98table_name:alltypes_parens, constraint:restrict_to, table_format:text/none/none
99table_name:complex_view, constraint:restrict_to, table_format:text/none/none
100table_name:complex_view, constraint:restrict_to, table_format:seq/snap/block
101table_name:view_view, constraint:restrict_to, table_format:text/none/none
102table_name:view_view, constraint:restrict_to, table_format:seq/snap/block
103table_name:subquery_view, constraint:restrict_to, table_format:seq/snap/block
104table_name:subquery_view, constraint:restrict_to, table_format:rc/none/none
105# liketbl, tblwithraggedcolumns and manynulls all have
106# NULLs in primary key columns. hbase does not support
107# writing NULLs to primary key columns.
108table_name:liketbl, constraint:exclude, table_format:hbase/none/none
109table_name:manynulls, constraint:exclude, table_format:hbase/none/none
110table_name:tblwithraggedcolumns, constraint:exclude, table_format:hbase/none/none
111# Tables with only one column are not supported in hbase.
112table_name:greptiny, constraint:exclude, table_format:hbase/none/none
113table_name:tinyinttable, constraint:exclude, table_format:hbase/none/none
114# overflow uses a manually constructed text file which doesn't make sense to write to
115# other table formats since the values that would be written are different (e.g. already
116# truncated.)
117table_name:overflow, constraint:restrict_to, table_format:text/none/none
118# widerow has a single column with a single row containing a 10MB string. hbase doesn't
119# seem to like this.
120table_name:widerow, constraint:exclude, table_format:hbase/none/none
121# nullformat_custom is used in null-insert tests, which user insert overwrite,
122# which is not supported in hbase. The schema is also specified in HIVE_CREATE
123# with no corresponding LOAD statement.
124table_name:nullformat_custom, constraint:exclude, table_format:hbase/none/none
125table_name:unsupported_types, constraint:exclude, table_format:hbase/none/none
126# Decimal can only be tested on formats Impala can write to (text and parquet).
127# TODO: add Avro once Hive or Impala can write Avro decimals
128table_name:decimal_tbl, constraint:restrict_to, table_format:text/none/none
129table_name:decimal_tiny, constraint:restrict_to, table_format:text/none/none
130table_name:decimal_tbl, constraint:restrict_to, table_format:parquet/none/none
131table_name:decimal_tiny, constraint:restrict_to, table_format:parquet/none/none
132table_name:decimal_tbl, constraint:restrict_to, table_format:kudu/none/none
133table_name:decimal_tiny, constraint:restrict_to, table_format:kudu/none/none
134table_name:decimal_tbl, constraint:restrict_to, table_format:orc/def/block
135table_name:decimal_tiny, constraint:restrict_to, table_format:orc/def/block
136table_name:decimal_rtf_tbl, constraint:restrict_to, table_format:text/none/none
137table_name:decimal_rtf_tbl, constraint:restrict_to, table_format:parquet/none/none
138table_name:decimal_rtf_tbl, constraint:restrict_to, table_format:kudu/none/none
139table_name:decimal_rtf_tbl, constraint:restrict_to, table_format:orc/def/block
140table_name:decimal_rtf_tiny_tbl, constraint:restrict_to, table_format:text/none/none
141table_name:decimal_rtf_tiny_tbl, constraint:restrict_to, table_format:parquet/none/none
142table_name:decimal_rtf_tiny_tbl, constraint:restrict_to, table_format:kudu/none/none
143table_name:decimal_rtf_tiny_tbl, constraint:restrict_to, table_format:orc/def/block
144table_name:avro_decimal_tbl, constraint:restrict_to, table_format:avro/snap/block
145# CHAR is not supported by HBase.
146table_name:chars_tiny, constraint:exclude, table_format:hbase/none/none
147table_name:chars_medium, constraint:exclude, table_format:hbase/none/none
148# invalid_decimal_part_tbl[1,2,3] tables are used for testing invalid decimal
149# partition key values (see IMPALA-1040)
150table_name:invalid_decimal_part_tbl1, constraint:restrict_to, table_format:text/none/none
151table_name:invalid_decimal_part_tbl2, constraint:restrict_to, table_format:text/none/none
152table_name:invalid_decimal_part_tbl3, constraint:restrict_to, table_format:text/none/none
153table_name:avro_decimal_tbl, constraint:restrict_to, table_format:avro/snap/block
154# testescape tables are used for testing text scanner delimiter handling
155table_name:table_no_newline, constraint:restrict_to, table_format:text/none/none
156table_name:table_no_newline_part, constraint:restrict_to, table_format:text/none/none
157table_name:testescape_16_lf, constraint:restrict_to, table_format:text/none/none
158table_name:testescape_16_crlf, constraint:restrict_to, table_format:text/none/none
159table_name:testescape_17_lf, constraint:restrict_to, table_format:text/none/none
160table_name:testescape_17_crlf, constraint:restrict_to, table_format:text/none/none
161table_name:testescape_32_lf, constraint:restrict_to, table_format:text/none/none
162table_name:testescape_32_crlf, constraint:restrict_to, table_format:text/none/none
163# alltimezones is used to verify that impala properly deals with timezones
164table_name:alltimezones, constraint:restrict_to, table_format:text/none/none
165# Avro schema is inferred from the column definitions (IMPALA-1136)
166table_name:no_avro_schema, constraint:restrict_to, table_format:avro/snap/block
167table_name:avro_unicode_nulls, constraint:restrict_to, table_format:avro/snap/block
168# test single and multi stream bz2 files
169table_name:bzip2_tbl, constraint:restrict_to, table_format:text/bzip/block
170table_name:large_bzip2_tbl, constraint:restrict_to, table_format:text/bzip/block
171table_name:multistream_bzip2_tbl, constraint:restrict_to, table_format:text/bzip/block
172table_name:large_multistream_bzip2_tbl, constraint:restrict_to, table_format:text/bzip/block
173# Kudu can't handle certain types such as timestamp so we pick and choose the tables
174# we actually use for Kudu related tests.
175table_name:alltypes, constraint:only, table_format:kudu/none/none
176table_name:alltypessmall, constraint:only, table_format:kudu/none/none
177table_name:alltypestiny, constraint:only, table_format:kudu/none/none
178table_name:alltypesagg, constraint:only, table_format:kudu/none/none
179table_name:alltypesaggnonulls, constraint:only, table_format:kudu/none/none
180table_name:testtbl, constraint:only, table_format:kudu/none/none
181table_name:jointbl, constraint:only, table_format:kudu/none/none
182table_name:emptytable, constraint:only, table_format:kudu/none/none
183table_name:dimtbl, constraint:only, table_format:kudu/none/none
184table_name:tinytable, constraint:only, table_format:kudu/none/none
185table_name:tinyinttable, constraint:only, table_format:kudu/none/none
186table_name:zipcode_incomes, constraint:only, table_format:kudu/none/none
187table_name:nulltable, constraint:only, table_format:kudu/none/none
188table_name:nullrows, constraint:only, table_format:kudu/none/none
189table_name:nullescapedtable, constraint:only, table_format:kudu/none/none
190table_name:decimal_tbl, constraint:only, table_format:kudu/none/none
191table_name:decimal_rtf_tbl, constraint:only, table_format:kudu/none/none
192table_name:decimal_rtf_tiny_tbl, constraint:only, table_format:kudu/none/none
193table_name:decimal_tiny, constraint:only, table_format:kudu/none/none
194table_name:strings_with_quotes, constraint:only, table_format:kudu/none/none
195table_name:manynulls, constraint:only, table_format:kudu/none/none
196table_name:date_tbl, constraint:only, table_format:kudu/none/none
197# Skipping header lines is only effective with text tables
198table_name:table_with_header, constraint:restrict_to, table_format:text/none/none
199table_name:table_with_header_2, constraint:restrict_to, table_format:text/none/none
200table_name:table_with_header_insert, constraint:restrict_to, table_format:text/none/none
201# We also test that skipping header lines works on compressed tables (IMPALA-5287)
202table_name:table_with_header, constraint:restrict_to, table_format:text/gzip/block
203table_name:table_with_header_2, constraint:restrict_to, table_format:text/gzip/block
204table_name:table_with_header_insert, constraint:restrict_to, table_format:text/gzip/block
205# Inserting into parquet tables should not be affected by the 'skip.header.line.count'
206# property, so we test parquet format as well.
207table_name:table_with_header_insert, constraint:restrict_to, table_format:parquet/none/none
208# IMPALA-7368/IMPALA-7370/IMPALA-8198 adds DATE support for text, hbase, parquet and avro.
209# IMPALA-8801 adds DATE support for ORC.
210# IMPALA-8800 adds DATE support for Kudu.
211# Other file-formats will be introduced later.
212table_name:date_tbl, constraint:restrict_to, table_format:parquet/none/none
213table_name:date_tbl, constraint:restrict_to, table_format:avro/snap/block
214table_name:date_tbl, constraint:restrict_to, table_format:orc/def/block
215table_name:date_tbl, constraint:restrict_to, table_format:hbase/none/none
216table_name:date_tbl, constraint:restrict_to, table_format:kudu/none/none
217table_name:date_tbl, constraint:restrict_to, table_format:text/none/none
218table_name:date_tbl, constraint:restrict_to, table_format:text/bzip/block
219table_name:date_tbl, constraint:restrict_to, table_format:text/gzip/block
220table_name:date_tbl, constraint:restrict_to, table_format:text/snap/block
221table_name:date_tbl, constraint:restrict_to, table_format:text/def/block
222table_name:date_tbl_error, constraint:restrict_to, table_format:text/none/none
223table_name:date_tbl_error, constraint:restrict_to, table_format:text/bzip/block
224table_name:date_tbl_error, constraint:restrict_to, table_format:text/gzip/block
225table_name:date_tbl_error, constraint:restrict_to, table_format:text/snap/block
226table_name:date_tbl_error, constraint:restrict_to, table_format:text/def/block
227table_name:insert_date_tbl, constraint:restrict_to, table_format:hbase/none/none
228# Full transactional table is only supported for ORC
229table_name:full_transactional_table, constraint:restrict_to, table_format:orc/def/block
230# Insert-only transactional tables only work for file-format based tables
231table_name:insert_only_transactional_table, constraint:exclude, table_format:hbase/none/none
232table_name:insert_only_transactional_table, constraint:exclude, table_format:kudu/none/none
233table_name:insertonly_nopart_insert, constraint:restrict_to, table_format:text/none/none
234table_name:insertonly_nopart_insert, constraint:restrict_to, table_format:parquet/none/none
235table_name:insertonly_part_insert, constraint:restrict_to, table_format:text/none/none
236table_name:insertonly_part_insert, constraint:restrict_to, table_format:parquet/none/none
237# 'materialized_view' is based on 'insert_only_transactional_table' from the same
238# database, so it needs to be excluded where 'insert_only_transactional_table' is
239# excluded.
240table_name:materialized_view, constraint:exclude, table_format:hbase/none/none
241table_name:materialized_view, constraint:exclude, table_format:kudu/none/none
242table_name:insert_only_transactional_bucketed_table, constraint:exclude, table_format:hbase/none/none
243table_name:insert_only_transactional_bucketed_table, constraint:exclude, table_format:kudu/none/none
244# Bucketed tables only work for file-format based tables
245table_name:bucketed_ext_table, constraint:exclude, table_format:hbase/none/none
246table_name:bucketed_ext_table, constraint:exclude, table_format:kudu/none/none
247table_name:bucketed_table, constraint:exclude, table_format:hbase/none/none
248table_name:bucketed_table, constraint:exclude, table_format:kudu/none/none
249# The uncompressed ORC tables are mainly used in test_scanners_fuzz.py to avoid creating
250# them each time when running the test. Developers may run this test many times locally.
251table_name:uncomp_src_alltypes, constraint:restrict_to, table_format:orc/def/block
252table_name:uncomp_src_decimal_tbl, constraint:restrict_to, table_format:orc/def/block
253table_name:part_strings_with_quotes, constraint:restrict_to, table_format:text/none/none