Skip to content

Versioned SQL file generation is not safe for parallel builds #19

@jnasbyupgrade

Description

@jnasbyupgrade

Problem

The versioned SQL file generation rule in control.mk.sh uses a > (truncate) followed by >> (append) pattern:

echo "	@echo '/* DO NOT EDIT - AUTO-GENERATED FILE */' > \$(EXTENSION_${ext}_VERSION_FILE)"
echo "	@cat sql/${ext}.sql >> \$(EXTENSION_${ext}_VERSION_FILE)"

This produces a Make rule like:

$(EXTENSION_foo_VERSION_FILE): sql/foo.sql foo.control
	@echo '/* DO NOT EDIT - AUTO-GENERATED FILE */' > $(EXTENSION_foo_VERSION_FILE)
	@cat sql/foo.sql >> $(EXTENSION_foo_VERSION_FILE)

If Make executes this rule more than once (e.g., parallel builds triggering the same target from different dependency chains), the second invocation's cat >> appends to the already-complete file, doubling its content.

Observed Impact

test_factory--1.0.0.sql was found with 527 lines (doubled) instead of the correct 264 lines. The second half was an exact copy of sql/test_factory.sql, consistent with the append running twice.

Suggested Fix

Use a subshell so the entire output is captured with a single > redirect:

$(EXTENSION_foo_VERSION_FILE): sql/foo.sql foo.control
	@(echo '/* DO NOT EDIT - AUTO-GENERATED FILE */'; cat sql/foo.sql) > $(EXTENSION_foo_VERSION_FILE)

This is safe regardless of how many times the rule fires — each invocation writes the complete correct content via a single redirect.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions