diff --git a/lib/activerecord-clean-db-structure/clean_dump.rb b/lib/activerecord-clean-db-structure/clean_dump.rb index 5962f61..46a4262 100644 --- a/lib/activerecord-clean-db-structure/clean_dump.rb +++ b/lib/activerecord-clean-db-structure/clean_dump.rb @@ -34,7 +34,7 @@ def clean extensions_to_remove = ["pg_stat_statements", "pg_buffercache"] if options[:keep_extensions] == :all - extensions_to_remove = [] + extensions_to_remove = [] elsif options[:keep_extensions] extensions_to_remove -= Array(options[:keep_extensions]) end @@ -77,7 +77,7 @@ def clean_inherited_tables inherited_tables.each do |inherited_table| dump.gsub!(/ALTER TABLE ONLY ([\w_]+\.)?#{inherited_table}[^;]+;/, '') - index_regexp = /CREATE INDEX ([\w_]+) ON ([\w_]+\.)?#{inherited_table}[^;]+;/m + index_regexp = /CREATE INDEX ("?[\w_]+"?) ON ([\w_]+\.)?#{inherited_table}[^;]+;/m dump.scan(index_regexp).map(&:first).each do |inherited_table_index| dump.gsub!(/-- Name: #{inherited_table_index}; Type: INDEX; Schema: \w+/, '') end @@ -111,14 +111,14 @@ def clean_partition_tables names = [] partitioned_tables.each { |table| names << table.split('.', 2)[1] } if names.any? - dump.scan(/CREATE (UNIQUE )?INDEX (\w+) ON (\w+\.)?(#{names.join('|')})[^;]+;/m).each { |m| names << m[1] } + dump.scan(/CREATE (UNIQUE )?INDEX "?(\w+)"? ON (\w+\.)?(#{names.join('|')})[^;]+;/m).each { |m| names << m[1] } end statements.reject! { |stmt| names.any? { |name| stmt.include?(name) } } @dump = statements.join("\n\n") @dump << "\n" if @dump[-1] != "\n" # This is mostly done to allow restoring Postgres 11 output on Postgres 10 - dump.gsub!(/CREATE INDEX ([\w]+) ON ONLY/, 'CREATE INDEX \\1 ON') + dump.gsub!(/CREATE INDEX ("?[\w+]"?) ON ONLY/, 'CREATE INDEX \\1 ON') end def clean_options @@ -137,7 +137,7 @@ def clean_options .group_by { |line| line.scan(/\b\w+\.\w+\b/).first } .transform_values(&:join) - dump.gsub!(/^CREATE( UNIQUE)? INDEX \w+ ON .+\n+/, '') + dump.gsub!(/^CREATE( UNIQUE)? INDEX "?\w+"? ON .+\n+/, '') dump.gsub!(/^-- Name: \w+; Type: INDEX; Schema: \w+\n+/, '') indexes.each do |table, indexes_for_table| dump.gsub!(/^(CREATE TABLE #{table}\b(:?[^;\n]*\n)+\);*\n(?:.*);*)/) { $1 + "\n\n" + indexes_for_table } diff --git a/test/data/input.sql b/test/data/input.sql index 7e87731..0b824e0 100644 --- a/test/data/input.sql +++ b/test/data/input.sql @@ -137,6 +137,12 @@ CREATE INDEX index_delayed_jobs_on_locked_by ON public.delayed_jobs USING btree CREATE INDEX index_delayed_jobs_on_queue ON public.delayed_jobs USING btree (queue); +-- +-- Name: index_delayed_jobs_on_failed_at_IS_NULL; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX "index_delayed_jobs_on_failed_at_IS_NULL" ON public.delayed_jobs USING btree (((failed_at IS NULL))); + -- -- Name: index_delayed_jobs_on_run_at; Type: INDEX; Schema: public; Owner: - diff --git a/test/expectations/default_props.sql b/test/expectations/default_props.sql index 185e3d5..62b38f6 100644 --- a/test/expectations/default_props.sql +++ b/test/expectations/default_props.sql @@ -57,6 +57,10 @@ CREATE INDEX index_delayed_jobs_on_locked_by ON public.delayed_jobs USING btree CREATE INDEX index_delayed_jobs_on_queue ON public.delayed_jobs USING btree (queue); +-- Name: index_delayed_jobs_on_failed_at_IS_NULL; Type: INDEX + +CREATE INDEX "index_delayed_jobs_on_failed_at_IS_NULL" ON public.delayed_jobs USING btree (((failed_at IS NULL))); + -- Name: index_delayed_jobs_on_run_at; Type: INDEX CREATE INDEX index_delayed_jobs_on_run_at ON public.delayed_jobs USING btree (run_at) WHERE (locked_at IS NULL); diff --git a/test/expectations/ignore_ids.sql b/test/expectations/ignore_ids.sql index 4aa2f89..4432dc5 100644 --- a/test/expectations/ignore_ids.sql +++ b/test/expectations/ignore_ids.sql @@ -83,6 +83,10 @@ CREATE INDEX index_delayed_jobs_on_locked_by ON public.delayed_jobs USING btree CREATE INDEX index_delayed_jobs_on_queue ON public.delayed_jobs USING btree (queue); +-- Name: index_delayed_jobs_on_failed_at_IS_NULL; Type: INDEX + +CREATE INDEX "index_delayed_jobs_on_failed_at_IS_NULL" ON public.delayed_jobs USING btree (((failed_at IS NULL))); + -- Name: index_delayed_jobs_on_run_at; Type: INDEX CREATE INDEX index_delayed_jobs_on_run_at ON public.delayed_jobs USING btree (run_at) WHERE (locked_at IS NULL); diff --git a/test/expectations/indexes_after_tables.sql b/test/expectations/indexes_after_tables.sql index a354946..4fa48d0 100644 --- a/test/expectations/indexes_after_tables.sql +++ b/test/expectations/indexes_after_tables.sql @@ -39,6 +39,7 @@ WITH (fillfactor='85'); CREATE INDEX index_delayed_jobs_on_locked_by ON public.delayed_jobs USING btree (locked_by); CREATE INDEX index_delayed_jobs_on_queue ON public.delayed_jobs USING btree (queue); +CREATE INDEX "index_delayed_jobs_on_failed_at_IS_NULL" ON public.delayed_jobs USING btree (((failed_at IS NULL))); CREATE INDEX index_delayed_jobs_on_run_at ON public.delayed_jobs USING btree (run_at) WHERE (locked_at IS NULL); -- Name: schema_migrations; Type: TABLE diff --git a/test/expectations/keep_extensions_all.sql b/test/expectations/keep_extensions_all.sql index 296e54d..e759aef 100644 --- a/test/expectations/keep_extensions_all.sql +++ b/test/expectations/keep_extensions_all.sql @@ -63,6 +63,10 @@ CREATE INDEX index_delayed_jobs_on_locked_by ON public.delayed_jobs USING btree CREATE INDEX index_delayed_jobs_on_queue ON public.delayed_jobs USING btree (queue); +-- Name: index_delayed_jobs_on_failed_at_IS_NULL; Type: INDEX + +CREATE INDEX "index_delayed_jobs_on_failed_at_IS_NULL" ON public.delayed_jobs USING btree (((failed_at IS NULL))); + -- Name: index_delayed_jobs_on_run_at; Type: INDEX CREATE INDEX index_delayed_jobs_on_run_at ON public.delayed_jobs USING btree (run_at) WHERE (locked_at IS NULL); diff --git a/test/expectations/order_column_definitions.sql b/test/expectations/order_column_definitions.sql index 5089ca8..7f10657 100644 --- a/test/expectations/order_column_definitions.sql +++ b/test/expectations/order_column_definitions.sql @@ -57,6 +57,10 @@ CREATE INDEX index_delayed_jobs_on_locked_by ON public.delayed_jobs USING btree CREATE INDEX index_delayed_jobs_on_queue ON public.delayed_jobs USING btree (queue); +-- Name: index_delayed_jobs_on_failed_at_IS_NULL; Type: INDEX + +CREATE INDEX "index_delayed_jobs_on_failed_at_IS_NULL" ON public.delayed_jobs USING btree (((failed_at IS NULL))); + -- Name: index_delayed_jobs_on_run_at; Type: INDEX CREATE INDEX index_delayed_jobs_on_run_at ON public.delayed_jobs USING btree (run_at) WHERE (locked_at IS NULL); diff --git a/test/expectations/order_schema_migrations_values.sql b/test/expectations/order_schema_migrations_values.sql index cf8fd44..66aa7c7 100644 --- a/test/expectations/order_schema_migrations_values.sql +++ b/test/expectations/order_schema_migrations_values.sql @@ -57,6 +57,10 @@ CREATE INDEX index_delayed_jobs_on_locked_by ON public.delayed_jobs USING btree CREATE INDEX index_delayed_jobs_on_queue ON public.delayed_jobs USING btree (queue); +-- Name: index_delayed_jobs_on_failed_at_IS_NULL; Type: INDEX + +CREATE INDEX "index_delayed_jobs_on_failed_at_IS_NULL" ON public.delayed_jobs USING btree (((failed_at IS NULL))); + -- Name: index_delayed_jobs_on_run_at; Type: INDEX CREATE INDEX index_delayed_jobs_on_run_at ON public.delayed_jobs USING btree (run_at) WHERE (locked_at IS NULL);