-- -- WORKER_BINARY_DATA_PARTITION -- \set JobId 201010 \set TaskId 101105 \set Partition_Column textcolumn \set Partition_Column_Text '\'textcolumn\'' \set Partition_Column_Type 25 \set Select_Query_Text '\'SELECT * FROM binary_data_table\'' \set Select_All 'SELECT *' \set Table_Name binary_data_table \set Table_Part_00 binary_data_table_part_00 \set Table_Part_01 binary_data_table_part_01 \set Table_Part_02 binary_data_table_part_02 -- Create table with special characters CREATE TABLE :Table_Name(textcolumn text, binarycolumn bytea); COPY :Table_Name FROM stdin; aaa \013\120 binary data first \012\120\20\21 binary data second \21\120\130 binary data hex \x1E\x0D binary data with tabs \012\t\120\v some\t tabs\t with \t spaces text with tabs some\\ special\n characters \b text with special characters some ' and " and '' characters text with quotes \N null text \N null text 2 \N null text 3 \\N actual backslash N value \NN null string and N empty string \. SELECT length(binarycolumn) FROM :Table_Name; -- Run select query, and apply range partitioning on query results SELECT worker_range_partition_table(:JobId, :TaskId, :Select_Query_Text, :Partition_Column_Text, :Partition_Column_Type, ARRAY['aaa', 'some']::_text); -- Copy range partitioned files into tables CREATE TABLE :Table_Part_00 ( LIKE :Table_Name ); CREATE TABLE :Table_Part_01 ( LIKE :Table_Name ); CREATE TABLE :Table_Part_02 ( LIKE :Table_Name ); COPY :Table_Part_00 FROM 'base/pgsql_job_cache/job_201010/task_101105/p_00000'; COPY :Table_Part_01 FROM 'base/pgsql_job_cache/job_201010/task_101105/p_00001'; COPY :Table_Part_02 FROM 'base/pgsql_job_cache/job_201010/task_101105/p_00002'; -- The union of the three partitions should have as many rows as original table SELECT COUNT(*) AS total_row_count FROM ( SELECT * FROM :Table_Part_00 UNION ALL SELECT * FROM :Table_Part_01 UNION ALL SELECT * FROM :Table_Part_02 ) AS all_rows; -- We first compute the difference of partition tables against the base table. -- Then, we compute the difference of the base table against partitioned tables. SELECT COUNT(*) AS diff_lhs_00 FROM ( :Select_All FROM :Table_Part_00 EXCEPT ALL :Select_All FROM :Table_Name WHERE :Partition_Column IS NULL OR :Partition_Column < 'aaa' ) diff; SELECT COUNT(*) AS diff_lhs_01 FROM ( :Select_All FROM :Table_Part_01 EXCEPT ALL :Select_All FROM :Table_Name WHERE :Partition_Column >= 'aaa' AND :Partition_Column < 'some' ) diff; SELECT COUNT(*) AS diff_lhs_02 FROM ( :Select_All FROM :Table_Part_02 EXCEPT ALL :Select_All FROM :Table_Name WHERE :Partition_Column >= 'some' ) diff; SELECT COUNT(*) AS diff_rhs_00 FROM ( :Select_All FROM :Table_Name WHERE :Partition_Column IS NULL OR :Partition_Column < 'aaa' EXCEPT ALL :Select_All FROM :Table_Part_00 ) diff; SELECT COUNT(*) AS diff_rhs_01 FROM ( :Select_All FROM :Table_Name WHERE :Partition_Column >= 'aaa' AND :Partition_Column < 'some' EXCEPT ALL :Select_All FROM :Table_Part_01 ) diff; SELECT COUNT(*) AS diff_rhs_02 FROM ( :Select_All FROM :Table_Name WHERE :Partition_Column >= 'some' EXCEPT ALL :Select_All FROM :Table_Part_02 ) diff;