PostgreSQL extension for BM25 relevance-ranked full-text search. Postgres OSS licensed.
This report summarizes scanner evidence for timescale/pg_textsearch, a C project with 4,023 GitHub stars. SynthScan examined 133,560 lines of code across 403 source files, recording 301 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 4.5 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 163 finding(s).
Are imports declared and package/API names verified? 8 finding(s).
Are wrappers, guards, and repeated structures necessary? 142 finding(s).
Which changes need focused human review? 301 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 301 distinct pattern matches across 9 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/scripts/logical_replication.sh | 181 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/logical_replication.sh | 183 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/logical_replication.sh | 264 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/logical_replication.sh | 266 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/logical_replication.sh | 296 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/logical_replication.sh | 298 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/logical_replication.sh | 333 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/logical_replication.sh | 335 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 64 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 67 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 98 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 101 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 146 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 149 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 183 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 186 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | test/scripts/replication_lib.sh | 278 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | test/scripts/replication_lib.sh | 293 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 364 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication_lib.sh | 366 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 39 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 41 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 117 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 119 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 158 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 160 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 187 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 189 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 255 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 262 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 319 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/replication.sh | 321 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 172 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 177 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 259 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 264 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 354 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 361 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 469 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 475 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 607 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 613 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 689 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 695 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 780 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 786 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 969 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/multi_index.sh | 971 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/segment_wal_recovery.sh | 115 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/segment_wal_recovery.sh | 117 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/segment_wal_recovery.sh | 151 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/segment_wal_recovery.sh | 158 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/segment_wal_recovery.sh | 221 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/segment_wal_recovery.sh | 227 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/segment_wal_recovery.sh | 302 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/segment_wal_recovery.sh | 304 | # ------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/wal_audit.sh | 91 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/wal_audit.sh | 93 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/wal_audit.sh | 124 | # --------------------------------------------------------------- | COMMENT |
| MEDIUM | test/scripts/wal_audit.sh | 127 | # --------------------------------------------------------------- | COMMENT |
| 70 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/scripts/shutdown_spill.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/stress.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/stress.sh | 581 | run_sql_quiet "DROP TABLE segment_test CASCADE;" | COMMENT |
| LOW | test/scripts/compression_test.c | 1 | /* | COMMENT |
| LOW | test/scripts/partial_concurrent_read.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_lib.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_lib.sh | 21 | # | COMMENT |
| LOW | test/scripts/replication_lib.sh | 281 | # The standby memtable-staleness bug only manifests for backends that | COMMENT |
| LOW | test/scripts/replication.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication.sh | 321 | # --------------------------------------------------------------- | COMMENT |
| LOW | test/scripts/multi_index.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/segment_wal_recovery.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_memtable_dead_reclaim.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_segment_reclaim.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/wal_audit.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_issue_342.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_cascading.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/multi_backend_reindex.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/multi_backend_reindex.sh | 21 | # `CacheRegisterRelcacheCallback`. Subsequent writes from that backend | COMMENT |
| LOW | test/scripts/multi_backend_reindex.sh | 1621 | # require_parallel | COMMENT |
| LOW | test/scripts/multi_backend_reindex.sh | 1681 | rewrite_steps+=$'\n' | COMMENT |
| LOW | test/scripts/replication_correctness.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/upgrade_matrix.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/upgrade_matrix.sh | 21 | # REINDEX (no crash, no silent wrong answer) and REINDEX recovers. | COMMENT |
| LOW | test/scripts/replication_concurrency.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/gen_v1_bm25vector.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | test/scripts/gen_v1_bm25vector.py | 21 | idx_name = b"compat_idx" | COMMENT |
| LOW | test/scripts/replication_parallel_build.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_spill_paths.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_spill_paths.sh | 41 | # Test 1: bulk-load PRE_COMMIT spill replication | COMMENT |
| LOW | test/scripts/replication_spill_paths.sh | 101 | if [ "${LL_AFTER}" != "2000" ]; then | COMMENT |
| LOW | test/scripts/replication_spill_paths.sh | 261 | # registry slot is empty (no other backend has touched this index | COMMENT |
| LOW | test/scripts/replication_spill_paths.sh | 341 | # --------------------------------------------------------------- | COMMENT |
| LOW | test/scripts/vacuum_concurrent_merge.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_failover.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/scripts/replication_failover.sh | 41 | return 0 | COMMENT |
| LOW | test/scripts/replication_failover.sh | 101 | log "D1 PASSED" | COMMENT |
| LOW | test/scripts/gen_nul_lexeme_bm25vector.py | 1 | #!/usr/bin/env python3 | COMMENT |
| LOW | test/scripts/gen_nul_lexeme_bm25vector.py | 41 | # explicit NUL check. | COMMENT |
| LOW | test/scripts/hypertable.sh | 1 | #!/bin/bash | COMMENT |
| LOW | test/modules/pg_textsearch_test/pg_textsearch_test.c | 1 | #include <postgres.h> | COMMENT |
| LOW | benchmarks/run_parallel_scaling.sh | 1 | #!/bin/bash | COMMENT |
| LOW | benchmarks/run_filtered_seed.sh | 1 | #!/bin/bash | COMMENT |
| LOW | benchmarks/README.md | 61 | COMMENT | |
| LOW | benchmarks/runner/extract_metrics.sh | 1 | #!/bin/bash | COMMENT |
| LOW | benchmarks/runner/run_benchmark.sh | 1 | #!/bin/bash | COMMENT |
| LOW | benchmarks/datasets/msmarco-v2/run_full_benchmark.sh | 1 | #!/bin/bash | COMMENT |
| LOW | benchmarks/datasets/msmarco-v2/run_v2_benchmark.sh | 1 | #!/bin/bash | COMMENT |
| LOW | benchmarks/datasets/msmarco-v2/profile_build.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | …arks/datasets/msmarco-v2/generate_benchmark_queries.sh | 1 | #!/bin/bash | COMMENT |
| LOW | …chmarks/datasets/msmarco/generate_benchmark_queries.sh | 1 | #!/bin/bash | COMMENT |
| LOW | …marks/datasets/msmarco/insert/run_concurrent_insert.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | …marks/datasets/msmarco/insert/run_concurrent_insert.sh | 21 | # # ParadeDB: | COMMENT |
| LOW | benchmarks/datasets/wikipedia/download.sh | 141 | ;; | COMMENT |
| LOW | scripts/bump-version.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .github/workflows/benchmark.yml | 2081 | # Runs only on failure to avoid noise on successful runs. | COMMENT |
| LOW | .github/workflows/claude-code-review.yml | 1 | name: Claude Code Review | COMMENT |
| LOW | .github/workflows/claude.yml | 41 | actions: read | COMMENT |
| LOW | .github/workflows/upgrade-tests.yml | 121 | SQL | COMMENT |
| LOW | src/mod.c | 1 | /* | COMMENT |
| 54 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/scripts/stress.sh | 599 | # Create a reference index to monitor DSA usage | COMMENT |
| MEDIUM | test/scripts/concurrency.sh | 316 | # Create the main index | COMMENT |
| MEDIUM | test/scripts/concurrency.sh | 508 | # Create a test table and index | COMMENT |
| MEDIUM | test/scripts/concurrency.sh | 570 | # Create a table with exactly 10 documents containing "racecondition" term | COMMENT |
| MEDIUM | scripts/bump-version.sh | 83 | # Create the upgrade-script stub. Authors append feature DDL as | COMMENT |
| MEDIUM | .github/workflows/benchmark.yml | 216 | # Create a query script that runs many iterations for profiling | COMMENT |
| MEDIUM | .github/workflows/benchmark.yml | 377 | # Create a temporary directory for gh-pages content | COMMENT |
| MEDIUM | .github/workflows/benchmark.yml | 408 | # Create an index.html for this profile | COMMENT |
| MEDIUM | .github/workflows/package-release.yml | 197 | # Create a build script | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/scripts/recovery.sh | 358 | # Check if we have necessary tools | COMMENT |
| LOW | test/scripts/concurrency.sh | 102 | # Check if library is readable and has correct permissions | COMMENT |
| LOW | test/scripts/concurrency.sh | 143 | # Check if port is available | COMMENT |
| LOW | test/scripts/concurrency.sh | 157 | # Check if log file exists and show contents | COMMENT |
| LOW | test/scripts/concurrency.sh | 171 | # Check if PostgreSQL is using a different log location due to our config | COMMENT |
| LOW | test/scripts/concurrency.sh | 484 | # Check if too many sessions failed | COMMENT |
| LOW | test/scripts/concurrency.sh | 541 | # Check if session 1 handled the drop gracefully | COMMENT |
| LOW | test/scripts/hypertable.sh | 30 | # Check if TimescaleDB is available | COMMENT |
| LOW | test/scripts/hypertable.sh | 162 | # Check if CustomScan is in the plan (may or may not be depending on TimescaleDB version) | COMMENT |
| LOW | benchmarks/run_parallel_scaling.sh | 27 | # Check if data exists | COMMENT |
| LOW | benchmarks/run_cranfield.sh | 30 | # Check if pg_textsearch extension is available | COMMENT |
| LOW | benchmarks/run_memory_stress.sh | 18 | # Check if pg_textsearch extension is available | COMMENT |
| LOW | …arks/datasets/msmarco-v2/generate_benchmark_queries.sh | 23 | # Check if queries file exists | COMMENT |
| LOW | …chmarks/datasets/msmarco/generate_benchmark_queries.sh | 23 | # Check if queries file exists | COMMENT |
| LOW | .github/workflows/release.yml | 211 | # Check if release exists | COMMENT |
| LOW | .github/workflows/package-release.yml | 417 | # Check if release exists, create if it doesn't | COMMENT |
| LOW | .github/workflows/ci.yml | 696 | # Check if postgres binary contains sanitizer symbols | COMMENT |
| LOW | .github/workflows/sanitizer-build-and-test.yml | 92 | # Check if postgres binary contains sanitizer symbols | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/scripts/build_memory_benchmark_test.py | 28 | def test_process_memory_uses_pss_not_shared_rss(self): | CODE |
| LOW⚡ | test/scripts/build_memory_benchmark_test.py | 43 | def test_exited_process_is_not_reported_as_zero_memory(self): | CODE |
| LOW⚡ | test/scripts/build_memory_benchmark_test.py | 49 | def test_malformed_memory_sample_is_an_error(self): | CODE |
| LOW⚡ | test/scripts/build_memory_benchmark_test.py | 57 | def test_peak_is_maximum_concurrent_sum_not_sum_of_peaks(self): | CODE |
| LOW | test/scripts/build_memory_benchmark_test.py | 73 | def test_empty_measurements_are_not_published_as_zero(self): | CODE |
| LOW | test/scripts/build_memory_benchmark_test.py | 78 | def test_cgroup_snapshot_preserves_limits_and_oom_events(self): | CODE |
| LOW | test/scripts/build_memory_benchmark_test.py | 95 | def test_invalid_options_fail_before_creating_output(self): | CODE |
| LOW | test/scripts/build_memory_benchmark_test.py | 116 | def test_small_serial_case_does_not_require_parallel_rows(self): | CODE |
| LOW | test/scripts/build_memory_benchmark_test.py | 126 | def test_missing_postgres_tools_record_failure(self): | CODE |
| LOW | test/scripts/build_memory_benchmark_test.py | 144 | def test_default_parallel_degree_is_not_reduced_for_small_heap(self): | CODE |
| LOW | test/scripts/build_memory_benchmark_test.py | 162 | def test_success_records_metrics_and_cleans_up(self): | CODE |
| LOW | test/scripts/build_memory_benchmark_test.py | 183 | def test_timeout_records_failure_and_cleans_up(self): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | test/scripts/replication_lib.sh | 287 | # Usage: | COMMENT |
| LOW | test/scripts/upgrade_matrix.sh | 28 | # Usage: | COMMENT |
| LOW | benchmarks/run_parallel_scaling.sh | 4 | # Usage: | COMMENT |
| LOW | benchmarks/run_filtered_seed.sh | 14 | # Usage: | COMMENT |
| LOW | benchmarks/runner/run_benchmark.sh | 5 | # Usage: | COMMENT |
| LOW | benchmarks/datasets/msmarco-v2/profile_build.sh | 5 | # Usage: | COMMENT |
| LOW | …marks/datasets/msmarco/insert/run_concurrent_insert.sh | 17 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test/scripts/multi_backend_reindex.sh | 1585 | SELECT 'row ' || g || ' lorem ipsum dolor sit amet ' | CODE |
| LOW | test/scripts/multi_backend_reindex.sh | 1585 | SELECT 'row ' || g || ' lorem ipsum dolor sit amet ' | CODE |
| LOW | test/scripts/multi_backend_reindex.sh | 1605 | SELECT 'parallel row ' || g || ' lorem ipsum dolor sit amet ' | CODE |
| LOW | test/scripts/multi_backend_reindex.sh | 1605 | SELECT 'parallel row ' || g || ' lorem ipsum dolor sit amet ' | CODE |
| LOW⚡ | test/sql/quoted_identifiers.sql | 14 | INSERT INTO qi_test1 (content) VALUES ('lorem ipsum dolor sit amet'); | CODE |
| LOW⚡ | test/sql/quoted_identifiers.sql | 14 | INSERT INTO qi_test1 (content) VALUES ('lorem ipsum dolor sit amet'); | CODE |
| LOW⚡ | test/sql/quoted_identifiers.sql | 16 | INSERT INTO qi_test1 (content) VALUES ('lorem ipsum again'); | CODE |
| LOW | test/sql/quoted_identifiers.sql | 66 | UPDATE qi_test1 SET content = 'updated lorem ipsum' WHERE id = 1; | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | test/scripts/replication_segment_reclaim.sh | 17 | # Uses the shared replication harness (replication_lib.sh). Asserts | COMMENT |
| MEDIUM | test/scripts/upgrade_matrix.sh | 5 | # For each old release, this harness builds several distinct on-disk | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | benchmarks/run_build_memory.py | 237 | CODE |