Repository navigation
Run Savor and Wayline on PostgreSQL and MySQL, and fix what they found - #6066
Conversation
The samples' server tests only ran on in-memory SQLite, which accepts any declared column type and has no collations, so neither sample started on a real database while CI stayed green. - Entities declare the column type their migration uses (VARCHAR(n), SMALLINT), which the ORM's schema validation requires since #6036. - A V0 migration gives MySQL/MariaDB a case-sensitive NO PAD collation before any table exists; the other engines get a no-op script. - MySql sends a parameterless statement the server refuses to prepare (error 1295, e.g. ALTER DATABASE) as text, as Flyway would. - PushTest no longer puts two couriers/drivers at the same point. - New backend-database CI job (postgresql, mysql) for both samples, and the ORM paths added to their workflow filters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5b620137d7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
A V0 script would never reach a deployment that already applied the later versions (out-of-order migrations are refused), and changing the database default alone leaves existing tables on the old collation. Savor's V10 and Wayline's V8 now set the default and convert every table. The database test helper also defaults the MySQL port to 3306 when the URL omits it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8a27b0cbd5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Cloudflare Preview
|
|
Compared 185 screenshots: 185 matched. Benchmark ResultsDetailed Performance Metrics
|
|
Compared 206 screenshots: 206 matched. |
✅ Continuous Quality ReportTest & Coverage
Static Analysis
Generated automatically by the PR CI workflow. |
|
Compared 185 screenshots: 185 matched. Benchmark ResultsDetailed Performance Metrics
ParparVM vs HotSpot (JDK 25): Windows x64Runner CPU: Intel64 Family 6 Model 207 Stepping 2, GenuineIntel (baseline 1 performance regression:
Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in
A change that moves performance ON PURPOSE records the new baseline in Result: performance regression |
|
Compared 185 screenshots: 185 matched. ParparVM vs HotSpot (JDK 25): Linux x64Runner CPU: AMD EPYC 9V74 80-Core Processor (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in
Result: no regression |
|
Compared 185 screenshots: 185 matched. ParparVM vs HotSpot (JDK 25): Linux arm64Runner CPU: Neoverse-N2 (baseline Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 15% (time) / 15% (RAM) away from its baseline in
Result: no regression |
…s, parse reset URLs fully Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Developer Guide build artifacts are available for download from this workflow run:
Developer Guide quality checks: |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: dc9c97128c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… reset, hyphenate case-sensitive Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 49d2dc0622
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…tabase.Url does Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f46d63c8f3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| fi | ||
| case "$URL" in | ||
| postgres://*|postgresql://*) | ||
| psql "$URL" -q -v ON_ERROR_STOP=1 \ |
There was a problem hiding this comment.
Preserve PostgreSQL's verified TLS semantics
When a remote PostgreSQL test URL uses the backend's default prefer or sslmode=require, passing it unchanged to psql weakens the connection policy before executing DROP SCHEMA: this backend verifies the certificate and hostname and refuses verification failures, whereas libpq documents that prefer can fall back to plaintext and that only verify-full verifies both the CA and hostname (PostgreSQL connection documentation). Translate the backend modes to equivalent libpq settings so the reset cannot expose credentials or run destructive SQL against an endpoint the server would reject.
Useful? React with 👍 / 👎.
| fi | ||
| case "$URL" in | ||
| postgres://*|postgresql://*) | ||
| psql "$URL" -q -v ON_ERROR_STOP=1 \ |
There was a problem hiding this comment.
Normalize backend-only options before invoking psql
When CN1_TEST_DATABASE_URL contains options accepted by Database.Url, such as connectTimeout, socketTimeout, or the sslca alias, this direct psql invocation rejects the otherwise valid backend URL before any tests run. Libpq requires every URI parameter to match one of its own keywords and, for example, spells its timeout connect_timeout in seconds (PostgreSQL URI documentation); parse and translate or remove backend-only parameters before passing the URL to psql.
Useful? React with 👍 / 👎.
| parts="$(python3 -c ' | ||
| import sys, urllib.parse as u | ||
| p = u.urlsplit(sys.argv[1]) | ||
| q = dict(u.parse_qsl(p.query)) |
There was a problem hiding this comment.
Decode MySQL query overrides like the backend
The current override fix uses parse_qsl, whose form semantics turn a literal + into a space and drop blank values by default, while Database.Url.applyQuery performs percent-decoding only and accepts empty overrides. Thus a valid URL such as ...?password=a+b or ...?password= makes the reset authenticate differently from the server, potentially failing the test run or issuing the destructive reset under the authority credentials; parse these values with the backend's percent-only semantics instead.
Useful? React with 👍 / 👎.
✅ ByteCodeTranslator Quality ReportTest & Coverage
Benchmark Results
Static Analysis
Generated automatically by the PR CI workflow. |
Savor and Wayline did not start on PostgreSQL or MySQL. Every CI run stayed green, because the samples' server tests only ran on in-memory SQLite.
What was wrong
validateSchemarefuses an undeclaredStringfield on aVARCHAR(n)column and aninton aSMALLINT. A longer value would be rejected by PostgreSQL or strict MySQL, and silently truncated by permissive MySQL. Savor had 154 such fields and Wayline 101. SQLite ignores declared types, so the tests never saw it.utf8mb4_0900_ai_ci, and the ORM refuses a text key under a collation that folds case or pads.MySqlsent every statement as a prepared statement, and MySQL will not prepareALTER DATABASE(error 1295). Flyway, whose scripts these are, runs such statements as text.PushTesthad two tests putting a courier or driver at the same Reykjavik coordinates. Distances tied, and SQLite's insertion-order rows hid which one got the offer.savor.ymlnorwayline.ymllistedCodenameOne/src/com/codename1/impl/orm/**in itspathsfilter, so ORM: adopt existing schemas (native dates, schema report, private callbacks) #6036 did not trigger them.Changes
@Column(type = ...)matching its migration. The ORM's check is unchanged.V0__collation.sqlper sample. The MySQL version sets the database collation,/*!80000 utf8mb4_0900_bin */ /*M!100400 utf8mb4_nopad_bin */, and one file serves both server families. The SQLite and PostgreSQL versions areSELECT 1;, because every version needs a script for each engine.MySql.runPrepared: a statement the server refuses to prepare (1295) that binds no parameters and returns no rows is sent through COM_QUERY instead. Nothing ran at that point, and with no parameters nothing can be spliced into the text.PushTest: the second test moved to a city of its own (Edinburgh).scripts/ci/sample-server-tests-on-database.sh: runs a sample's server tests against apostgres://ormysql://database, emptying the schema before each test class. The tests assume the fresh database an in-memory SQLite gives every class.backend-databasematrix job (postgresql,mysql) insavor.ymlandwayline.yml. MySQL is the runner's own 8.0 with amysql_native_passworduser: a service container cannot take server options, and 8.4 turns that plugin off. The ORM, annotations, SQL-client and script paths are added to both filters.Backend-Data.asciidocexplains the MySQL collation script.Verified locally
🤖 Generated with Claude Code