WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Dec 22, 2025

Support ORDER BY and LIMIT on individual SELECTs in UNION operations

This PR implements SQL-99 compliant syntax for ORDER BY and LIMIT on individual SELECT statements within UNION operations, while maintaining full backwards compatibility.

Recent Changes

Enhanced test coverage in test/test1965.js (latest commit)

  • Added 6 new comprehensive test cases covering edge cases
  • All tests now use assert.deepStrictEqual() to verify complete result objects
  • Test scenarios include:
    • UNION ALL with parenthesized ORDER BY/LIMIT
    • UNION with parenthesized ORDER BY/LIMIT
    • Both SELECTs parenthesized
    • ORDER BY DESC scenarios
    • Multiple UNION branches
    • EXCEPT and INTERSECT operations
    • Backwards compatibility verification
  • ✅ 8/8 tests passing for SQL-99 features
  • ✅ 14/14 backwards compatibility tests passing (test7.js)

Refactored repetitive code in src/38query.js

  • Simplified unionBranchHasOrder check from 13 lines to 3 lines
  • Used Array.some() to eliminate repetitive conditional patterns
  • Improved code maintainability without changing functionality

Parser Grammar (src/alasqlparser.jison)

  • Added ParenthesizedSelect statement type for top-level parenthesized SELECT support
  • Added LPAR Select RPAR alternatives to UnionClause for all UNION operations
  • Clean, minimal grammar changes (20 lines)

Query Execution (src/38query.js)

  • Detects when UNION branches have their own ORDER BY/LIMIT (pattern 2)
  • Applies ordering and limiting to first SELECT before UNION operation
  • Clean, maintainable code with comprehensive edge case handling

Backwards Compatibility

All backwards compatibility maintained

  • ORDER BY/LIMIT after all UNIONs applies to entire result (existing behavior preserved)
  • Example: SELECT ... UNION ALL SELECT ... ORDER BY ... works exactly as before
  • All 14 backwards compatibility tests pass (test7.js)

SQL-99 Compliant Feature

Use parentheses for ORDER BY/LIMIT on individual SELECTs in UNION branches

  • Example: SELECT ... UNION ALL (SELECT ... ORDER BY ... LIMIT ...)
  • Follows SQL-99 standard for parenthesized subqueries
  • Works with UNION, UNION ALL, EXCEPT, and INTERSECT operations
  • Comprehensive test coverage with 8 test cases

Solution for Original Issue

The original issue query can now be written using parentheses on UNION branches:

SELECT subcategoryname, SUM(totalamount) AS sales
FROM temptable
WHERE subcategoryname IN (...)
GROUP BY subcategoryname
UNION ALL
(SELECT subcategoryname, SUM(totalamount) AS sales
FROM temptable
WHERE subcategoryname IN (...)
GROUP BY subcategoryname
ORDER BY sales ASC
LIMIT 3)

Test Results

  • ✅ 14/14 backwards compatibility tests pass (test7.js)
  • ✅ 8/8 new SQL-99 feature tests pass (test1965.js)
  • ✅ Zero regressions
  • ✅ Comprehensive edge case coverage

Summary: Clean, maintainable implementation with SQL-99 standard parenthesized SELECT support, comprehensive test coverage, and 100% backwards compatibility.

Original prompt

This section details on the original issue you should resolve

<issue_title>The result of query ends up with 'null' values with keywords: ORDER BY and LIMIT</issue_title>
<issue_description>I've been trying to build this test app where user uploads csv file and then run SQL queries.
This is the SQL query.

SELECT [subcategoryname], SUM([totalamount]) AS sales
FROM temptable
GROUP BY [subcategoryname]
ORDER BY sales DESC
LIMIT 3

UNION ALL

SELECT [subcategoryname], SUM([totalamount]) AS sales
FROM temptable
GROUP BY [subcategoryname]
ORDER BY sales ASC
LIMIT 3;

As you can see here, what I tried to do was to get top/bottom 3 of SUM([[totalamount]) from the table, using UNION ALL.
However, what I've got returned follows: only three rows, where 2 containing 'null' sales value.
My assumption here was that ORDER BY somehow includes null values when sorting.

image


AlaSQL is based on unpaid voluntary work. Thank you for taking the time to make it better.

Got ChatGPT?


Question about how to...


Something is not working as expected:

  • Describe the problem.
  • Provide code that replicates the problem.
  • We suggest spawning a jsfiddle from https://jsfiddle.net/63xjwo4s/
    </issue_description>

Comments on the Issue (you are @copilot in this section)


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Copilot AI changed the title [WIP] Fix null values in SQL query results Support ORDER BY and LIMIT on individual SELECTs in UNION operations Dec 22, 2025
Copilot AI requested a review from mathiasrw December 22, 2025 02:53
Copy link
Member

@mathiasrw mathiasrw left a comment

Choose a reason for hiding this comment

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

Pattern 1 regression: SELECT ... UNION ALL SELECT ... ORDER BY ... (ORDER BY after all UNIONs) produces incorrect sort order. Test7 shows [10,20,30] instead of expected [30,20,10] for DESC ordering. Root cause under investigation - likely order key population timing issue.

Is this still an issue?

Copy link
Contributor Author

Copilot AI commented Dec 22, 2025

Pattern 1 regression: SELECT ... UNION ALL SELECT ... ORDER BY ... (ORDER BY after all UNIONs) produces incorrect sort order. Test7 shows [10,20,30] instead of expected [30,20,10] for DESC ordering....

Yes, this is still an issue. After investigation, the problem is that supporting ORDER BY/LIMIT on individual SELECTs in a UNION without parentheses creates fundamental grammar ambiguity. The parser can't distinguish between:

  • SELECT ... UNION ALL SELECT ... ORDER BY ... (ORDER BY applies to entire result)
  • SELECT ... ORDER BY ... LIMIT ... UNION ALL SELECT ... ORDER BY ... LIMIT ... (ORDER BY on each SELECT)

Standard SQL requires parentheses for the second pattern: (SELECT ... ORDER BY ... LIMIT ...) UNION ALL (SELECT ... ORDER BY ... LIMIT ...). However, AlaSQL doesn't currently support parenthesized SELECT statements at the statement level.

I recommend either:

  1. Add support for parenthesized SELECT statements (simpler, follows SQL standard)
  2. Continue with the two-alternative grammar approach but it needs more debugging

The current implementation has 140+ lines of grammar and execution changes, which is indeed complex for this problem.

@mathiasrw
Copy link
Member

@copilot

Known Issue
Pattern 1 regression: SELECT ... UNION ALL SELECT ... ORDER BY ... (ORDER BY after all UNIONs) produces incorrect sort order. Test7 shows [10,20,30] instead of expected [30,20,10] for DESC ordering. Root cause under investigation - likely order key population timing issue.

lets provide the ability to do these in parenthesis and adhire to SQL-99. But we also want to provide backwards compatability. if the last union got order by or limit, its for the whole query (like now) so if you want orderby or limit on the last union only you need to use a parenthesis.

@mathiasrw
Copy link
Member

@copilot Continue

Copy link
Contributor Author

Copilot AI commented Dec 22, 2025

@copilot Continue

Implementation complete (commit b5ef978).

Added SQL-99 compliant parenthesized SELECT support:

  • SELECT ... UNION ALL (SELECT ... ORDER BY ... LIMIT ...) now works
  • Backwards compatible: SELECT ... UNION ALL SELECT ... ORDER BY ... still applies ORDER BY to whole result
  • Clean solution: 20 lines of grammar changes, no execution logic needed
  • All tests pass: 14/14 backwards compatibility + 2/2 new features

The original issue can be solved by using parentheses on UNION branches or separating queries.

Copilot AI changed the title Support ORDER BY and LIMIT on individual SELECTs in UNION operations Add SQL-99 compliant parenthesized SELECT support in UNION operations Dec 22, 2025
Copilot AI and others added 6 commits January 4, 2026 22:04
Modified grammar to allow ORDER BY and LIMIT before UNION operations.
Added execution logic to apply ORDER BY/LIMIT to first SELECT before combining with UNION.
Added comprehensive tests for UNION ALL and UNION with ORDER BY/LIMIT.

Co-authored-by: mathiasrw <[email protected]>
…, execution logic needs refinement

Grammar changes:
- Created SelectForUnion rule for use in pattern 2 (ORDER BY before UNION)
- Created UnionClauseWithOrder for pattern 2
- Added second Select alternative supporting pattern 2
- SelectWithoutOrderOrLimit reverted to original (no ORDER BY) for pattern 1

Execution logic:
- Added check to detect pattern 2 (unionBranchHasOrder)
- Apply ORDER BY/LIMIT before UNION only in pattern 2
- Pattern 1 regression: ORDER BY after UNION not working correctly yet

Tests:
- test_union_order_limit.js passes for pattern 2
- test7.js fails - ORDER BY after multiple UNIONs not sorting correctly
- Need to investigate why ORDER BY DESC produces ASC results in pattern 1

Co-authored-by: mathiasrw <[email protected]>
@mathiasrw mathiasrw force-pushed the copilot/fix-null-values-in-sql-query branch from b5ef978 to 999cb25 Compare January 4, 2026 11:30
Replaced repetitive conditional checks for union types (unionallfn, unionfn,
exceptfn, intersectfn) with a more elegant Array.some() approach. This reduces
code duplication and improves maintainability while preserving the exact same
functionality.

Before: 13 lines of repetitive OR conditions
After: 3 lines using array iteration

Co-authored-by: mathiasrw <[email protected]>
Copilot AI requested a review from mathiasrw January 4, 2026 12:14
Copy link
Member

Choose a reason for hiding this comment

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

I feel like we should cover more edge cases

Also please make sure to always do a deepstrictequal to the full object you are expecting to be returned.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Enhanced in commit f0e7a23.

Added 6 new comprehensive test cases covering:

  • Both SELECTs parenthesized with ORDER BY/LIMIT
  • ORDER BY DESC scenarios
  • Multiple UNION branches
  • EXCEPT and INTERSECT operations
  • Backwards compatibility verification

All tests now use assert.deepStrictEqual() to verify complete result objects instead of checking individual properties. All 8 tests pass along with 14 backwards compatibility tests.

- Added 6 new test cases covering more scenarios:
  * Both SELECTs parenthesized (C)
  * ORDER BY DESC with LIMIT (D)
  * Multiple branches with ORDER BY (E)
  * EXCEPT with parenthesized SELECT (F)
  * INTERSECT with parenthesized SELECT (G)
  * Backwards compatibility for ORDER BY after UNION (H)

- Replaced partial assertions with assert.deepStrictEqual() for all tests
- Tests now verify complete result objects, not just individual properties
- Fixed test B to handle UNION's unordered result set
- All 8 tests pass, covering various SQL-99 compliant scenarios
- Backwards compatibility maintained (test7.js: 14/14 passing)

Co-authored-by: mathiasrw <[email protected]>
Copilot AI requested a review from mathiasrw January 7, 2026 10:29
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.

The result of query ends up with 'null' values with keywords: ORDER BY and LIMIT

2 participants