feat: Add multi-column USING clause support in JOINs (closes #70)#98
Conversation
Implement comprehensive stdin/stdout pipeline support for all CLI commands (validate, format, analyze, parse) with Unix pipeline conventions and cross-platform compatibility. Features: - Auto-detection: Commands automatically detect piped input - Explicit stdin: Support "-" as stdin marker for all commands - Input redirection: Full support for "< file.sql" syntax - Broken pipe handling: Graceful handling of Unix EPIPE errors - Security: 10MB input limit to prevent DoS attacks - Cross-platform: Works on Unix/Linux/macOS and Windows PowerShell Implementation: - Created stdin_utils.go with pipeline utilities: - IsStdinPipe(): Detects piped input using golang.org/x/term - ReadFromStdin(): Reads from stdin with size limits - GetInputSource(): Unified input detection (stdin/file/direct SQL) - WriteOutput(): Handles stdout and file output with broken pipe detection - DetectInputMode(): Determines input mode based on args and stdin state - ValidateStdinInput(): Security validation for stdin content - Updated all commands with stdin support: - validate.go: Stdin validation with temp file approach - format.go: Stdin formatting (blocks -i flag appropriately) - analyze.go: Stdin analysis with direct content processing - parse.go: Stdin parsing with direct content processing - Dependencies: - Added golang.org/x/term for stdin detection - Testing: - Unit tests: stdin_utils_test.go with comprehensive coverage - Integration tests: pipeline_integration_test.go for real pipeline testing - Manual testing: Validated echo, cat, and redirect operations - Documentation: - Updated README.md with comprehensive pipeline examples - Unix/Linux/macOS and Windows PowerShell examples - Git hooks integration examples Usage Examples: echo "SELECT * FROM users" | gosqlx validate cat query.sql | gosqlx format gosqlx validate - gosqlx format < query.sql cat query.sql | gosqlx format | gosqlx validate Cross-platform: # Unix/Linux/macOS cat query.sql | gosqlx format | tee formatted.sql | gosqlx validate # Windows PowerShell Get-Content query.sql | gosqlx format | Set-Content formatted.sql "SELECT * FROM users" | gosqlx validate Security: - 10MB stdin size limit (MaxStdinSize constant) - Binary data detection (null byte check) - Input validation before processing - Temporary file cleanup in validate command 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Resolved dependency conflicts in go.mod and go.sum: - Kept newer golang.org/x/sys v0.38.0 (was v0.13.0 in main) - Kept golang.org/x/term v0.37.0 (required for stdin/stdout pipeline) - Added fsnotify v1.9.0 from watch mode feature - Reorganized dependencies after go mod tidy All tests passing after merge.
Fixed 3 critical issues causing all CI builds/tests to fail: 1. Go Version Format (Fixes: Build, Test, Vulnerability Check failures) - Changed go.mod from 'go 1.24.0' (three-part) to 'go 1.24' (two-part) - Three-part format not supported by Go 1.19/1.20 toolchains in CI - Error: 'invalid go version 1.24.0: must match format 1.23' 2. Lint Error SA9003 (Fixes: Lint job failure) - Fixed empty else branch in cmd/gosqlx/cmd/format.go:169-173 - Removed unnecessary else block while preserving same behavior - Staticcheck SA9003: empty branch warning resolved 3. Workflow Go Version Mismatch (Fixes: Security scan failures) - Updated .github/workflows/security.yml to use Go 1.24 - Both GoSec and GovulnCheck jobs now use Go 1.24 - Matches project requirements for golang.org/x/term v0.37.0 All changes maintain backward compatibility and functionality. Related: #65 (stdin/stdout pipeline feature)
Updated Go version across all GitHub Actions workflows to match go.mod requirements: - .github/workflows/go.yml: Changed build matrix from [1.19, 1.20, 1.21] to [1.24] - .github/workflows/test.yml: Changed test matrix from [1.19, 1.20, 1.21] to [1.24] - .github/workflows/test.yml: Changed benchmark job from 1.21 to 1.24 - .github/workflows/lint.yml: Changed from 1.21 to 1.24 This fixes all remaining CI failures caused by incompatibility between: - Project dependencies (golang.org/x/term v0.37.0) requiring Go 1.24 - Old workflow configurations using Go 1.19-1.21 Related: PR #97, Issue #65
Running go mod tidy updates go.mod format to go 1.24.0 (three-part) which is the standard format for Go 1.24+. This resolves build failures caused by out-of-sync go.mod and go.sum files. Note: Go 1.24 supports both two-part (1.24) and three-part (1.24.0) formats, but go mod tidy standardizes on three-part format.
- Replace hardcoded /tmp/ path with os.TempDir() - Add path/filepath import for filepath.Join - Fixes Windows test failure in TestWriteOutput
Implements SQL-92 compliant multi-column USING support for JOIN operations. Changes: - Modified parser.go to parse comma-separated column lists in USING clause - Added logic to store single columns as Identifier (backward compatibility) - Added logic to store multiple columns as ListExpression - Added comprehensive test coverage for multi-column USING Tests Added: - TestParser_MultiColumnUSING: Tests single and multi-column USING with various JOIN types - TestParser_MultiColumnUSINGEdgeCases: Tests error handling for invalid syntax - TestParser_MultiColumnUSINGWithComplexQueries: Tests integration with WHERE, ORDER BY, LIMIT Examples: - Single column: JOIN table2 USING (id) - Multiple columns: JOIN table2 USING (id, name, category) All existing tests pass with race detection enabled. Maintains full backward compatibility with single-column USING. Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
|
Claude finished @ajitpratap0's task —— View job PR Review: Multi-Column USING Clause SupportCompleted comprehensive review of this PR implementing multi-column USING clause support for SQL-92 compliance. ✅ Overall Assessment: EXCELLENT IMPLEMENTATIONThis is a well-crafted PR that demonstrates strong engineering practices and attention to detail. 🔍 Code Quality AnalysisParser Implementation (pkg/sql/parser/parser.go:899-941)
Potential Minor Improvement: // Consider extracting column parsing into a helper function for better readability:
func (p *Parser) parseUsingColumnList() ([]ast.Expression, error) {
// Move lines 913-927 here for better separation of concerns
}🧪 Test Coverage: ExemplaryThe test suite is exceptionally comprehensive with 16 test cases covering: Functional Tests (
|
Summary
Implements support for multi-column USING clauses in JOIN statements for SQL-92 compliance.
Changes
Parser Modifications
parseJoinClause()inpkg/sql/parser/parser.goto parse comma-separated column listsIdentifier(backward compatible)ListExpressionTest Coverage
Added 16 comprehensive test cases in
pkg/sql/parser/join_test.go:Examples
Before (unsupported):
After (supported):
Testing
✅ All 16 new tests pass ✅ All existing parser tests pass (backward compatibility) ✅ Race detection enabled: go test -race ./pkg/sql/parser/ ✅ Pre-commit hooks passedSQL-92 Compliance
This change brings GoSQLX into full compliance with SQL-92 standard for multi-column USING clauses.
Backward Compatibility
✅ Fully backward compatible - single-column USING clauses work exactly as before
Closes #70
🤖 Generated with Claude Code
Co-Authored-By: Claude noreply@anthropic.com