Commit Graph

18 Commits

Author SHA1 Message Date
Ciro Spaciari
84a4c468bb fix parseurlForAdapter 2025-08-30 12:07:23 -07:00
Ciro Spaciari
95130eee87 fix linter 2025-08-30 12:07:23 -07:00
autofix-ci[bot]
e75de029a0 [autofix.ci] apply automated fixes 2025-08-30 12:07:23 -07:00
Claude Bot
e34ba78ac2 Fix SQL options precedence: explicit options override URL parameters
- Fix precedence logic so explicit options (hostname, port, username, password, database)
  now correctly override URL parameters instead of the other way around
- Add 10 comprehensive tests verifying explicit options take precedence over URL parameters
- Test both PostgreSQL and MySQL adapters with various combinations of explicit options
- Test alternative option names (host, user, pass, db)
- Ensure explicit options still take precedence even when environment variables are present
- All 43 adapter tests and 29 main SQL tests continue to pass

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 12:07:23 -07:00
Claude Bot
35983fc86d Complete SQL options parsing refactor
- Separate adapter detection from options parsing
- Fix DATABASE_URL precedence over explicit options
- Add comprehensive MySQL environment variable support
- Add adapter-protocol validation with proper error handling
- Ensure all 33 adapter tests and 240+ SQL tests pass

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 12:07:23 -07:00
Claude Bot
3e4777de85 feat: Add comprehensive adapter-protocol validation with conflict detection
Added comprehensive tests and validation for adapter-protocol compatibility:

**New Test Coverage:**
-  Explicit adapter with URL without protocol (should work)
-  Explicit adapter with matching protocol (should work)
-  Adapter conflicts with protocol (should throw error)
-  Unix socket protocol with explicit adapter (should work)
-  SQLite protocol with sqlite adapter (should work)

**Error Cases Added:**
- `mysql` adapter + `postgres://` → throws "Protocol 'postgres' is not compatible with adapter 'mysql'"
- `postgres` adapter + `mysql://` → throws "Protocol 'mysql' is not compatible with adapter 'postgres'"
- `sqlite` adapter + `mysql://` → throws "Protocol 'mysql' is not compatible with adapter 'sqlite'"
- `mysql` adapter + `postgres://` → throws "Protocol 'postgres' is not compatible with adapter 'mysql'"

**Implementation Fix:**
- Moved adapter-protocol validation earlier in parsing process (Step 2.5)
- Now validates all adapters including SQLite before early return
- Prevents SQLite adapter bypass of validation logic
- Special handling for SQLite URL parsing in validation

**Test Results:**
- 8 new adapter-protocol validation tests - all pass
- 31 total adapter precedence tests - all pass
- 218 SQLite tests - all pass (no regressions)

This ensures users get clear error messages when mixing incompatible
adapters and protocols, improving the developer experience.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 12:07:23 -07:00
autofix-ci[bot]
1b335fc02d [autofix.ci] apply automated fixes 2025-08-30 12:07:23 -07:00
Claude Bot
8d71c5ea66 feat: Add comprehensive MySQL environment variable support
Added MySQL-specific environment variables with proper precedence:

**New MySQL Environment Variables:**
- `MYSQL_HOST` (defaults to `localhost`)
- `MYSQL_PORT` (defaults to `3306`)
- `MYSQL_USER` (with fallback to `$USER`)
- `MYSQL_PASSWORD` (defaults to empty)
- `MYSQL_DATABASE` (defaults to `mysql`)
- `MYSQL_URL` (primary connection URL)
- `TLS_MYSQL_DATABASE_URL` (SSL/TLS connection URL)

**Enhanced TLS Support:**
- Added `TLS_MYSQL_DATABASE_URL` for MySQL TLS connections
- Enhanced `TLS_DATABASE_URL` to work with MySQL protocol detection
- All TLS URLs automatically enable SSL mode

**Environment Variable Precedence:**
- MySQL-specific env vars (e.g., `$MYSQL_USER`) override generic ones (e.g., `$USER`)
- Environment variable names override URL protocols for semantic intent
- Proper URL precedence: `MYSQL_URL` > `DATABASE_URL` > `TLS_MYSQL_DATABASE_URL` > `TLS_DATABASE_URL`

**Comprehensive Testing:**
- 23 adapter precedence tests covering all MySQL env vars
- Tests for TLS URL handling and protocol detection
- Tests for env var name precedence over protocols
- All existing tests (241 total) continue to pass

This brings MySQL environment variable support in line with PostgreSQL,
providing a complete and intuitive configuration experience.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 12:07:23 -07:00
autofix-ci[bot]
1b023c5e5f [autofix.ci] apply automated fixes 2025-08-30 12:07:23 -07:00
Claude Bot
d55260233c refactor: Simplify adapter inference to prioritize environment variable names over protocols
Fixed logic where PGURL="mysql://" would incorrectly return mysql adapter instead of postgres.

Environment variable names now take semantic precedence over URL protocols:
- MYSQL_URL=postgres://host → mysql adapter (name wins)
- PGURL=mysql://host → postgres adapter (name wins)
- DATABASE_URL=mysql://host → mysql adapter (protocol detection as fallback)

This is more intuitive and matches user expectations - if you set PGURL, you clearly
intend PostgreSQL regardless of what protocol might be in the URL value.

Simplified logic:
1. Explicit adapter (highest priority)
2. Environment variable name (semantic intent)
3. Protocol detection (fallback for DATABASE_URL only)
4. Default to postgres

Added comprehensive tests to verify environment variable names override protocols
in all scenarios. All 236 existing tests continue to pass.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 12:07:23 -07:00
Claude Bot
9dc92fff39 fix: Infer adapter from environment variable names when protocol is missing
Fixed bug where MYSQL_URL=root@localhost:3306/test would incorrectly be treated
as postgres instead of mysql due to missing protocol detection.

Now properly infers adapter from environment variable names:
- MYSQL_URL → mysql adapter (even without mysql:// protocol)
- POSTGRES_URL, PGURL, PG_URL → postgres adapter (even without postgres:// protocol)
- Protocol detection still takes precedence when present
- Maintains proper precedence order across environment variables

Added comprehensive tests to verify:
- MYSQL_URL without protocol correctly infers mysql
- POSTGRES_URL without protocol correctly infers postgres
- All existing functionality continues to work

This ensures that environment variable names provide semantic hints about
the intended database adapter even when URLs lack explicit protocols.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 12:07:23 -07:00
Claude Bot
31088e4575 fix: Correct MYSQL_URL protocol detection in adapter inference
The previous implementation incorrectly checked if MYSQL_URL was a SQLite URL
using parseDefinitelySqliteUrl(). This fix properly checks the protocol of
environment URLs to determine the correct adapter:

- mysql://, mariadb://, mysqls:// → mysql adapter
- postgres://, postgresql:// → postgres adapter
- SQLite URLs (detected by parseDefinitelySqliteUrl) → sqlite adapter

Added tests to verify MYSQL_URL and POSTGRES_URL environment variables
correctly infer their respective adapters and that precedence is respected.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 12:07:23 -07:00
Claude Bot
0e52d24bc4 refactor: Fix Bun.SQL options parsing to separate adapter detection and prevent env variable mixing
This commit refactors Bun.SQL's options parsing to fix issue #22147 and properly separate
PostgreSQL and MySQL environment variables based on the chosen adapter.

Key changes:
1. Separate adapter detection from options parsing
2. Only read environment variables appropriate for the selected adapter
3. Respect proper precedence: explicit options > adapter-specific env vars > generic env vars
4. Add support for unix:// protocol with explicit adapter specification
5. Validate adapter-protocol compatibility

Adapter detection logic:
- If adapter is explicitly set: use it
- If adapter is set to "mysql": use mysql adapter
- If adapter is set to "postgres"/"postgresql": use postgres adapter
- If protocol is mysql/mariadb/mysqls: use mysql adapter
- If protocol is postgres/postgresql: use postgres adapter
- If no protocol in URL: default to postgres adapter
- For unix:// protocol: require explicit adapter

Environment variable precedence by adapter:
- PostgreSQL: Only reads PGHOST, PGUSER, PGPASSWORD, etc. + generic USER/USERNAME
- MySQL: Only reads generic USER/USERNAME (no widely standardized MySQL env vars)
- SQLite: Only reads DATABASE_URL for SQLite URLs

This prevents mixing of PostgreSQL env vars when using MySQL adapter and vice versa,
while ensuring explicit connection options always take precedence over environment variables.

Fixes: #22147

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-30 12:07:23 -07:00
Ciro Spaciari
1085908386 fix(Bun.SQL) MYSQL fix old auth and auth switch + add lastInsertRowid and affectedRows (#22132)
### What does this PR do?

add `lastInsertRowid` (matching SQLite)
add `affectedRows`
fix `mysql_native_password` deprecated authentication
fix AuthSwitch
Fixes:
https://github.com/oven-sh/bun/issues/22178#issuecomment-3228716080
### How did you verify your code works?
tests

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-29 01:03:17 -07:00
Carl Jackson
92b38fdf80 sql: support array of strings in SQLHelper (#21572)
### What does this PR do?
Support the following:
```javascript
const nom = await sql`SELECT name FROM food WHERE category IN ${sql(['bun', 'baozi', 'xiaolongbao'])}`;
```

Previously, only e.g., `sql([1, 2, 3])` was supported.

To be honest I'm not sure what the semantics of SQLHelper *ought* to be.
I'm pretty sure objects ought to be auto-inferred. I'm not sure about
arrays, but given the rest of the code in `SQLHelper` trying to read the
tea leaves on stringified numeric keys I figured someone cared about
this use case. I don't know about other types, but I'm pretty sure that
`Object.keys("bun") === [0, 1, 2]` is an oversight and unintended.
(Incidentally, the reason numbers previously worked is because
`Object.keys(4) === []`). I decided that all non-objects and non-arrays
should be treated as not having auto-inferred columns.

Fixes #18637 

### How did you verify your code works?
I wrote a test, but was unable to run it (or any other tests in this
file) locally due to Docker struggles. I sure hope it works!
2025-08-22 17:05:05 -07:00
Jarred Sumner
0e37dc4e78 Fixes #20729 (#22048)
### What does this PR do?

Fixes #20729

### How did you verify your code works?

There is a test

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-08-22 03:41:49 -07:00
Ciro Spaciari
ecbf103bf5 feat(MYSQL) Bun.SQL mysql support (#21968)
### What does this PR do?
Add MySQL support, Refactor will be in a followup PR
### How did you verify your code works?
A lot of tests

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: cirospaciari <6379399+cirospaciari@users.noreply.github.com>
2025-08-21 15:28:15 -07:00
Alistair Smith
784271f85e SQLite in Bun.sql (#21640)
### What does this PR do?

Support sqlite in the Bun.sql API

Fixes #18951
Fixes #19701

### How did you verify your code works?

tests

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2025-08-19 23:15:53 -07:00