Skip to content

#4116 fix(postgres): SHOW server_version returns proper value for SQLAlchemy#4117

Merged
robfrank merged 3 commits into
mainfrom
fix/4116-sqlalchemy-show-server-version
May 6, 2026
Merged

#4116 fix(postgres): SHOW server_version returns proper value for SQLAlchemy#4117
robfrank merged 3 commits into
mainfrom
fix/4116-sqlalchemy-show-server-version

Conversation

@robfrank
Copy link
Copy Markdown
Collaborator

@robfrank robfrank commented May 6, 2026

Summary

  • Fixes error on python sqlalchemy #4116: SHOW server_version over the PostgreSQL wire protocol now returns column server_version with value 12.0 so that SQLAlchemy 2.x (postgresql+psycopg://) can complete engine.connect() instead of failing with TypeError: expected string or bytes-like object, got 'NoneType'.
  • queryCommand() (simple-query 'Q') gains a SHOW branch; parseCommand() generic SHOW branch now uses the requested variable name as the column instead of the misleading CURRENT_SCHEMA.
  • New helper getShowConfigValue() maps known PostgreSQL runtime parameters (server_version, standard_conforming_strings, integer_datetimes, client_encoding, server_encoding, timezone, transaction isolation level).

Test plan

  • mvn test -f postgresw/pom.xml -Dtest=PostgresProtocolIT -DskipITs=false (65/65 pass, including new showServerVersion and showStandardConformingStrings)
  • mvn test -f postgresw/pom.xml -DskipITs=false (247/247 pass, no regressions)
  • CI runs e2e-python/tests/test_sqlalchemy.py against the freshly built image to verify SQLAlchemy + psycopg3 connectivity end-to-end.

…Alchemy

SQLAlchemy 2.x calls SHOW server_version during connection initialization
and feeds the scalar result into a regex. Two defects in PostgresNetworkExecutor
caused scalar() to return None (TypeError on re.match):

- queryCommand() (simple-query 'Q') had no SHOW handler, so the query fell
  through to ArcadeDB SQL which has no SHOW statement and returned an empty
  result set.
- parseCommand() generic SHOW branch returned column "CURRENT_SCHEMA" with
  the database name as value, ignoring the requested variable.

Both paths now extract the variable name and resolve it via the new
getShowConfigValue() helper, which maps known PG runtime parameters
(server_version, standard_conforming_strings, integer_datetimes,
client_encoding, server_encoding, timezone, transaction isolation level)
to their correct values.

Tests:
- PostgresProtocolIT#showServerVersion / showStandardConformingStrings
- e2e-python/tests/test_sqlalchemy.py covering engine.connect(), SELECT,
  CREATE/INSERT via SQLAlchemy + psycopg3
@codacy-production
Copy link
Copy Markdown

codacy-production Bot commented May 6, 2026

Not up to standards ⛔

🔴 Issues 4 high · 3 minor

Alerts:
⚠ 7 issues (≤ 0 issues of at least minor severity)

Results:
7 new issues

Category Results
Documentation 3 minor
Security 4 high

View in Codacy

🟢 Metrics 12 complexity

Metric Results
Complexity 12

View in Codacy

🟢 Coverage 69.23% diff coverage · -7.78% coverage variation

Metric Results
Coverage variation -7.78% coverage variation
Diff coverage 69.23% diff coverage

View coverage diff in Codacy

Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (7ce2cd0) 123678 90871 73.47%
Head commit (9c0f1c1) 155101 (+31423) 101893 (+11022) 65.69% (-7.78%)

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#4117) 39 27 69.23%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements support for several PostgreSQL SHOW commands and adds SQLAlchemy integration tests. The review feedback highlights several areas for improvement: using specific Docker image tags for deterministic testing, making command parsing more robust against leading whitespace, unifying version strings, and ensuring consistent naming and behavior for configuration parameters like transaction isolation levels and unknown variables.

I am having trouble creating individual review comments. Click here to see my feedback.

e2e-python/tests/test_sqlalchemy.py (25)

medium

Using the latest tag for the Docker image in tests can lead to non-deterministic results and makes it difficult to reproduce failures. It is recommended to use a specific version tag or a variable that identifies the image built from the current branch/PR to ensure the tests are running against the intended code changes.

postgresw/src/main/java/com/arcadedb/postgres/PostgresNetworkExecutor.java (481)

medium

If the query includes a language prefix followed by a space (e.g., {sql} SHOW server_version), query.query will contain a leading space, causing this startsWith check to fail. It is recommended to trim the query string before performing these checks. Additionally, there is an inconsistency between the hardcoded 11.0.0 version in SELECT VERSION() (line 478) and the new PG_SERVER_VERSION (12.0). Both should ideally be unified.

postgresw/src/main/java/com/arcadedb/postgres/PostgresNetworkExecutor.java (1148)

medium

Similar to the issue in queryCommand, if the query has leading whitespace (e.g., after a language prefix), the startsWith("SHOW ") check at line 1147 will fail. Trimming the query string before checking the prefix would make the command recognition more robust.

postgresw/src/main/java/com/arcadedb/postgres/PostgresNetworkExecutor.java (1359)

medium

The isolation level is returned here in lowercase. However, the existing special case in parseCommand (line 1145) returns it in uppercase and uses the column name LEVEL. In queryCommand, the column name will be transaction isolation level. This inconsistency should be addressed. Consider using a consistent column name like transaction_isolation and a consistent value format to align with standard PostgreSQL behavior.

postgresw/src/main/java/com/arcadedb/postgres/PostgresNetworkExecutor.java (1360)

medium

Returning database.getName() as a default for any unknown SHOW variable is misleading, as it doesn't represent the actual configuration parameter requested. PostgreSQL typically returns an error for unknown configuration parameters. Consider returning an empty string or throwing an exception if the variable is not recognized, or at least documenting why the database name is used as a fallback.

@claude
Copy link
Copy Markdown

claude Bot commented May 6, 2026

Code Review - PR #4117: fix(postgres): SHOW server_version returns proper value for SQLAlchemy

Overall: Good, targeted fix for a real SQLAlchemy compatibility issue. The approach is clean and the new tests validate the core behaviour. A few things worth addressing before merge.


Correctness

Version inconsistency between SELECT VERSION() and SHOW server_version

PG_SERVER_VERSION = "12.0" is correctly used for SHOW server_version and sendServerParameter, but SELECT VERSION() still returns the hardcoded "11.0.0" string in both queryCommand() (line 478) and parseCommand() (line 1137). Clients querying both paths will see conflicting version values. Both should use the constant:

resultSet = new IteratorResultSet(createResultSet("VERSION", PG_SERVER_VERSION).iterator());
// and
createResultSet(portal, "VERSION", PG_SERVER_VERSION);

Column name inconsistency for SHOW TRANSACTION ISOLATION LEVEL

After this PR, SHOW TRANSACTION ISOLATION LEVEL returns different column names depending on which wire-protocol path is used:

  • queryCommand() (simple query, 'Q'): column = transaction isolation level, value = lowercase
  • parseCommand() (extended query): column = LEVEL, value = uppercase (pre-existing special case at line 1142)

The getShowConfigValue() "transaction isolation level" branch is therefore only reachable via queryCommand(). Consider consolidating: remove the special case from parseCommand() and let the generic branch handle it, or ensure both paths produce the same column name. The existing showTransactionIsolationLevel test uses rs.getString("LEVEL") - if the parseCommand() path is unified with the generic one, that test column name would need updating too.

Default case in getShowConfigValue() returns database name

default -> database.getName() silently returns the database name for any unrecognized SHOW parameter. PostgreSQL raises an error for unknown runtime parameters. While this preserves the pre-existing behaviour, it can mislead clients. A more explicit fallback (empty string, or a logged warning) would be safer long-term.


Python E2E Test Issues

Missing container teardown - the setup fixture starts the container but never stops it:

@pytest.fixture(scope="module", autouse=True)
def setup(request):
    arcadedb.start()
    wait_for_http_endpoint(arcadedb, "/api/v1/ready", 2480, 204, 60)
    # Missing: yield / cleanup

Should use yield with cleanup:

@pytest.fixture(scope="module", autouse=True)
def setup():
    arcadedb.start()
    wait_for_http_endpoint(arcadedb, "/api/v1/ready", 2480, 204, 60)
    yield
    arcadedb.stop()

Redundant import: both import time and from time import sleep are present. Replace sleep(1) with time.sleep(1) and drop the from time import sleep line.

Test isolation: test_sqlalchemy_create_and_insert creates type SaProduct with no cleanup. CREATE DOCUMENT TYPE IF NOT EXISTS handles re-runs safely, but inserts accumulate rows across runs so assert len(rows) >= 1 will pass with stale data. Not a blocker, but worth noting.

Wait timeout for OpenBeer import: the /api/v1/ready check uses a 60-second timeout. The OpenBeer dataset import can exceed that in slower CI environments - consider raising it (e.g. to 120s) or documenting the expected range.


Minor Nit

The queryCommand() SHOW branch calls query.query.toUpperCase(Locale.ENGLISH).startsWith("SHOW "), allocating a full uppercase string just to test the prefix. The same pattern already exists for SET in the same method so this is consistent with existing style - just worth cleaning up alongside the SET case in a follow-on, as parseCommand() avoids this by pre-computing upperCaseText.


What's Good

  • Reuses the existing PG_SERVER_VERSION constant rather than introducing a second hardcoded version string.
  • Correct use of Locale.ENGLISH throughout.
  • The switch expression in getShowConfigValue() is clean and easy to extend.
  • The parseCommand() fix (wrong CURRENT_SCHEMA column returned for all SHOW commands) corrects a genuine bug.
  • New JUnit tests follow the project's AssertJ style and reference the constant directly, making future version bumps straightforward.

- SELECT VERSION() now returns PG_SERVER_VERSION ("12.0") consistent with
  SHOW server_version and the startup ParameterStatus, instead of the
  hardcoded "11.0.0" that conflicted with the rest of the protocol surface.
- queryCommand() gains a SHOW TRANSACTION ISOLATION LEVEL special case
  matching parseCommand(), so both wire-protocol paths return column "LEVEL"
  with the same uppercase value. The dead "transaction isolation level"
  branch in getShowConfigValue() is removed.
- getShowConfigValue() default now returns "" instead of database.getName()
  for unknown PostgreSQL runtime parameters - returning the database name
  for arbitrary SHOW <var> was misleading.
- getLanguageAndQuery() trims after stripping the {language} prefix so
  "{sql} SHOW server_version" no longer fails the prefix checks.
- selectVersion test now asserts the unified PG_SERVER_VERSION value.
@robfrank
Copy link
Copy Markdown
Collaborator Author

robfrank commented May 6, 2026

Review feedback addressed in 067abd9:

Fixed:

Deferred / not changed:

  • Specific Docker tag (Gemini build support #1) - matches the established pattern in test_arcadedb.py. Pinning here without changing the rest of the module would be inconsistent; worth a follow-up that wires the locally built image into CI.
  • Python fixture teardown / redundant time imports / 60s ready timeout (Claude bot Bump mongo-java-driver from 3.12.4 to 3.12.10 #4-Bump postgresql from 42.2.22 to 42.2.23 #7) - all match the existing convention in test_arcadedb.py and test_asyncpg.py. Testcontainers' Ryuk handles container cleanup. Diverging in just one file would create local inconsistency.

PostgresProtocolIT 65/65 still pass.

@claude
Copy link
Copy Markdown

claude Bot commented May 6, 2026

Code Review - PR #4117: fix(postgres): SHOW server_version returns proper value for SQLAlchemy

Overview

This PR fixes a real SQLAlchemy 2.x connectivity issue by making SHOW server_version return a proper string value over the PostgreSQL wire protocol. The approach is clean: introduce a PG_SERVER_VERSION constant, add a getShowConfigValue() helper for known runtime parameters, and fix the generic SHOW handler that was incorrectly returning CURRENT_SCHEMA as the column name for all variables.


Positives

  • PG_SERVER_VERSION constant eliminates the previous duplicated hardcoded string and makes future version bumps a one-line change.
  • getShowConfigValue() switch expression is concise and handles the parameters SQLAlchemy probes during connection setup.
  • Returning an empty string for unknown parameters is better than the old behavior of returning the database name.
  • The getLanguageAndQuery() .trim() fix is a small but sensible defensive improvement.
  • Unit tests for the two new SHOW commands are well-structured and follow project conventions.

Issues

1. Version format mismatch (breaking change risk)

PG_SERVER_VERSION = "12.0" (two-part) replaces the old "11.0.0" (three-part). Clients that parse the version string with a regex expecting three numeric groups (e.g., (\d+)\.(\d+)\.(\d+)) will break. The real PostgreSQL format is three parts: 14.0 is actually 14.0.0 in some contexts. Also, PostgreSQL 12 is EOL; consider bumping to "14.0" or "15.0" if no specific constraint requires 12.

2. SHOW TRANSACTION ISOLATION LEVEL naming inconsistency

The specific case in both queryCommand() and parseCommand() returns column name "LEVEL". Real PostgreSQL returns column "transaction_isolation" with a lowercase value. This is pre-existing but now more visible since the PR adds getShowConfigValue() which is expected to be the central place for these values. Consider aligning column name and casing with PostgreSQL for clients that inspect column metadata.

3. e2e test: missing container teardown

@pytest.fixture(scope="module", autouse=True)
def setup(request):
    arcadedb.start()
    wait_for_http_endpoint(arcadedb, "/api/v1/ready", 2480, 204, 60)
    # Missing: yield + arcadedb.stop()

The container is started but never explicitly stopped. It will linger for the duration of the test session rather than cleaning up when the module fixture exits. Add a yield and a finalizer:

@pytest.fixture(scope="module", autouse=True)
def setup(request):
    arcadedb.start()
    wait_for_http_endpoint(arcadedb, "/api/v1/ready", 2480, 204, 60)
    yield
    arcadedb.stop()

4. e2e test: latest Docker image is non-deterministic

arcadedb = DockerContainer("arcadedata/arcadedb:latest")

Using latest means the e2e test may pass against a previously released image while the current PR's fix is not yet tested. The test plan item is marked unchecked (- [ ] CI runs ...) which suggests this is intentional for now, but it's worth noting as a gap.

5. e2e test: redundant imports and minor style

import time
from time import sleep

sleep is already available via import time as time.sleep(). Pick one form. Similarly, the wait_for_http_endpoint helper uses both time.time() and sleep() - pick time.time() + time.sleep() or from time import time, sleep.

6. e2e test: testcontainers package not declared

testcontainers is used in test_sqlalchemy.py but is not listed in e2e-python/pyproject.toml dependencies. If this package is already declared elsewhere in the project that's fine, but it should appear alongside sqlalchemy in the new dependency block.

7. e2e test: ArcadeDB-specific SQL may not round-trip through SQLAlchemy

result = conn.execute(text("SELECT FROM Beer LIMIT 5"))
rows = result.fetchall()
assert len(rows) == 5

SELECT FROM Beer (without column list) is ArcadeDB-specific syntax. SQLAlchemy's result proxy will attempt to read column metadata from the row description; if the server returns no columns or unexpected column descriptors, fetchall() may return empty tuples rather than a len == 5 list. This test may be fragile - worth verifying the actual tuple contents, or switching to SELECT name FROM Beer LIMIT 5.


Minor Suggestions

  • The queryCommand() SHOW branch uses query.query.toUpperCase(Locale.ENGLISH).startsWith("SHOW ") while the specific transaction isolation case uses equalsIgnoreCase. For consistency, the upper-case conversion for the startsWith check could be extracted to a local variable.
  • The getShowConfigValue() comment in the PR description mentions "transaction isolation level" as a supported parameter, but it is not in the switch (the specific equalsIgnoreCase check above catches it first). This is not a bug, but the docstring/comment could clarify the intent.

Summary

The core fix is correct and well-targeted. The main items worth addressing before merge are the container teardown in the e2e test, the testcontainers dependency declaration, and the version string format. The SHOW TRANSACTION ISOLATION LEVEL column name inconsistency is a pre-existing issue but easy to fix in the same pass.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 6, 2026

Codecov Report

❌ Patch coverage is 30.76923% with 27 lines in your changes missing coverage. Please review.
✅ Project coverage is 64.49%. Comparing base (7ce2cd0) to head (9c0f1c1).
⚠️ Report is 10 commits behind head on main.

Files with missing lines Patch % Lines
...com/arcadedb/postgres/PostgresNetworkExecutor.java 30.76% 12 Missing and 15 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #4117      +/-   ##
==========================================
- Coverage   64.49%   64.49%   -0.01%     
==========================================
  Files        1624     1627       +3     
  Lines      123678   123752      +74     
  Branches    26343    26362      +19     
==========================================
+ Hits        79762    79809      +47     
- Misses      32837    32859      +22     
- Partials    11079    11084       +5     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

…ries

The first round of the fix addressed SHOW server_version but missed the
actual queries SQLAlchemy 2.x sends. End-to-end testing with the locally
built image revealed three additional gaps:

- SQLAlchemy issues `select pg_catalog.version()` (not `select version()`).
  This was caught by handlePgTypeQuery() (matches "PG_CATALOG") and returned
  an empty list, so scalar() was None and SQLAlchemy's PostgreSQL/EnterpriseDB
  regex hit re.match(pattern, None) -> TypeError. Both queryCommand() and
  parseCommand() now match SELECT [PG_CATALOG.]VERSION() and return a proper
  "PostgreSQL X.Y (ArcadeDB Z)" string so SQLAlchemy's regex matches.
  Same treatment for SELECT [PG_CATALOG.]CURRENT_SCHEMA().
- SELECT VERSION() and SELECT CURRENT_SCHEMA() comparisons in queryCommand()
  were case-sensitive (.equals); psycopg3 sends lowercase. Switched to
  equalsIgnoreCase / cached upperCaseText to match parseCommand() behaviour.
- After fetching the version, psycopg3 wraps subsequent type-info lookups in
  SAVEPOINT/RELEASE/ROLLBACK TO. Only SAVEPOINT was treated as a no-op, and
  only in parseCommand(). queryCommand() now ignores all three forms, and
  parseCommand() also accepts the bare `RELEASE name` / `ROLLBACK TO name`
  variants psycopg3 emits.

Column names returned for VERSION/CURRENT_SCHEMA changed to lowercase to
match real PostgreSQL.
@robfrank
Copy link
Copy Markdown
Collaborator Author

robfrank commented May 6, 2026

CI surfaced the actual end-to-end picture I'd missed. Pushed 9c0f1c12d.

The earlier SHOW server_version work was correct but irrelevant to SQLAlchemy 2.x's startup path. With Postgres debug logging enabled against the locally built image I traced the real queries:

  1. select pg_catalog.version() - was caught by handlePgTypeQuery() (matches "PG_CATALOG") and returned an empty list -> scalar() None -> re.match(...) TypeError. Added explicit handling in both protocol paths.
  2. select VERSION() was case-sensitive in queryCommand() (psycopg3 sends lowercase). Switched to equalsIgnoreCase and reused the cached upperCaseText.
  3. After version was fetched, psycopg3 wraps _type_info_fetch("hstore") in SAVEPOINT/RELEASE/ROLLBACK TO. Only SAVEPOINT was a no-op, and only in parseCommand(). Both paths now ignore all three forms (incl. the bare RELEASE name / ROLLBACK TO name syntax psycopg3 actually emits).

SELECT version() and SELECT current_schema() now return lowercase column names matching real PostgreSQL. The version body is PostgreSQL 12.0 (ArcadeDB <build>) so SQLAlchemy's (?:PostgreSQL|EnterpriseDB) (\d+)\.?(\d+)? regex resolves cleanly to (12, 0).

Verified end-to-end with the locally built image:

  • mvn verify -f postgresw/pom.xml 168/168 unit + 67/67 IT pass.
  • pytest e2e-python/tests/test_sqlalchemy.py 3/3 pass against arcadedata/arcadedb:latest rebuilt from this branch.

@claude
Copy link
Copy Markdown

claude Bot commented May 6, 2026

Code Review

Overview

This PR fixes issue #4116 where SHOW server_version over the PostgreSQL wire protocol returned null, causing SQLAlchemy 2.x to fail with TypeError: expected string or bytes-like object, got 'NoneType'. The core fix is replacing the broken generic SHOW handler (which always returned the database name regardless of the variable requested) with a proper getShowConfigValue() dispatch map.

The changes are well-scoped and the approach is sound. A few issues and observations are noted below.


Bugs / Correctness

1. Silent empty-string fallback for unknown SHOW variables

getShowConfigValue() returns "" for any unrecognized variable name:

default -> "";

Real PostgreSQL responds with an error for unknown SHOW parameters. Silently returning an empty string will confuse drivers that validate the response - they may interpret it as "the variable exists but is empty" rather than "unsupported". Consider returning null and writing an error response via writeError(), or at minimum logging a warning.

2. SHOW transaction_isolation not handled

PostgreSQL supports two forms for isolation level:

  • SHOW TRANSACTION ISOLATION LEVEL (multi-word, handled explicitly)
  • SHOW transaction_isolation (single-word alias, commonly used by ORMs)

The single-word form would fall into getShowConfigValue() with varName = "transaction_isolation" and silently return "". Adding this case to the switch would close the gap:

case "transaction_isolation" -> "read committed";

3. SHOW TRANSACTION ISOLATION LEVEL column name inconsistency

Both queryCommand() and parseCommand() (pre-existing code, not changed in this PR) return column name "LEVEL" for this query. Real PostgreSQL returns column name transaction_isolation. This is not introduced by this PR, but the inconsistency may surface with the same SQLAlchemy clients this PR is trying to unblock.

4. E2E test: no container teardown

In test_sqlalchemy.py:

@pytest.fixture(scope="module", autouse=True)
def setup(request):
    arcadedb.start()
    wait_for_http_endpoint(arcadedb, "/api/v1/ready", 2480, 204, 60)

There is no arcadedb.stop() call. While Testcontainers Ryuk will eventually reap the container, explicit teardown is cleaner and avoids port conflicts on long-lived CI machines. Use a finalizer:

    request.addfinalizer(arcadedb.stop)

5. E2E test: potential race condition on dataset availability

wait_for_http_endpoint polls /api/v1/ready (HTTP 204), but the Beer dataset is loaded via a background import URL. The server can be "ready" before the import completes, making test_sqlalchemy_query_existing_data flaky under slow networks.


Minor / Style

6. Column name for SELECT VERSION() changed from "VERSION" to "version"

This is correct - PostgreSQL returns lowercase column names here - but it is a behavior change that could break clients that were accessing the column by name using the old uppercase key. Worth noting in the CHANGELOG.

7. Missing tests for new queryCommand() branches

The PR adds RELEASE and ROLLBACK TO handling inside queryCommand() (the simple-query path) but there are no tests covering those branches. They return an empty result set, so a regression would be silent.

8. Missing test for SELECT PG_CATALOG.VERSION() variant

The parseCommand() path handles this, but no test exercises it directly.

9. test_sqlalchemy_create_and_insert is not idempotent

CREATE DOCUMENT TYPE SaProduct IF NOT EXISTS is idempotent, but the INSERT is not. Repeated runs accumulate rows, so assert len(rows) >= 1 is fine, but the table grows across CI runs.


Good Improvements

  • Caching upperCaseText in queryCommand() is a minor but clean performance improvement over repeated .toUpperCase() calls.
  • Adding .trim() after query.substring(matcher.end()) in getLanguageAndQuery() is a defensive fix that prevents whitespace from breaking subsequent exact-match comparisons.
  • buildServerVersionString() embedding Constants.getRawVersion() gives a more informative version string than the old hardcoded "11.0.0".
  • The getShowConfigValue() switch expression is clean and extensible.
  • Test coverage for showServerVersion and showStandardConformingStrings directly validates the fix.

Summary

The core fix is correct and well-implemented. The main actionable items are:

  1. Handle SHOW transaction_isolation (single-word form) in getShowConfigValue()
  2. Return an error or log a warning for unknown SHOW variables instead of silently returning ""
  3. Add container teardown to the e2e fixture
  4. Optional: unify the SHOW TRANSACTION ISOLATION LEVEL column name to transaction_isolation for full PostgreSQL compatibility

@robfrank robfrank merged commit c485040 into main May 6, 2026
20 of 24 checks passed
tae898 pushed a commit to humemai/arcadedb-embedded-python that referenced this pull request May 10, 2026
robfrank added a commit that referenced this pull request May 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

error on python sqlalchemy

1 participant