Skip to content

Commit 787e50d

Browse files
committed
fix: with clause before select stmt in mysql
1 parent 05a8640 commit 787e50d

File tree

3 files changed

+11
-3
lines changed

3 files changed

+11
-3
lines changed

pegjs/mysql.pegjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2289,7 +2289,7 @@ with_clause
22892289
}
22902290

22912291
cte_definition
2292-
= name:(literal_string / ident_name / table_name) __ columns:cte_column_definition? __ KW_AS __ LPAREN __ stmt:set_op_stmt __ RPAREN {
2292+
= name:(literal_string / ident_name / table_name) __ columns:cte_column_definition? __ KW_AS __ LPAREN __ stmt:(value_clause / set_op_stmt) __ RPAREN {
22932293
if (typeof name === 'string') name = { type: 'default', value: name }
22942294
if (name.table) name = { type: 'default', value: name.table }
22952295
return { name, stmt, columns };

src/with.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { columnRefToSQL } from './column'
22
import { exprToSQL } from './expr'
3-
import { identifierToSql, literalToSQL } from './util'
3+
import { commonOptionConnector, identifierToSql, literalToSQL } from './util'
44

55
/**
66
* @param {Array<Object>} withExpr
@@ -11,7 +11,8 @@ function withToSQL(withExpr) {
1111
const withExprStr = withExpr.map(cte => {
1212
const { name, stmt, columns } = cte
1313
const column = Array.isArray(columns) ? `(${columns.map(columnRefToSQL).join(', ')})` : ''
14-
return `${name.type === 'default' ? identifierToSql(name.value) : literalToSQL(name)}${column} AS (${exprToSQL(stmt)})`
14+
const expr = commonOptionConnector(stmt.type === 'values' ? 'VALUES' : '', exprToSQL, stmt)
15+
return `${name.type === 'default' ? identifierToSql(name.value) : literalToSQL(name)}${column} AS (${expr})`
1516
}).join(', ')
1617

1718
return `WITH ${isRecursive}${withExprStr}`

test/mysql-mariadb.spec.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,13 @@ describe('mysql', () => {
13261326
"SELECT `crème` AS `brûlée` FROM `café` WHERE `âtre` = 'Molière'"
13271327
]
13281328
},
1329+
{
1330+
title: 'with clause',
1331+
sql: [
1332+
"WITH T AS (VALUES ROW('foobar')) SELECT * FROM T",
1333+
"WITH `T` AS (VALUES ROW('foobar')) SELECT * FROM `T`"
1334+
]
1335+
},
13291336
]
13301337
SQL_LIST.forEach(sqlInfo => {
13311338
const { title, sql } = sqlInfo

0 commit comments

Comments
 (0)