From c022749cc691fa2e2cc752fb0d9a671ee040c688 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sat, 1 Oct 2022 11:44:06 +0300 Subject: [PATCH 01/28] Remove SET SCHEMA support from Hive --- src/languages/hive/hive.formatter.ts | 1 - test/hive.test.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/languages/hive/hive.formatter.ts b/src/languages/hive/hive.formatter.ts index 6fc8a2a0e..8f08fcc89 100644 --- a/src/languages/hive/hive.formatter.ts +++ b/src/languages/hive/hive.formatter.ts @@ -60,7 +60,6 @@ const reservedClauses = expandPhrases([ 'DESCRIBE', 'DROP', 'FETCH', - 'SET SCHEMA', // added 'SHOW', // newline keywords 'STORED AS', diff --git a/test/hive.test.ts b/test/hive.test.ts index b1f05e74d..b5e31cb28 100644 --- a/test/hive.test.ts +++ b/test/hive.test.ts @@ -7,7 +7,6 @@ import behavesLikeSqlFormatter from './behavesLikeSqlFormatter'; import supportsCreateTable from './features/createTable'; import supportsDropTable from './features/dropTable'; import supportsAlterTable from './features/alterTable'; -import supportsSchema from './features/schema'; import supportsStrings from './features/strings'; import supportsBetween from './features/between'; import supportsJoin from './features/join'; @@ -41,7 +40,6 @@ describe('HiveFormatter', () => { supportsStrings(format, ['""-bs', "''-bs"]); supportsIdentifiers(format, ['``']); supportsBetween(format); - supportsSchema(format); supportsJoin(format, { without: ['NATURAL'], additionally: ['LEFT SEMI JOIN'], From 4efe16a8fd9d4d131c0ec23c929157d23c0ce377 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sat, 1 Oct 2022 12:19:52 +0300 Subject: [PATCH 02/28] Implement single-line formatted clauses For start, use it for SET SCHEMA clause --- src/formatter/ExpressionFormatter.ts | 8 ++++++-- src/formatter/Formatter.ts | 4 ++-- src/languages/bigquery/bigquery.formatter.ts | 11 ++++++++++- src/languages/db2/db2.formatter.ts | 12 ++++++++++-- src/languages/hive/hive.formatter.ts | 11 ++++++++++- src/languages/mariadb/mariadb.formatter.ts | 11 ++++++++++- src/languages/mysql/mysql.formatter.ts | 11 ++++++++++- src/languages/n1ql/n1ql.formatter.ts | 12 ++++++++++-- src/languages/plsql/plsql.formatter.ts | 10 +++++++--- src/languages/postgresql/postgresql.formatter.ts | 10 +++++++--- src/languages/redshift/redshift.formatter.ts | 9 +++++++-- .../singlestoredb/singlestoredb.formatter.ts | 11 ++++++++++- src/languages/snowflake/snowflake.formatter.ts | 9 +++++++-- src/languages/spark/spark.formatter.ts | 11 ++++++++++- src/languages/sql/sql.formatter.ts | 14 ++++++++++---- src/languages/sqlite/sqlite.formatter.ts | 14 ++++++++++---- src/languages/transactsql/transactsql.formatter.ts | 9 +++++++-- src/languages/trino/trino.formatter.ts | 11 ++++++++++- src/lexer/TokenizerOptions.ts | 4 ++-- test/features/schema.ts | 3 +-- 20 files changed, 156 insertions(+), 39 deletions(-) diff --git a/src/formatter/ExpressionFormatter.ts b/src/formatter/ExpressionFormatter.ts index 35a7bbcc0..72f0ffab0 100644 --- a/src/formatter/ExpressionFormatter.ts +++ b/src/formatter/ExpressionFormatter.ts @@ -45,6 +45,8 @@ interface ExpressionFormatterParams { export interface DialectFormatOptions { // List of operators that should always be formatted without surrounding spaces alwaysDenseOperators?: string[]; + // List of clauses that should be formatted on a single line + onelineClauses: string[]; } /** Formats a generic SQL expression */ @@ -207,14 +209,16 @@ export default class ExpressionFormatter { } private formatClause(node: ClauseNode) { - if (isTabularStyle(this.cfg)) { + const isOnelineClause = this.dialectCfg.onelineClauses.includes(node.nameKw.text); + + if (isTabularStyle(this.cfg) || isOnelineClause) { this.layout.add(WS.NEWLINE, WS.INDENT, this.showKw(node.nameKw), WS.SPACE); } else { this.layout.add(WS.NEWLINE, WS.INDENT, this.showKw(node.nameKw), WS.NEWLINE); } this.layout.indentation.increaseTopLevel(); - if (!isTabularStyle(this.cfg)) { + if (!isTabularStyle(this.cfg) && !isOnelineClause) { this.layout.add(WS.INDENT); } this.layout = this.formatSubExpression(node.children); diff --git a/src/formatter/Formatter.ts b/src/formatter/Formatter.ts index 78bb54c32..97b50add8 100644 --- a/src/formatter/Formatter.ts +++ b/src/formatter/Formatter.ts @@ -41,10 +41,10 @@ export default class Formatter { } /** - * Dialect-specific formatting configuration, optionally provided by subclass. + * Dialect-specific formatting configuration, provided by subclass. */ protected formatOptions(): DialectFormatOptions { - return {}; + throw new Error('formatOptions() not implemented by sybclass'); } /** diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index a7cadd6d9..2f9bf25d3 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -1,4 +1,5 @@ import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { EOF_TOKEN, isToken, TokenType, Token } from 'src/lexer/token'; import { expandPhrases } from 'src/expandPhrases'; @@ -115,6 +116,8 @@ const reservedClauses = expandPhrases([ 'EXPORT DATA', ]); +const onelineClauses = expandPhrases([]); + const reservedSetOperations = expandPhrases([ 'UNION {ALL | DISTINCT}', 'EXCEPT DISTINCT', @@ -143,8 +146,8 @@ export default class BigQueryFormatter extends Formatter { // TODO: handle trailing comma in select clause tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -169,6 +172,12 @@ export default class BigQueryFormatter extends Formatter { postProcess, }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } function postProcess(tokens: Token[]): Token[] { diff --git a/src/languages/db2/db2.formatter.ts b/src/languages/db2/db2.formatter.ts index 1cec06037..00fa7fd2a 100644 --- a/src/languages/db2/db2.formatter.ts +++ b/src/languages/db2/db2.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { functions } from './db2.functions'; import { keywords } from './db2.keywords'; @@ -147,7 +148,6 @@ const reservedClauses = expandPhrases([ 'SET CURRENT TEMPORAL SYSTEM_TIME', 'SET ENCRYPTION PASSWORD', 'SET PATH', - 'SET SCHEMA', 'SET SESSION TIME ZONE', 'SIGNAL', 'VALUES INTO', @@ -158,6 +158,8 @@ const reservedClauses = expandPhrases([ 'SET CURRENT SCHEMA', ]); +const onelineClauses = expandPhrases(['SET SCHEMA']); + const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT [ALL]', 'INTERSECT [ALL]']); const reservedJoins = expandPhrases([ @@ -177,8 +179,8 @@ const reservedPhrases = expandPhrases([ export default class Db2Formatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -194,4 +196,10 @@ export default class Db2Formatter extends Formatter { operators: ['**', '¬=', '¬>', '¬<', '!>', '!<', '||'], }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } diff --git a/src/languages/hive/hive.formatter.ts b/src/languages/hive/hive.formatter.ts index 8f08fcc89..9097f1256 100644 --- a/src/languages/hive/hive.formatter.ts +++ b/src/languages/hive/hive.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { functions } from './hive.functions'; import { keywords } from './hive.keywords'; @@ -67,6 +68,8 @@ const reservedClauses = expandPhrases([ 'ROW FORMAT', ]); +const onelineClauses = expandPhrases([]); + const reservedSetOperations = expandPhrases(['UNION [ALL | DISTINCT]']); const reservedJoins = expandPhrases([ @@ -83,8 +86,8 @@ const reservedPhrases = expandPhrases(['{ROWS | RANGE} BETWEEN']); export default class HiveFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -97,4 +100,10 @@ export default class HiveFormatter extends Formatter { operators: ['%', '~', '^', '|', '&', '<=>', '==', '!', '||'], }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } diff --git a/src/languages/mariadb/mariadb.formatter.ts b/src/languages/mariadb/mariadb.formatter.ts index 308d71981..d400a871f 100644 --- a/src/languages/mariadb/mariadb.formatter.ts +++ b/src/languages/mariadb/mariadb.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { EOF_TOKEN, isToken, Token, TokenType } from 'src/lexer/token'; import { keywords } from './mariadb.keywords'; @@ -236,6 +237,8 @@ const reservedClauses = expandPhrases([ 'XA START', ]); +const onelineClauses = expandPhrases([]); + const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', 'EXCEPT [ALL | DISTINCT]', @@ -263,8 +266,8 @@ const reservedPhrases = expandPhrases([ export default class MariaDbFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -291,6 +294,12 @@ export default class MariaDbFormatter extends Formatter { postProcess, }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } function postProcess(tokens: Token[]) { diff --git a/src/languages/mysql/mysql.formatter.ts b/src/languages/mysql/mysql.formatter.ts index 5914ba624..d991b8063 100644 --- a/src/languages/mysql/mysql.formatter.ts +++ b/src/languages/mysql/mysql.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { EOF_TOKEN, isToken, Token, TokenType } from 'src/lexer/token'; import { keywords } from './mysql.keywords'; @@ -209,6 +210,8 @@ const reservedClauses = expandPhrases([ 'WHILE', ]); +const onelineClauses = expandPhrases([]); + const reservedSetOperations = expandPhrases(['UNION [ALL | DISTINCT]']); const reservedJoins = expandPhrases([ @@ -231,8 +234,8 @@ const reservedPhrases = expandPhrases([ export default class MySqlFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -259,6 +262,12 @@ export default class MySqlFormatter extends Formatter { postProcess, }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } function postProcess(tokens: Token[]) { diff --git a/src/languages/n1ql/n1ql.formatter.ts b/src/languages/n1ql/n1ql.formatter.ts index 64438eea5..112679b42 100644 --- a/src/languages/n1ql/n1ql.formatter.ts +++ b/src/languages/n1ql/n1ql.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { functions } from './n1ql.functions'; import { keywords } from './n1ql.keywords'; @@ -65,12 +66,13 @@ const reservedClauses = expandPhrases([ 'LET', 'NEST', 'SET CURRENT SCHEMA', - 'SET SCHEMA', 'SHOW', 'UNNEST', 'USE KEYS', ]); +const onelineClauses = expandPhrases(['SET SCHEMA']); + const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT [ALL]', 'INTERSECT [ALL]']); const reservedJoins = expandPhrases(['JOIN', '{LEFT | RIGHT} [OUTER] JOIN', 'INNER JOIN']); @@ -81,8 +83,8 @@ const reservedPhrases = expandPhrases(['{ROWS | RANGE | GROUPS} BETWEEN']); export default class N1qlFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -100,4 +102,10 @@ export default class N1qlFormatter extends Formatter { operators: ['%', '==', ':', '||'], }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } diff --git a/src/languages/plsql/plsql.formatter.ts b/src/languages/plsql/plsql.formatter.ts index 7ccbe3175..a53f01b33 100644 --- a/src/languages/plsql/plsql.formatter.ts +++ b/src/languages/plsql/plsql.formatter.ts @@ -57,9 +57,10 @@ const reservedClauses = expandPhrases([ 'LOOP', 'RETURNING', 'START WITH', - 'SET SCHEMA', ]); +const onelineClauses = expandPhrases(['SET SCHEMA']); + const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT']); const reservedJoins = expandPhrases([ @@ -81,8 +82,8 @@ const reservedPhrases = expandPhrases([ export default class PlSqlFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -119,7 +120,10 @@ export default class PlSqlFormatter extends Formatter { } formatOptions(): DialectFormatOptions { - return { alwaysDenseOperators: ['@'] }; + return { + alwaysDenseOperators: ['@'], + onelineClauses, + }; } } diff --git a/src/languages/postgresql/postgresql.formatter.ts b/src/languages/postgresql/postgresql.formatter.ts index 0dd413ac1..6553b9f11 100644 --- a/src/languages/postgresql/postgresql.formatter.ts +++ b/src/languages/postgresql/postgresql.formatter.ts @@ -221,9 +221,10 @@ const reservedClauses = expandPhrases([ 'VACUUM', // other 'AFTER', - 'SET SCHEMA', ]); +const onelineClauses = expandPhrases(['SET SCHEMA']); + const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', 'EXCEPT [ALL | DISTINCT]', @@ -249,8 +250,8 @@ const reservedPhrases = expandPhrases([ export default class PostgreSqlFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -357,6 +358,9 @@ export default class PostgreSqlFormatter extends Formatter { } formatOptions(): DialectFormatOptions { - return { alwaysDenseOperators: ['::'] }; + return { + alwaysDenseOperators: ['::'], + onelineClauses, + }; } } diff --git a/src/languages/redshift/redshift.formatter.ts b/src/languages/redshift/redshift.formatter.ts index a3ad3a159..206083363 100644 --- a/src/languages/redshift/redshift.formatter.ts +++ b/src/languages/redshift/redshift.formatter.ts @@ -119,6 +119,8 @@ const reservedClauses = expandPhrases([ 'ALTER COLUMN', ]); +const onelineClauses = expandPhrases([]); + const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT', 'MINUS']); const reservedJoins = expandPhrases([ @@ -143,8 +145,8 @@ const reservedPhrases = expandPhrases([ export default class RedshiftFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -173,6 +175,9 @@ export default class RedshiftFormatter extends Formatter { } formatOptions(): DialectFormatOptions { - return { alwaysDenseOperators: ['::'] }; + return { + alwaysDenseOperators: ['::'], + onelineClauses, + }; } } diff --git a/src/languages/singlestoredb/singlestoredb.formatter.ts b/src/languages/singlestoredb/singlestoredb.formatter.ts index 2adf7a188..a9de70c48 100644 --- a/src/languages/singlestoredb/singlestoredb.formatter.ts +++ b/src/languages/singlestoredb/singlestoredb.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { EOF_TOKEN, isToken, Token, TokenType } from 'src/lexer/token'; import { keywords } from './singlestoredb.keywords'; @@ -207,6 +208,8 @@ const reservedClauses = expandPhrases([ 'WHILE', ]); +const onelineClauses = expandPhrases([]); + const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', 'EXCEPT', @@ -233,8 +236,8 @@ const reservedPhrases = expandPhrases([ export default class SingleStoreDbFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -257,6 +260,12 @@ export default class SingleStoreDbFormatter extends Formatter { postProcess, }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } function postProcess(tokens: Token[]) { diff --git a/src/languages/snowflake/snowflake.formatter.ts b/src/languages/snowflake/snowflake.formatter.ts index d65ef06f1..29c3960ab 100644 --- a/src/languages/snowflake/snowflake.formatter.ts +++ b/src/languages/snowflake/snowflake.formatter.ts @@ -299,6 +299,8 @@ const reservedClauses = expandPhrases([ 'USE WAREHOUSE', ]); +const onelineClauses = expandPhrases([]); + const reservedSetOperations = expandPhrases(['UNION [ALL]', 'MINUS', 'EXCEPT', 'INTERSECT']); const reservedJoins = expandPhrases([ @@ -315,8 +317,8 @@ const reservedPhrases = expandPhrases([ export default class SnowflakeFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -349,6 +351,9 @@ export default class SnowflakeFormatter extends Formatter { } formatOptions(): DialectFormatOptions { - return { alwaysDenseOperators: [':', '::'] }; + return { + alwaysDenseOperators: [':', '::'], + onelineClauses, + }; } } diff --git a/src/languages/spark/spark.formatter.ts b/src/languages/spark/spark.formatter.ts index 2577277ea..d8ed741d8 100644 --- a/src/languages/spark/spark.formatter.ts +++ b/src/languages/spark/spark.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { EOF_TOKEN, isToken, Token, TokenType } from 'src/lexer/token'; import { keywords } from './spark.keywords'; @@ -91,6 +92,8 @@ const reservedClauses = expandPhrases([ 'LATERAL VIEW', ]); +const onelineClauses = expandPhrases([]); + const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', 'EXCEPT [ALL | DISTINCT]', @@ -119,8 +122,8 @@ const reservedPhrases = expandPhrases([ export default class SparkFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -140,6 +143,12 @@ export default class SparkFormatter extends Formatter { postProcess, }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } function postProcess(tokens: Token[]) { diff --git a/src/languages/sql/sql.formatter.ts b/src/languages/sql/sql.formatter.ts index 19b1dbd60..9753e027a 100644 --- a/src/languages/sql/sql.formatter.ts +++ b/src/languages/sql/sql.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { functions } from './sql.functions'; import { keywords } from './sql.keywords'; @@ -46,11 +47,10 @@ const reservedClauses = expandPhrases([ 'ADD SCOPE', // for alter column 'DROP SCOPE {CASCADE | RESTRICT}', // for alter column 'RESTART WITH', // for alter column - - // other - 'SET SCHEMA', ]); +const onelineClauses = expandPhrases(['SET SCHEMA']); + const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', 'EXCEPT [ALL | DISTINCT]', @@ -73,8 +73,8 @@ const reservedPhrases = expandPhrases([ export default class SqlFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -89,4 +89,10 @@ export default class SqlFormatter extends Formatter { operators: ['||'], }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } diff --git a/src/languages/sqlite/sqlite.formatter.ts b/src/languages/sqlite/sqlite.formatter.ts index a4acecee4..3f4659bc1 100644 --- a/src/languages/sqlite/sqlite.formatter.ts +++ b/src/languages/sqlite/sqlite.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { functions } from './sqlite.functions'; import { keywords } from './sqlite.keywords'; @@ -38,11 +39,10 @@ const reservedClauses = expandPhrases([ 'DROP [COLUMN]', 'RENAME [COLUMN]', 'RENAME TO', - - // other - 'SET SCHEMA', ]); +const onelineClauses = expandPhrases(['SET SCHEMA']); + const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT']); // joins - https://www.sqlite.org/syntax/join-operator.html @@ -62,8 +62,8 @@ const reservedPhrases = expandPhrases([ export default class SqliteFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -81,4 +81,10 @@ export default class SqliteFormatter extends Formatter { operators: ['%', '~', '&', '|', '<<', '>>', '==', '->', '->>', '||'], }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } diff --git a/src/languages/transactsql/transactsql.formatter.ts b/src/languages/transactsql/transactsql.formatter.ts index 38453c45f..cad043a2e 100644 --- a/src/languages/transactsql/transactsql.formatter.ts +++ b/src/languages/transactsql/transactsql.formatter.ts @@ -201,6 +201,8 @@ const reservedClauses = expandPhrases([ 'XML SCHEMA COLLECTION', ]); +const onelineClauses = expandPhrases([]); + const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT']); const reservedJoins = expandPhrases([ @@ -220,8 +222,8 @@ const reservedPhrases = expandPhrases([ export default class TransactSqlFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -255,6 +257,9 @@ export default class TransactSqlFormatter extends Formatter { } formatOptions(): DialectFormatOptions { - return { alwaysDenseOperators: ['::'] }; + return { + alwaysDenseOperators: ['::'], + onelineClauses, + }; } } diff --git a/src/languages/trino/trino.formatter.ts b/src/languages/trino/trino.formatter.ts index 6671dae9f..b805317c2 100644 --- a/src/languages/trino/trino.formatter.ts +++ b/src/languages/trino/trino.formatter.ts @@ -1,5 +1,6 @@ import { expandPhrases } from 'src/expandPhrases'; import Formatter from 'src/formatter/Formatter'; +import { DialectFormatOptions } from 'src/formatter/ExpressionFormatter'; import Tokenizer from 'src/lexer/Tokenizer'; import { functions } from './trino.functions'; import { keywords } from './trino.keywords'; @@ -100,6 +101,8 @@ const reservedClauses = expandPhrases([ 'DEFINE', ]); +const onelineClauses = expandPhrases([]); + // https://github.com/trinodb/trino/blob/432d2897bdef99388c1a47188743a061c4ac1f34/core/trino-parser/src/main/antlr4/io/trino/sql/parser/SqlBase.g4#L231-L235 // https://github.com/trinodb/trino/blob/432d2897bdef99388c1a47188743a061c4ac1f34/core/trino-parser/src/main/antlr4/io/trino/sql/parser/SqlBase.g4#L288-L291 const reservedSetOperations = expandPhrases([ @@ -122,8 +125,8 @@ const reservedPhrases = expandPhrases(['{ROWS | RANGE | GROUPS} BETWEEN']); export default class TrinoFormatter extends Formatter { tokenizer() { return new Tokenizer({ - reservedClauses, reservedSelect, + reservedClauses: [...reservedClauses, ...onelineClauses], reservedSetOperations, reservedJoins, reservedPhrases, @@ -156,4 +159,10 @@ export default class TrinoFormatter extends Formatter { ], }); } + + formatOptions(): DialectFormatOptions { + return { + onelineClauses, + }; + } } diff --git a/src/lexer/TokenizerOptions.ts b/src/lexer/TokenizerOptions.ts index ed12f5974..5510fe0a7 100644 --- a/src/lexer/TokenizerOptions.ts +++ b/src/lexer/TokenizerOptions.ts @@ -43,10 +43,10 @@ export interface ParamTypes { } export interface TokenizerOptions { - // Main clauses that start new block, like: WITH, FROM, WHERE, ORDER BY - reservedClauses: string[]; // SELECT clause and its variations reservedSelect: string[]; + // Main clauses that start new block, like: WITH, FROM, WHERE, ORDER BY + reservedClauses: string[]; // True to support XOR in addition to AND and OR supportsXor?: boolean; // Keywords that create newline but no indentaion of their body. diff --git a/test/features/schema.ts b/test/features/schema.ts index 2b10a2155..df8a04bb4 100644 --- a/test/features/schema.ts +++ b/test/features/schema.ts @@ -6,8 +6,7 @@ export default function supportsSchema(format: FormatFn) { it('formats simple SET SCHEMA statements', () => { const result = format('SET SCHEMA schema1;'); expect(result).toBe(dedent` - SET SCHEMA - schema1; + SET SCHEMA schema1; `); }); } From 5ef71439aa67a21f002918201b577dcda270e33e Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sat, 1 Oct 2022 12:27:24 +0300 Subject: [PATCH 03/28] Apply oneline formatting to TRUNCATE TABLE --- src/languages/bigquery/bigquery.formatter.ts | 7 ++++--- src/languages/db2/db2.formatter.ts | 9 ++++++--- src/languages/hive/hive.formatter.ts | 7 ++++--- src/languages/mariadb/mariadb.formatter.ts | 7 ++++--- src/languages/mysql/mysql.formatter.ts | 7 ++++--- src/languages/plsql/plsql.formatter.ts | 9 ++++++--- src/languages/postgresql/postgresql.formatter.ts | 9 ++++++--- src/languages/redshift/redshift.formatter.ts | 7 ++++--- src/languages/singlestoredb/singlestoredb.formatter.ts | 8 ++++---- src/languages/snowflake/snowflake.formatter.ts | 8 ++++---- src/languages/spark/spark.formatter.ts | 7 ++++--- src/languages/sql/sql.formatter.ts | 9 ++++++--- src/languages/transactsql/transactsql.formatter.ts | 7 ++++--- src/languages/trino/trino.formatter.ts | 7 ++++--- test/features/truncateTable.ts | 6 ++---- 15 files changed, 66 insertions(+), 48 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index 2f9bf25d3..325d2dfbf 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -31,8 +31,6 @@ const reservedClauses = expandPhrases([ 'SET', // - delete: 'DELETE [FROM]', - // - truncate: - 'TRUNCATE TABLE', // - merge: 'MERGE [INTO]', 'WHEN [NOT] MATCHED [BY SOURCE | BY TARGET] [THEN]', @@ -116,7 +114,10 @@ const reservedClauses = expandPhrases([ 'EXPORT DATA', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', +]); const reservedSetOperations = expandPhrases([ 'UNION {ALL | DISTINCT}', diff --git a/src/languages/db2/db2.formatter.ts b/src/languages/db2/db2.formatter.ts index 00fa7fd2a..59422ae76 100644 --- a/src/languages/db2/db2.formatter.ts +++ b/src/languages/db2/db2.formatter.ts @@ -28,8 +28,6 @@ const reservedClauses = expandPhrases([ 'WITH {RR | RS | CS | UR}', // - delete: 'DELETE FROM', - // - truncate: - 'TRUNCATE [TABLE]', // - merge: 'MERGE INTO', 'WHEN [NOT] MATCHED [THEN]', @@ -158,7 +156,12 @@ const reservedClauses = expandPhrases([ 'SET CURRENT SCHEMA', ]); -const onelineClauses = expandPhrases(['SET SCHEMA']); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', + // other + 'SET SCHEMA', +]); const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT [ALL]', 'INTERSECT [ALL]']); diff --git a/src/languages/hive/hive.formatter.ts b/src/languages/hive/hive.formatter.ts index 9097f1256..6660d0327 100644 --- a/src/languages/hive/hive.formatter.ts +++ b/src/languages/hive/hive.formatter.ts @@ -32,8 +32,6 @@ const reservedClauses = expandPhrases([ 'SET', // - delete: 'DELETE FROM', - // - truncate: - 'TRUNCATE [TABLE]', // - merge: 'MERGE INTO', 'WHEN [NOT] MATCHED [THEN]', @@ -68,7 +66,10 @@ const reservedClauses = expandPhrases([ 'ROW FORMAT', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', +]); const reservedSetOperations = expandPhrases(['UNION [ALL | DISTINCT]']); diff --git a/src/languages/mariadb/mariadb.formatter.ts b/src/languages/mariadb/mariadb.formatter.ts index d400a871f..399b92bc2 100644 --- a/src/languages/mariadb/mariadb.formatter.ts +++ b/src/languages/mariadb/mariadb.formatter.ts @@ -30,8 +30,6 @@ const reservedClauses = expandPhrases([ 'SET', // - delete: 'DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM', - // - truncate: - 'TRUNCATE [TABLE]', // Data definition 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', 'CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS]', @@ -237,7 +235,10 @@ const reservedClauses = expandPhrases([ 'XA START', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', +]); const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', diff --git a/src/languages/mysql/mysql.formatter.ts b/src/languages/mysql/mysql.formatter.ts index d991b8063..3e169744b 100644 --- a/src/languages/mysql/mysql.formatter.ts +++ b/src/languages/mysql/mysql.formatter.ts @@ -30,8 +30,6 @@ const reservedClauses = expandPhrases([ 'SET', // - delete: 'DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM', - // - truncate: - 'TRUNCATE [TABLE]', // Data definition 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', 'CREATE [TEMPORARY] TABLE [IF NOT EXISTS]', @@ -210,7 +208,10 @@ const reservedClauses = expandPhrases([ 'WHILE', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', +]); const reservedSetOperations = expandPhrases(['UNION [ALL | DISTINCT]']); diff --git a/src/languages/plsql/plsql.formatter.ts b/src/languages/plsql/plsql.formatter.ts index a53f01b33..fbc855139 100644 --- a/src/languages/plsql/plsql.formatter.ts +++ b/src/languages/plsql/plsql.formatter.ts @@ -29,8 +29,6 @@ const reservedClauses = expandPhrases([ 'SET', // - delete: 'DELETE FROM [ONLY]', - // - truncate: - 'TRUNCATE TABLE', // - merge: 'MERGE [INTO]', 'WHEN [NOT] MATCHED [THEN]', @@ -59,7 +57,12 @@ const reservedClauses = expandPhrases([ 'START WITH', ]); -const onelineClauses = expandPhrases(['SET SCHEMA']); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', + // other + 'SET SCHEMA', +]); const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT']); diff --git a/src/languages/postgresql/postgresql.formatter.ts b/src/languages/postgresql/postgresql.formatter.ts index 6553b9f11..68aec4f49 100644 --- a/src/languages/postgresql/postgresql.formatter.ts +++ b/src/languages/postgresql/postgresql.formatter.ts @@ -30,8 +30,6 @@ const reservedClauses = expandPhrases([ 'WHERE CURRENT OF', // - delete: 'DELETE FROM [ONLY]', - // - truncate: - 'TRUNCATE [TABLE] [ONLY]', // Data definition 'CREATE [OR REPLACE] [TEMP | TEMPORARY] [RECURSIVE] VIEW', 'CREATE MATERIALIZED VIEW [IF NOT EXISTS]', @@ -223,7 +221,12 @@ const reservedClauses = expandPhrases([ 'AFTER', ]); -const onelineClauses = expandPhrases(['SET SCHEMA']); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE] [ONLY]', + // other + 'SET SCHEMA', +]); const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', diff --git a/src/languages/redshift/redshift.formatter.ts b/src/languages/redshift/redshift.formatter.ts index 206083363..f9e6792d8 100644 --- a/src/languages/redshift/redshift.formatter.ts +++ b/src/languages/redshift/redshift.formatter.ts @@ -27,8 +27,6 @@ const reservedClauses = expandPhrases([ 'SET', // - delete: 'DELETE [FROM]', - // - truncate: - 'TRUNCATE [TABLE]', // Data definition 'CREATE [OR REPLACE | MATERIALIZED] VIEW', 'CREATE [TEMPORARY | TEMP | LOCAL TEMPORARY | LOCAL TEMP] TABLE [IF NOT EXISTS]', @@ -119,7 +117,10 @@ const reservedClauses = expandPhrases([ 'ALTER COLUMN', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', +]); const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT', 'MINUS']); diff --git a/src/languages/singlestoredb/singlestoredb.formatter.ts b/src/languages/singlestoredb/singlestoredb.formatter.ts index a9de70c48..0180c6922 100644 --- a/src/languages/singlestoredb/singlestoredb.formatter.ts +++ b/src/languages/singlestoredb/singlestoredb.formatter.ts @@ -29,8 +29,6 @@ const reservedClauses = expandPhrases([ 'SET', // - delete: 'DELETE [FROM]', - // - truncate: - 'TRUNCATE [TABLE]', // Data definition 'CREATE VIEW', 'CREATE [ROWSTORE] [REFERENCE | TEMPORARY | GLOBAL TEMPORARY] TABLE [IF NOT EXISTS]', @@ -194,7 +192,6 @@ const reservedClauses = expandPhrases([ 'STOP REPLICATING', 'STOP SLAVE', 'TEST PIPELINE', - 'TRUNCATE TABLE', 'UNLOCK INSTANCE', 'UNLOCK TABLES', 'USE', @@ -208,7 +205,10 @@ const reservedClauses = expandPhrases([ 'WHILE', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', +]); const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', diff --git a/src/languages/snowflake/snowflake.formatter.ts b/src/languages/snowflake/snowflake.formatter.ts index 29c3960ab..67a1d46f2 100644 --- a/src/languages/snowflake/snowflake.formatter.ts +++ b/src/languages/snowflake/snowflake.formatter.ts @@ -40,8 +40,6 @@ const reservedClauses = expandPhrases([ 'SET', // - delete: 'DELETE FROM', - // - truncate: - 'TRUNCATE [TABLE] [IF EXISTS]', // Data definition // - view 'CREATE [OR REPLACE] [SECURE] [RECURSIVE] VIEW [IF NOT EXISTS]', @@ -93,7 +91,6 @@ const reservedClauses = expandPhrases([ // - CREATE TABLE // - CREATE VIEW // - DROP TABLE - // - TRUNCATE TABLE // - SELECT // - UPDATE // - SET @@ -299,7 +296,10 @@ const reservedClauses = expandPhrases([ 'USE WAREHOUSE', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE] [IF EXISTS]', +]); const reservedSetOperations = expandPhrases(['UNION [ALL]', 'MINUS', 'EXCEPT', 'INTERSECT']); diff --git a/src/languages/spark/spark.formatter.ts b/src/languages/spark/spark.formatter.ts index d8ed741d8..2d9cb7123 100644 --- a/src/languages/spark/spark.formatter.ts +++ b/src/languages/spark/spark.formatter.ts @@ -27,8 +27,6 @@ const reservedClauses = expandPhrases([ // - insert: 'INSERT [INTO | OVERWRITE] [TABLE]', 'VALUES', - // - truncate: - 'TRUNCATE TABLE', // - insert overwrite directory: // https://spark.apache.org/docs/latest/sql-ref-syntax-dml-insert-overwrite-directory.html 'INSERT OVERWRITE [LOCAL] DIRECTORY', @@ -92,7 +90,10 @@ const reservedClauses = expandPhrases([ 'LATERAL VIEW', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', +]); const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', diff --git a/src/languages/sql/sql.formatter.ts b/src/languages/sql/sql.formatter.ts index 9753e027a..19a20953d 100644 --- a/src/languages/sql/sql.formatter.ts +++ b/src/languages/sql/sql.formatter.ts @@ -30,8 +30,6 @@ const reservedClauses = expandPhrases([ 'WHERE CURRENT OF', // - delete: 'DELETE FROM', - // - truncate: - 'TRUNCATE TABLE', // Data definition 'CREATE [RECURSIVE] VIEW', 'CREATE [GLOBAL TEMPORARY | LOCAL TEMPORARY] TABLE', @@ -49,7 +47,12 @@ const reservedClauses = expandPhrases([ 'RESTART WITH', // for alter column ]); -const onelineClauses = expandPhrases(['SET SCHEMA']); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', + // other + 'SET SCHEMA', +]); const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', diff --git a/src/languages/transactsql/transactsql.formatter.ts b/src/languages/transactsql/transactsql.formatter.ts index cad043a2e..064236a30 100644 --- a/src/languages/transactsql/transactsql.formatter.ts +++ b/src/languages/transactsql/transactsql.formatter.ts @@ -29,8 +29,6 @@ const reservedClauses = expandPhrases([ 'WHERE CURRENT OF', // - delete: 'DELETE [FROM]', - // - truncate: - 'TRUNCATE TABLE', // - merge: 'MERGE [INTO]', 'WHEN [NOT] MATCHED [BY TARGET | BY SOURCE] [THEN]', @@ -201,7 +199,10 @@ const reservedClauses = expandPhrases([ 'XML SCHEMA COLLECTION', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', +]); const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT']); diff --git a/src/languages/trino/trino.formatter.ts b/src/languages/trino/trino.formatter.ts index b805317c2..df7c1d407 100644 --- a/src/languages/trino/trino.formatter.ts +++ b/src/languages/trino/trino.formatter.ts @@ -30,8 +30,6 @@ const reservedClauses = expandPhrases([ 'SET', // - delete: 'DELETE FROM', - // - truncate: - 'TRUNCATE TABLE', // Data definition 'CREATE [OR REPLACE] [MATERIALIZED] VIEW', 'CREATE TABLE [IF NOT EXISTS]', @@ -101,7 +99,10 @@ const reservedClauses = expandPhrases([ 'DEFINE', ]); -const onelineClauses = expandPhrases([]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', +]); // https://github.com/trinodb/trino/blob/432d2897bdef99388c1a47188743a061c4ac1f34/core/trino-parser/src/main/antlr4/io/trino/sql/parser/SqlBase.g4#L231-L235 // https://github.com/trinodb/trino/blob/432d2897bdef99388c1a47188743a061c4ac1f34/core/trino-parser/src/main/antlr4/io/trino/sql/parser/SqlBase.g4#L288-L291 diff --git a/test/features/truncateTable.ts b/test/features/truncateTable.ts index 3346097cb..169a9250c 100644 --- a/test/features/truncateTable.ts +++ b/test/features/truncateTable.ts @@ -13,8 +13,7 @@ export default function supportsTruncateTable( it('formats TRUNCATE TABLE statement', () => { const result = format('TRUNCATE TABLE Customers;'); expect(result).toBe(dedent` - TRUNCATE TABLE - Customers; + TRUNCATE TABLE Customers; `); }); @@ -22,8 +21,7 @@ export default function supportsTruncateTable( it('formats TRUNCATE statement (without TABLE)', () => { const result = format('TRUNCATE Customers;'); expect(result).toBe(dedent` - TRUNCATE - Customers; + TRUNCATE Customers; `); }); } From 8847badf14e0f6146ea746f01f6c5fe1dd5ae126 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sat, 1 Oct 2022 12:34:45 +0300 Subject: [PATCH 04/28] Use oneline format for many BigQuery clauses --- src/languages/bigquery/bigquery.formatter.ts | 11 +++++---- test/bigquery.test.ts | 24 +++++++------------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index 325d2dfbf..1fff84fb7 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -83,6 +83,12 @@ const reservedClauses = expandPhrases([ 'DROP ASSIGNMENT [IF EXISTS]', 'DROP SEARCH INDEX [IF EXISTS]', 'DROP [IF EXISTS]', +]); + +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', + // DCL, https://cloud.google.com/bigquery/docs/reference/standard-sql/data-control-language 'GRANT', 'REVOKE', @@ -114,11 +120,6 @@ const reservedClauses = expandPhrases([ 'EXPORT DATA', ]); -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE TABLE', -]); - const reservedSetOperations = expandPhrases([ 'UNION {ALL | DISTINCT}', 'EXCEPT DISTINCT', diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index d2834cfca..0dade7d46 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -213,18 +213,12 @@ describe('BigQueryFormatter', () => { { linesBetweenQueries: 0 } ); expect(result).toBe(dedent` - DECLARE - varString STRING(11) '11charswide'; - DECLARE - varBytes BYTES(8); - DECLARE - varNumeric NUMERIC(1, 1); - DECLARE - varDecimal DECIMAL(1, 1); - DECLARE - varBignumeric BIGNUMERIC(1, 1); - DECLARE - varBigdecimal BIGDECIMAL(1, 1); + DECLARE varString STRING(11) '11charswide'; + DECLARE varBytes BYTES(8); + DECLARE varNumeric NUMERIC(1, 1); + DECLARE varDecimal DECIMAL(1, 1); + DECLARE varBignumeric BIGNUMERIC(1, 1); + DECLARE varBigdecimal BIGDECIMAL(1, 1); `); }); @@ -268,8 +262,7 @@ describe('BigQueryFormatter', () => { FROM Produce PIVOT( sales - FOR - quarter IN (Q1, Q2, Q3, Q4) + FOR quarter IN (Q1, Q2, Q3, Q4) ); `); }); @@ -282,8 +275,7 @@ describe('BigQueryFormatter', () => { FROM Produce UNPIVOT( sales - FOR - quarter IN (Q1, Q2, Q3, Q4) + FOR quarter IN (Q1, Q2, Q3, Q4) ); `); }); From f38641a1d0d46033a8b7251cd6f64319a9c435a9 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sat, 1 Oct 2022 12:56:13 +0300 Subject: [PATCH 05/28] Format all extra (untested) clauses on single line --- src/languages/db2/db2.formatter.ts | 19 +++++------- src/languages/hive/hive.formatter.ts | 10 +++--- src/languages/mariadb/mariadb.formatter.ts | 12 +++---- src/languages/mysql/mysql.formatter.ts | 9 +++--- src/languages/n1ql/n1ql.formatter.ts | 15 +++++---- src/languages/plsql/plsql.formatter.ts | 15 +++++---- .../postgresql/postgresql.formatter.ts | 19 ++++++------ src/languages/redshift/redshift.formatter.ts | 11 +++---- .../singlestoredb/singlestoredb.formatter.ts | 9 +++--- .../snowflake/snowflake.formatter.ts | 30 +++--------------- src/languages/spark/spark.formatter.ts | 13 ++++---- .../transactsql/transactsql.formatter.ts | 9 +++--- src/languages/trino/trino.formatter.ts | 31 +++++++++---------- test/redshift.test.ts | 3 +- test/trino.test.ts | 3 +- 15 files changed, 87 insertions(+), 121 deletions(-) diff --git a/src/languages/db2/db2.formatter.ts b/src/languages/db2/db2.formatter.ts index 59422ae76..4b34b76b9 100644 --- a/src/languages/db2/db2.formatter.ts +++ b/src/languages/db2/db2.formatter.ts @@ -46,7 +46,15 @@ const reservedClauses = expandPhrases([ 'SET DATA TYPE', // for alter column 'SET NOT NULL', // for alter column 'DROP {IDENTITY | EXPRESSION | DEFAULT | NOT NULL}', // for alter column +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', + // other + 'SET [CURRENT] SCHEMA', + 'AFTER', + 'GO', // https://www.ibm.com/docs/en/db2-for-zos/11?topic=statements-list-supported 'ALLOCATE CURSOR', 'ALTER DATABASE', @@ -150,17 +158,6 @@ const reservedClauses = expandPhrases([ 'SIGNAL', 'VALUES INTO', 'WHENEVER', - // other - 'AFTER', - 'GO', - 'SET CURRENT SCHEMA', -]); - -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE [TABLE]', - // other - 'SET SCHEMA', ]); const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT [ALL]', 'INTERSECT [ALL]']); diff --git a/src/languages/hive/hive.formatter.ts b/src/languages/hive/hive.formatter.ts index 6660d0327..fc428d94d 100644 --- a/src/languages/hive/hive.formatter.ts +++ b/src/languages/hive/hive.formatter.ts @@ -51,7 +51,11 @@ const reservedClauses = expandPhrases([ // - alter table: 'ALTER TABLE', 'RENAME TO', +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', // other 'ALTER', 'CREATE', @@ -60,17 +64,11 @@ const reservedClauses = expandPhrases([ 'DROP', 'FETCH', 'SHOW', - // newline keywords 'STORED AS', 'STORED BY', 'ROW FORMAT', ]); -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE [TABLE]', -]); - const reservedSetOperations = expandPhrases(['UNION [ALL | DISTINCT]']); const reservedJoins = expandPhrases([ diff --git a/src/languages/mariadb/mariadb.formatter.ts b/src/languages/mariadb/mariadb.formatter.ts index 399b92bc2..2c7958c9d 100644 --- a/src/languages/mariadb/mariadb.formatter.ts +++ b/src/languages/mariadb/mariadb.formatter.ts @@ -44,7 +44,13 @@ const reservedClauses = expandPhrases([ 'ALTER [COLUMN]', '{SET | DROP} DEFAULT', // for alter column 'SET {VISIBLE | INVISIBLE}', // for alter column + // other + 'RETURNING', +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', // https://mariadb.com/docs/reference/mdb/sql-statements/ 'ALTER DATABASE', 'ALTER DATABASE COMMENT', @@ -128,7 +134,6 @@ const reservedClauses = expandPhrases([ 'RESET REPLICA', 'RESET SLAVE', 'RESIGNAL', - 'RETURNING', 'REVOKE', 'ROLLBACK', 'SAVEPOINT', @@ -235,11 +240,6 @@ const reservedClauses = expandPhrases([ 'XA START', ]); -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE [TABLE]', -]); - const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', 'EXCEPT [ALL | DISTINCT]', diff --git a/src/languages/mysql/mysql.formatter.ts b/src/languages/mysql/mysql.formatter.ts index 3e169744b..864193545 100644 --- a/src/languages/mysql/mysql.formatter.ts +++ b/src/languages/mysql/mysql.formatter.ts @@ -43,7 +43,11 @@ const reservedClauses = expandPhrases([ 'RENAME COLUMN', 'ALTER [COLUMN]', '{SET | DROP} DEFAULT', // for alter column +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', // https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html 'ALTER DATABASE', 'ALTER EVENT', @@ -208,11 +212,6 @@ const reservedClauses = expandPhrases([ 'WHILE', ]); -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE [TABLE]', -]); - const reservedSetOperations = expandPhrases(['UNION [ALL | DISTINCT]']); const reservedJoins = expandPhrases([ diff --git a/src/languages/n1ql/n1ql.formatter.ts b/src/languages/n1ql/n1ql.formatter.ts index 112679b42..61a933bc0 100644 --- a/src/languages/n1ql/n1ql.formatter.ts +++ b/src/languages/n1ql/n1ql.formatter.ts @@ -33,6 +33,15 @@ const reservedClauses = expandPhrases([ 'WHEN [NOT] MATCHED THEN', 'UPDATE SET', 'INSERT', + // other + 'USE KEYS', + 'NEST', + 'UNNEST', + 'RETURNING', +]); + +const onelineClauses = expandPhrases([ + 'SET SCHEMA', // https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/reservedwords.html 'ADVISE', 'ALTER INDEX', @@ -55,7 +64,6 @@ const reservedClauses = expandPhrases([ 'GRANT', 'INFER', 'PREPARE', - 'RETURNING', 'REVOKE', 'ROLLBACK TRANSACTION', 'SAVEPOINT', @@ -64,15 +72,10 @@ const reservedClauses = expandPhrases([ 'UPSERT', // other 'LET', - 'NEST', 'SET CURRENT SCHEMA', 'SHOW', - 'UNNEST', - 'USE KEYS', ]); -const onelineClauses = expandPhrases(['SET SCHEMA']); - const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT [ALL]', 'INTERSECT [ALL]']); const reservedJoins = expandPhrases(['JOIN', '{LEFT | RIGHT} [OUTER] JOIN', 'INNER JOIN']); diff --git a/src/languages/plsql/plsql.formatter.ts b/src/languages/plsql/plsql.formatter.ts index fbc855139..79537a394 100644 --- a/src/languages/plsql/plsql.formatter.ts +++ b/src/languages/plsql/plsql.formatter.ts @@ -45,16 +45,8 @@ const reservedClauses = expandPhrases([ 'MODIFY', 'RENAME TO', 'RENAME COLUMN', - // other - 'BEGIN', - 'CONNECT BY', - 'DECLARE', - 'EXCEPT', - 'EXCEPTION', - 'LOOP', 'RETURNING', - 'START WITH', ]); const onelineClauses = expandPhrases([ @@ -62,6 +54,13 @@ const onelineClauses = expandPhrases([ 'TRUNCATE TABLE', // other 'SET SCHEMA', + 'BEGIN', + 'CONNECT BY', + 'DECLARE', + 'EXCEPT', + 'EXCEPTION', + 'LOOP', + 'START WITH', ]); const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT']); diff --git a/src/languages/postgresql/postgresql.formatter.ts b/src/languages/postgresql/postgresql.formatter.ts index 68aec4f49..1445c350b 100644 --- a/src/languages/postgresql/postgresql.formatter.ts +++ b/src/languages/postgresql/postgresql.formatter.ts @@ -46,7 +46,16 @@ const reservedClauses = expandPhrases([ '[SET DATA] TYPE', // for alter column '{SET | DROP} DEFAULT', // for alter column '{SET | DROP} NOT NULL', // for alter column + // other + 'RETURNING', +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE] [ONLY]', + // other + 'SET SCHEMA', + 'AFTER', // https://www.postgresql.org/docs/14/sql-commands.html 'ABORT', 'ALTER AGGREGATE', @@ -201,7 +210,6 @@ const reservedClauses = expandPhrases([ 'REINDEX', 'RELEASE SAVEPOINT', 'RESET', - 'RETURNING', 'REVOKE', 'ROLLBACK', 'ROLLBACK PREPARED', @@ -217,15 +225,6 @@ const reservedClauses = expandPhrases([ 'START TRANSACTION', 'UNLISTEN', 'VACUUM', - // other - 'AFTER', -]); - -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE [TABLE] [ONLY]', - // other - 'SET SCHEMA', ]); const reservedSetOperations = expandPhrases([ diff --git a/src/languages/redshift/redshift.formatter.ts b/src/languages/redshift/redshift.formatter.ts index f9e6792d8..4a946c889 100644 --- a/src/languages/redshift/redshift.formatter.ts +++ b/src/languages/redshift/redshift.formatter.ts @@ -41,7 +41,11 @@ const reservedClauses = expandPhrases([ 'ALTER COLUMN', 'TYPE', // for alter column 'ENCODE', // for alter column +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', // https://docs.aws.amazon.com/redshift/latest/dg/c_SQL_commands.html 'ABORT', 'ALTER DATABASE', @@ -113,13 +117,6 @@ const reservedClauses = expandPhrases([ 'START TRANSACTION', 'UNLOAD', 'VACUUM', - // other - 'ALTER COLUMN', -]); - -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE [TABLE]', ]); const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT', 'MINUS']); diff --git a/src/languages/singlestoredb/singlestoredb.formatter.ts b/src/languages/singlestoredb/singlestoredb.formatter.ts index 0180c6922..8ac8567cc 100644 --- a/src/languages/singlestoredb/singlestoredb.formatter.ts +++ b/src/languages/singlestoredb/singlestoredb.formatter.ts @@ -43,7 +43,11 @@ const reservedClauses = expandPhrases([ 'MODIFY [COLUMN]', 'CHANGE', 'RENAME [TO | AS]', +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE]', // https://docs.singlestore.com/managed-service/en/reference/sql-reference.html 'ADD AGGREGATOR', 'ADD LEAF', @@ -205,11 +209,6 @@ const reservedClauses = expandPhrases([ 'WHILE', ]); -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE [TABLE]', -]); - const reservedSetOperations = expandPhrases([ 'UNION [ALL | DISTINCT]', 'EXCEPT', diff --git a/src/languages/snowflake/snowflake.formatter.ts b/src/languages/snowflake/snowflake.formatter.ts index 67a1d46f2..f2ff54c03 100644 --- a/src/languages/snowflake/snowflake.formatter.ts +++ b/src/languages/snowflake/snowflake.formatter.ts @@ -7,17 +7,6 @@ import { keywords } from './snowflake.keywords'; const reservedSelect = expandPhrases(['SELECT [ALL | DISTINCT]']); -// https://docs.snowflake.com/en/sql-reference/sql-all.html -// -// 1. run in console on this page: $x('//tbody/tr/*[1]//a/span/text()').map(x => x.nodeValue) -// 2. delete all lines that contain a sting like '(.*)', they are already covered in the list -// 3. delete all lines that contain a sting like '<.*>', they are already covered in the list -// 4. delete all lines that contain '…', they are part of a regex statement that can't be covered here -// 5. Manually add 'COPY INTO' -// -// Steps 1-4 can be combined by the following script in the developer console: -// $x('//tbody/tr/*[1]//a/span/text()').map(x => x.nodeValue) // Step 1 -// filter(x => !x.match(/\(.*\)/) && !x.match(/…/) && !x.match(/<.*>/)) // Step 2-4 const reservedClauses = expandPhrases([ // queries 'WITH [RECURSIVE]', @@ -76,7 +65,11 @@ const reservedClauses = expandPhrases([ '[SET DATA] TYPE', // for alter column '[UNSET] COMMENT', // for alter column '{SET | UNSET} MASKING POLICY', // for alter column +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE [TABLE] [IF EXISTS]', // other // https://docs.snowflake.com/en/sql-reference/sql-all.html // @@ -85,15 +78,7 @@ const reservedClauses = expandPhrases([ // 3. delete all lines that contain a sting like '<.*>', they are already covered in the list // 4. delete all lines that contain '…', they are part of a regex statement that can't be covered here // 5. Manually add 'COPY INTO' - // 6. Remove all lines that are already in the above definitions: - // - ALTER TABLE - // - COMMENT - // - CREATE TABLE - // - CREATE VIEW - // - DROP TABLE - // - SELECT - // - UPDATE - // - SET + // 6. Remove all lines that are already in `reservedClauses` // // Steps 1-4 can be combined by the following script in the developer console: // $x('//tbody/tr/*[1]//a/span/text()').map(x => x.nodeValue) // Step 1 @@ -296,11 +281,6 @@ const reservedClauses = expandPhrases([ 'USE WAREHOUSE', ]); -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE [TABLE] [IF EXISTS]', -]); - const reservedSetOperations = expandPhrases(['UNION [ALL]', 'MINUS', 'EXCEPT', 'INTERSECT']); const reservedJoins = expandPhrases([ diff --git a/src/languages/spark/spark.formatter.ts b/src/languages/spark/spark.formatter.ts index 2d9cb7123..2d4e4f2cb 100644 --- a/src/languages/spark/spark.formatter.ts +++ b/src/languages/spark/spark.formatter.ts @@ -45,7 +45,13 @@ const reservedClauses = expandPhrases([ 'RENAME TO', 'RENAME COLUMN', 'ALTER COLUMN', +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', + // other + 'LATERAL VIEW', 'ALTER DATABASE', 'ALTER VIEW', 'CREATE DATABASE', @@ -86,13 +92,6 @@ const reservedClauses = expandPhrases([ 'SHOW TBLPROPERTIES', 'SHOW VIEWS', 'UNCACHE TABLE', - // other - 'LATERAL VIEW', -]); - -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE TABLE', ]); const reservedSetOperations = expandPhrases([ diff --git a/src/languages/transactsql/transactsql.formatter.ts b/src/languages/transactsql/transactsql.formatter.ts index 064236a30..5e8187ba1 100644 --- a/src/languages/transactsql/transactsql.formatter.ts +++ b/src/languages/transactsql/transactsql.formatter.ts @@ -42,7 +42,11 @@ const reservedClauses = expandPhrases([ 'ADD', 'DROP COLUMN [IF EXISTS]', 'ALTER COLUMN', +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', // https://docs.microsoft.com/en-us/sql/t-sql/statements/statements?view=sql-server-ver15 'ADD SENSITIVITY CLASSIFICATION', 'ADD SIGNATURE', @@ -199,11 +203,6 @@ const reservedClauses = expandPhrases([ 'XML SCHEMA COLLECTION', ]); -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE TABLE', -]); - const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT']); const reservedJoins = expandPhrases([ diff --git a/src/languages/trino/trino.formatter.ts b/src/languages/trino/trino.formatter.ts index df7c1d407..54aad9746 100644 --- a/src/languages/trino/trino.formatter.ts +++ b/src/languages/trino/trino.formatter.ts @@ -43,14 +43,28 @@ const reservedClauses = expandPhrases([ 'SET AUTHORIZATION [USER | ROLE]', 'SET PROPERTIES', 'EXECUTE', + // MATCH_RECOGNIZE + 'MATCH_RECOGNIZE', + 'MEASURES', + 'ONE ROW PER MATCH', + 'ALL ROWS PER MATCH', + 'AFTER MATCH', + 'PATTERN', + 'SUBSET', + 'DEFINE', +]); +const onelineClauses = expandPhrases([ + // - truncate: + 'TRUNCATE TABLE', + + // other 'ALTER SCHEMA', 'ALTER MATERIALIZED VIEW', 'ALTER VIEW', 'CREATE SCHEMA', 'CREATE ROLE', 'DROP SCHEMA', - 'DROP COLUMN', 'DROP MATERIALIZED VIEW', 'DROP VIEW', 'DROP ROLE', @@ -87,21 +101,6 @@ const reservedClauses = expandPhrases([ 'SHOW ROLE GRANTS', 'SHOW FUNCTIONS', 'SHOW SESSION', - - // MATCH_RECOGNIZE - 'MATCH_RECOGNIZE', - 'MEASURES', - 'ONE ROW PER MATCH', - 'ALL ROWS PER MATCH', - 'AFTER MATCH', - 'PATTERN', - 'SUBSET', - 'DEFINE', -]); - -const onelineClauses = expandPhrases([ - // - truncate: - 'TRUNCATE TABLE', ]); // https://github.com/trinodb/trino/blob/432d2897bdef99388c1a47188743a061c4ac1f34/core/trino-parser/src/main/antlr4/io/trino/sql/parser/SqlBase.g4#L231-L235 diff --git a/test/redshift.test.ts b/test/redshift.test.ts index a537330be..75dca5583 100644 --- a/test/redshift.test.ts +++ b/test/redshift.test.ts @@ -121,8 +121,7 @@ describe('RedshiftFormatter', () => { REGION AS 'us-east-1' `) ).toBe(dedent` - COPY - schema.table + COPY schema.table FROM 's3://bucket/file.csv' IAM_ROLE 'arn:aws:iam::123456789:role/rolename' FORMAT AS CSV DELIMITER ',' QUOTE '"' REGION AS 'us-east-1' `); diff --git a/test/trino.test.ts b/test/trino.test.ts index 540b52195..2d752f600 100644 --- a/test/trino.test.ts +++ b/test/trino.test.ts @@ -59,8 +59,7 @@ describe('TrinoFormatter', () => { it('formats SET SESSION', () => { const result = format('SET SESSION foo = 444;'); expect(result).toBe(dedent` - SET SESSION - foo = 444; + SET SESSION foo = 444; `); }); From 76db36792ec77d4fc94e0a491c6587e2d6c42f37 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sat, 1 Oct 2022 13:09:12 +0300 Subject: [PATCH 06/28] Optimize lookup of onelineClauses --- src/formatter/ExpressionFormatter.ts | 13 ++++++++++--- src/formatter/Formatter.ts | 21 +++++++++++++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/formatter/ExpressionFormatter.ts b/src/formatter/ExpressionFormatter.ts index 72f0ffab0..0a4124c44 100644 --- a/src/formatter/ExpressionFormatter.ts +++ b/src/formatter/ExpressionFormatter.ts @@ -36,7 +36,7 @@ import InlineLayout, { InlineLayoutError } from './InlineLayout'; interface ExpressionFormatterParams { cfg: FormatOptions; - dialectCfg: DialectFormatOptions; + dialectCfg: ProcessedDialectFormatOptions; params: Params; layout: Layout; inline?: boolean; @@ -49,10 +49,17 @@ export interface DialectFormatOptions { onelineClauses: string[]; } +// Contains the same data as DialectFormatOptions, +// but optimized for faster and more conventient lookup. +export interface ProcessedDialectFormatOptions { + alwaysDenseOperators?: string[]; + onelineClauses: Record; +} + /** Formats a generic SQL expression */ export default class ExpressionFormatter { private cfg: FormatOptions; - private dialectCfg: DialectFormatOptions; + private dialectCfg: ProcessedDialectFormatOptions; private params: Params; private layout: Layout; @@ -209,7 +216,7 @@ export default class ExpressionFormatter { } private formatClause(node: ClauseNode) { - const isOnelineClause = this.dialectCfg.onelineClauses.includes(node.nameKw.text); + const isOnelineClause = this.dialectCfg.onelineClauses[node.nameKw.text]; if (isTabularStyle(this.cfg) || isOnelineClause) { this.layout.add(WS.NEWLINE, WS.INDENT, this.showKw(node.nameKw), WS.SPACE); diff --git a/src/formatter/Formatter.ts b/src/formatter/Formatter.ts index 97b50add8..6d0bf1951 100644 --- a/src/formatter/Formatter.ts +++ b/src/formatter/Formatter.ts @@ -8,7 +8,10 @@ import { StatementNode } from 'src/parser/ast'; import formatCommaPositions from './formatCommaPositions'; import formatAliasPositions from './formatAliasPositions'; -import ExpressionFormatter, { DialectFormatOptions } from './ExpressionFormatter'; +import ExpressionFormatter, { + DialectFormatOptions, + ProcessedDialectFormatOptions, +} from './ExpressionFormatter'; import Layout, { WS } from './Layout'; import Indentation from './Indentation'; @@ -47,6 +50,20 @@ export default class Formatter { throw new Error('formatOptions() not implemented by sybclass'); } + private cachedFormatOptions(): ProcessedDialectFormatOptions { + const cls: Function & { cachedFormatOptions?: ProcessedDialectFormatOptions } = + this.constructor; + + if (!cls.cachedFormatOptions) { + const opts = this.formatOptions(); + cls.cachedFormatOptions = { + alwaysDenseOperators: opts.alwaysDenseOperators, + onelineClauses: Object.fromEntries(opts.onelineClauses.map(name => [name, true])), + }; + } + return cls.cachedFormatOptions; + } + /** * Formats an SQL query. * @param {string} query - The SQL query string to be formatted @@ -73,7 +90,7 @@ export default class Formatter { private formatStatement(statement: StatementNode): string { const layout = new ExpressionFormatter({ cfg: this.cfg, - dialectCfg: this.formatOptions(), + dialectCfg: this.cachedFormatOptions(), params: this.params, layout: new Layout(new Indentation(indentString(this.cfg))), }).format(statement.children); From 36dd5811a3eed68413b17fa7e69be30c2586006c Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sat, 1 Oct 2022 13:10:23 +0300 Subject: [PATCH 07/28] Ensure alwaysDenseOperators field is always an array --- src/formatter/ExpressionFormatter.ts | 4 ++-- src/formatter/Formatter.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/formatter/ExpressionFormatter.ts b/src/formatter/ExpressionFormatter.ts index 0a4124c44..4fa25b310 100644 --- a/src/formatter/ExpressionFormatter.ts +++ b/src/formatter/ExpressionFormatter.ts @@ -52,7 +52,7 @@ export interface DialectFormatOptions { // Contains the same data as DialectFormatOptions, // but optimized for faster and more conventient lookup. export interface ProcessedDialectFormatOptions { - alwaysDenseOperators?: string[]; + alwaysDenseOperators: string[]; onelineClauses: Record; } @@ -278,7 +278,7 @@ export default class ExpressionFormatter { } private formatOperator({ text }: OperatorNode) { - if (this.cfg.denseOperators || this.dialectCfg.alwaysDenseOperators?.includes(text)) { + if (this.cfg.denseOperators || this.dialectCfg.alwaysDenseOperators.includes(text)) { this.layout.add(WS.NO_SPACE, text); } else if (text === ':') { this.layout.add(WS.NO_SPACE, text, WS.SPACE); diff --git a/src/formatter/Formatter.ts b/src/formatter/Formatter.ts index 6d0bf1951..1cfb4f9c5 100644 --- a/src/formatter/Formatter.ts +++ b/src/formatter/Formatter.ts @@ -57,7 +57,7 @@ export default class Formatter { if (!cls.cachedFormatOptions) { const opts = this.formatOptions(); cls.cachedFormatOptions = { - alwaysDenseOperators: opts.alwaysDenseOperators, + alwaysDenseOperators: opts.alwaysDenseOperators || [], onelineClauses: Object.fromEntries(opts.onelineClauses.map(name => [name, true])), }; } From 462112d8ee3e6da6ef2240326cac2a08916c8371 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sat, 1 Oct 2022 13:31:21 +0300 Subject: [PATCH 08/28] Extract utility for saving data to class fields --- src/formatter/Formatter.ts | 17 +++++------------ src/utils.ts | 8 ++++++++ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/formatter/Formatter.ts b/src/formatter/Formatter.ts index 1cfb4f9c5..ef2167208 100644 --- a/src/formatter/Formatter.ts +++ b/src/formatter/Formatter.ts @@ -5,6 +5,7 @@ import Tokenizer from 'src/lexer/Tokenizer'; import { createParser } from 'src/parser/createParser'; import { StatementNode } from 'src/parser/ast'; +import { cacheInClassField } from 'src/utils'; import formatCommaPositions from './formatCommaPositions'; import formatAliasPositions from './formatAliasPositions'; @@ -36,11 +37,7 @@ export default class Formatter { // So we wouldn't need to recreate the tokenizer, which is kinda expensive, // for each call to format() function. private cachedTokenizer(): Tokenizer { - const cls: Function & { cachedTokenizer?: Tokenizer } = this.constructor; - if (!cls.cachedTokenizer) { - cls.cachedTokenizer = this.tokenizer(); - } - return cls.cachedTokenizer; + return cacheInClassField(this.constructor, 'cachedTokenizer', () => this.tokenizer()); } /** @@ -51,17 +48,13 @@ export default class Formatter { } private cachedFormatOptions(): ProcessedDialectFormatOptions { - const cls: Function & { cachedFormatOptions?: ProcessedDialectFormatOptions } = - this.constructor; - - if (!cls.cachedFormatOptions) { + return cacheInClassField(this.constructor, 'cachedFormatOptions', () => { const opts = this.formatOptions(); - cls.cachedFormatOptions = { + return { alwaysDenseOperators: opts.alwaysDenseOperators || [], onelineClauses: Object.fromEntries(opts.onelineClauses.map(name => [name, true])), }; - } - return cls.cachedFormatOptions; + }); } /** diff --git a/src/utils.ts b/src/utils.ts index 25eef752f..546cebea3 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -30,3 +30,11 @@ export const isMultiline = (text: string): boolean => /\n/.test(text); // type Foo = { foo?: string, bar: number }; // export type Optional = Pick, K> & Omit; + +// Caches return value of a function in specified field in class object/function +export const cacheInClassField = (cls: any, fieldName: string, fn: () => T): T => { + if (!cls[fieldName]) { + cls[fieldName] = fn(); + } + return cls[fieldName]; +}; From 024492a698e649445e9e4ef0a7d05b3251228f6a Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 15:51:22 +0300 Subject: [PATCH 09/28] Format BigQuery CREATE SCHEMA on single line --- src/languages/bigquery/bigquery.formatter.ts | 5 +++-- test/bigquery.test.ts | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index 1fff84fb7..ff9f48d01 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -50,8 +50,6 @@ const reservedClauses = expandPhrases([ 'DROP NOT NULL', // for alter column 'SET DATA TYPE', // for alter column - 'CREATE SCHEMA [IF NOT EXISTS]', - 'DEFAULT COLLATE', 'CLUSTER BY', 'FOR SYSTEM_TIME AS OF', // CREATE SNAPSHOT TABLE 'WITH CONNECTION', @@ -88,6 +86,9 @@ const reservedClauses = expandPhrases([ const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE TABLE', + // - create schema + 'CREATE SCHEMA [IF NOT EXISTS]', + 'DEFAULT COLLATE', // DCL, https://cloud.google.com/bigquery/docs/reference/standard-sql/data-control-language 'GRANT', diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 0dade7d46..ecb4d81a3 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -328,10 +328,8 @@ describe('BigQueryFormatter', () => { OPTIONS( location="us", labels=[("label1","value1"),("label2","value2")])`; const expected = dedent` - ${createSchema} - mydataset - DEFAULT COLLATE - 'und:ci' OPTIONS( + ${createSchema} mydataset + DEFAULT COLLATE 'und:ci' OPTIONS( location = "us", labels = [("label1", "value1"), ("label2", "value2")] ) From 0d76d3874abbccd0ac0687486aa121aca9ad1e3c Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 15:54:04 +0300 Subject: [PATCH 10/28] Don't indent oneline clause children --- src/formatter/ExpressionFormatter.ts | 8 ++++++-- test/bigquery.test.ts | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/formatter/ExpressionFormatter.ts b/src/formatter/ExpressionFormatter.ts index 4fa25b310..2c941b025 100644 --- a/src/formatter/ExpressionFormatter.ts +++ b/src/formatter/ExpressionFormatter.ts @@ -223,14 +223,18 @@ export default class ExpressionFormatter { } else { this.layout.add(WS.NEWLINE, WS.INDENT, this.showKw(node.nameKw), WS.NEWLINE); } - this.layout.indentation.increaseTopLevel(); + if (!isOnelineClause) { + this.layout.indentation.increaseTopLevel(); + } if (!isTabularStyle(this.cfg) && !isOnelineClause) { this.layout.add(WS.INDENT); } this.layout = this.formatSubExpression(node.children); - this.layout.indentation.decreaseTopLevel(); + if (!isOnelineClause) { + this.layout.indentation.decreaseTopLevel(); + } } private formatSetOperation(node: SetOperationNode) { diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index ecb4d81a3..79038cf4f 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -330,9 +330,9 @@ describe('BigQueryFormatter', () => { const expected = dedent` ${createSchema} mydataset DEFAULT COLLATE 'und:ci' OPTIONS( - location = "us", - labels = [("label1", "value1"), ("label2", "value2")] - ) + location = "us", + labels = [("label1", "value1"), ("label2", "value2")] + ) `; expect(format(input)).toBe(expected); }); From 697901d44a8514daf75a7c8f89fd3ae6a7a11fcf Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 16:01:32 +0300 Subject: [PATCH 11/28] Eliminate complex conditional logic in formatClause Instead use 3 separate methods for the 3 styles of clause formatting --- src/formatter/ExpressionFormatter.ts | 40 ++++++++++++++++++---------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/formatter/ExpressionFormatter.ts b/src/formatter/ExpressionFormatter.ts index 2c941b025..bd8c43cd4 100644 --- a/src/formatter/ExpressionFormatter.ts +++ b/src/formatter/ExpressionFormatter.ts @@ -216,25 +216,37 @@ export default class ExpressionFormatter { } private formatClause(node: ClauseNode) { - const isOnelineClause = this.dialectCfg.onelineClauses[node.nameKw.text]; - - if (isTabularStyle(this.cfg) || isOnelineClause) { - this.layout.add(WS.NEWLINE, WS.INDENT, this.showKw(node.nameKw), WS.SPACE); + if (this.isOnelineClause(node)) { + this.formatClauseInOnelineStyle(node); + } else if (isTabularStyle(this.cfg)) { + this.formatClauseInTabularStyle(node); } else { - this.layout.add(WS.NEWLINE, WS.INDENT, this.showKw(node.nameKw), WS.NEWLINE); - } - if (!isOnelineClause) { - this.layout.indentation.increaseTopLevel(); + this.formatClauseInIndentedStyle(node); } + } - if (!isTabularStyle(this.cfg) && !isOnelineClause) { - this.layout.add(WS.INDENT); - } + private isOnelineClause(node: ClauseNode): boolean { + return this.dialectCfg.onelineClauses[node.nameKw.text]; + } + + private formatClauseInIndentedStyle(node: ClauseNode) { + this.layout.add(WS.NEWLINE, WS.INDENT, this.showKw(node.nameKw), WS.NEWLINE); + this.layout.indentation.increaseTopLevel(); + this.layout.add(WS.INDENT); this.layout = this.formatSubExpression(node.children); + this.layout.indentation.decreaseTopLevel(); + } - if (!isOnelineClause) { - this.layout.indentation.decreaseTopLevel(); - } + private formatClauseInOnelineStyle(node: ClauseNode) { + this.layout.add(WS.NEWLINE, WS.INDENT, this.showKw(node.nameKw), WS.SPACE); + this.layout = this.formatSubExpression(node.children); + } + + private formatClauseInTabularStyle(node: ClauseNode) { + this.layout.add(WS.NEWLINE, WS.INDENT, this.showKw(node.nameKw), WS.SPACE); + this.layout.indentation.increaseTopLevel(); + this.layout = this.formatSubExpression(node.children); + this.layout.indentation.decreaseTopLevel(); } private formatSetOperation(node: SetOperationNode) { From 7a113b27898842ea9e95bef762e751ae2e1dcba5 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 16:13:05 +0300 Subject: [PATCH 12/28] Use oneline formatting for BigQuery procedure creation --- src/languages/bigquery/bigquery.formatter.ts | 6 ++-- test/bigquery.test.ts | 32 ++++++++------------ 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index ff9f48d01..2bb536075 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -54,10 +54,7 @@ const reservedClauses = expandPhrases([ 'FOR SYSTEM_TIME AS OF', // CREATE SNAPSHOT TABLE 'WITH CONNECTION', 'WITH PARTITION COLUMNS', - 'CREATE [OR REPLACE] [TEMP|TEMPORARY|TABLE] FUNCTION [IF NOT EXISTS]', 'REMOTE WITH CONNECTION', - 'RETURNS TABLE', - 'CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS]', 'CREATE [OR REPLACE] ROW ACCESS POLICY [IF NOT EXISTS]', 'GRANT TO', 'FILTER USING', @@ -90,6 +87,9 @@ const onelineClauses = expandPhrases([ 'CREATE SCHEMA [IF NOT EXISTS]', 'DEFAULT COLLATE', + // stored procedures + 'CREATE [OR REPLACE] [TEMP|TEMPORARY|TABLE] FUNCTION [IF NOT EXISTS]', + 'CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS]', // DCL, https://cloud.google.com/bigquery/docs/reference/standard-sql/data-control-language 'GRANT', 'REVOKE', diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 79038cf4f..18ecbba08 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -403,8 +403,7 @@ describe('BigQueryFormatter', () => { RETURNS FLOAT64 AS (x * y);`; const expected = dedent` - ${createFunction} - mydataset.myFunc (x FLOAT64, y FLOAT64) RETURNS FLOAT64 AS (x * y);`; + ${createFunction} mydataset.myFunc (x FLOAT64, y FLOAT64) RETURNS FLOAT64 AS (x * y);`; expect(format(input)).toBe(expected); }); }); @@ -418,8 +417,7 @@ describe('BigQueryFormatter', () => { return x*y; """;`; const expected = dedent` - CREATE FUNCTION - myFunc (x FLOAT64, y FLOAT64) RETURNS FLOAT64 LANGUAGE js AS r""" + CREATE FUNCTION myFunc (x FLOAT64, y FLOAT64) RETURNS FLOAT64 LANGUAGE js AS r""" return x*y; """;`; expect(format(input)).toBe(expected); @@ -438,19 +436,16 @@ describe('BigQueryFormatter', () => { // TODO: formatting for can be improved const expected = dedent` - ${createTableFunc} - mydataset.names_by_year (y INT64) - RETURNS TABLE - < name STRING, - year INT64 > AS ( - SELECT - year, - name - FROM - mydataset.mytable - WHERE - year = y - )`; + ${createTableFunc} mydataset.names_by_year (y INT64) RETURNS TABLE < name STRING, + year INT64 > AS ( + SELECT + year, + name + FROM + mydataset.mytable + WHERE + year = y + )`; expect(format(input)).toBe(expected); }); }); @@ -464,8 +459,7 @@ describe('BigQueryFormatter', () => { SELECT * FROM anotherDataset.myTable; END;`; const expected = dedent` - ${createProcedure} - myDataset.QueryTable () + ${createProcedure} myDataset.QueryTable () BEGIN SELECT * From 6dd02837ced9a0a7ba7941590ee91b886873ad41 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 16:16:48 +0300 Subject: [PATCH 13/28] Additional oneline clauses for BigQuery - row access policy - capacity - assignment - reservation --- src/languages/bigquery/bigquery.formatter.ts | 18 ++++++++----- test/bigquery.test.ts | 27 +++++++------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index 2bb536075..1a8a36669 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -55,13 +55,6 @@ const reservedClauses = expandPhrases([ 'WITH CONNECTION', 'WITH PARTITION COLUMNS', 'REMOTE WITH CONNECTION', - 'CREATE [OR REPLACE] ROW ACCESS POLICY [IF NOT EXISTS]', - 'GRANT TO', - 'FILTER USING', - 'CREATE CAPACITY', - 'AS JSON', - 'CREATE RESERVATION', - 'CREATE ASSIGNMENT', 'CREATE SEARCH INDEX [IF NOT EXISTS]', 'ALTER SCHEMA [IF EXISTS]', @@ -90,6 +83,17 @@ const onelineClauses = expandPhrases([ // stored procedures 'CREATE [OR REPLACE] [TEMP|TEMPORARY|TABLE] FUNCTION [IF NOT EXISTS]', 'CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS]', + // row access policy + 'CREATE [OR REPLACE] ROW ACCESS POLICY [IF NOT EXISTS]', + 'GRANT TO', + 'FILTER USING', + // capacity + 'CREATE CAPACITY', + 'AS JSON', + // reservation + 'CREATE RESERVATION', + // assignment + 'CREATE ASSIGNMENT', // DCL, https://cloud.google.com/bigquery/docs/reference/standard-sql/data-control-language 'GRANT', 'REVOKE', diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 18ecbba08..9054e7429 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -479,12 +479,9 @@ describe('BigQueryFormatter', () => { GRANT TO ("group:abc@example.com", "user:hello@example.com") FILTER USING (Region="US")`; const expected = dedent` - ${createRowAccessPolicy} - us_filter ON mydataset.table1 - GRANT TO - ("group:abc@example.com", "user:hello@example.com") - FILTER USING - (Region = "US")`; + ${createRowAccessPolicy} us_filter ON mydataset.table1 + GRANT TO ("group:abc@example.com", "user:hello@example.com") + FILTER USING (Region = "US")`; expect(format(input)).toBe(expected); }); }); @@ -497,10 +494,8 @@ describe('BigQueryFormatter', () => { "plan": "FLEX" }"""`; const expected = dedent` - CREATE CAPACITY - admin_project.region-us.my-commitment - AS JSON - """{ + CREATE CAPACITY admin_project.region-us.my-commitment + AS JSON """{ "slot_count": 100, "plan": "FLEX" }"""`; @@ -514,10 +509,8 @@ describe('BigQueryFormatter', () => { "slot_capacity": 100 }"""`; const expected = dedent` - CREATE RESERVATION - admin_project.region-us.prod - AS JSON - """{ + CREATE RESERVATION admin_project.region-us.prod + AS JSON """{ "slot_capacity": 100 }"""`; expect(format(input)).toBe(expected); @@ -531,10 +524,8 @@ describe('BigQueryFormatter', () => { "job_type": "QUERY" }"""`; const expected = dedent` - CREATE ASSIGNMENT - admin_project.region-us.prod.my_assignment - AS JSON - """{ + CREATE ASSIGNMENT admin_project.region-us.prod.my_assignment + AS JSON """{ "assignee": "projects/my_project", "job_type": "QUERY" }"""`; From ea9ecaae0e3d138421d83ebb51f3d28156da148d Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:21:13 +0300 Subject: [PATCH 14/28] Add BigQuery search index creation to oneline clauses --- src/languages/bigquery/bigquery.formatter.ts | 3 ++- test/bigquery.test.ts | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index 1a8a36669..02c6b8a31 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -55,7 +55,6 @@ const reservedClauses = expandPhrases([ 'WITH CONNECTION', 'WITH PARTITION COLUMNS', 'REMOTE WITH CONNECTION', - 'CREATE SEARCH INDEX [IF NOT EXISTS]', 'ALTER SCHEMA [IF EXISTS]', 'ALTER [MATERIALIZED] VIEW [IF EXISTS]', @@ -94,6 +93,8 @@ const onelineClauses = expandPhrases([ 'CREATE RESERVATION', // assignment 'CREATE ASSIGNMENT', + // search index + 'CREATE SEARCH INDEX [IF NOT EXISTS]', // DCL, https://cloud.google.com/bigquery/docs/reference/standard-sql/data-control-language 'GRANT', 'REVOKE', diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 9054e7429..422223db4 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -538,8 +538,7 @@ describe('BigQueryFormatter', () => { ${createSearchIndex} my_index ON dataset.my_table(ALL COLUMNS);`; const expected = dedent` - ${createSearchIndex} - my_index ON dataset.my_table (ALL COLUMNS);`; + ${createSearchIndex} my_index ON dataset.my_table (ALL COLUMNS);`; expect(format(input)).toBe(expected); }); }); From 56a70498ebd034f89f2ef0b3d31934d520506c38 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:24:47 +0300 Subject: [PATCH 15/28] Add BigQuery DROP clauses to online clauses list --- src/languages/bigquery/bigquery.formatter.ts | 23 ++++++++++---------- test/bigquery.test.ts | 21 ++++++------------ 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index 02c6b8a31..a4fe30151 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -59,17 +59,6 @@ const reservedClauses = expandPhrases([ 'ALTER [MATERIALIZED] VIEW [IF EXISTS]', 'ALTER BI_CAPACITY', - 'DROP SCHEMA [IF EXISTS]', - 'DROP [MATERIALIZED] VIEW [IF EXISTS]', - 'DROP [TABLE] FUNCTION [IF EXISTS]', - 'DROP PROCEDURE [IF EXISTS]', - 'DROP ROW ACCESS POLICY', - 'DROP ALL ROW ACCESS POLICIES', - 'DROP CAPACITY [IF EXISTS]', - 'DROP RESERVATION [IF EXISTS]', - 'DROP ASSIGNMENT [IF EXISTS]', - 'DROP SEARCH INDEX [IF EXISTS]', - 'DROP [IF EXISTS]', ]); const onelineClauses = expandPhrases([ @@ -95,6 +84,18 @@ const onelineClauses = expandPhrases([ 'CREATE ASSIGNMENT', // search index 'CREATE SEARCH INDEX [IF NOT EXISTS]', + // drop + 'DROP SCHEMA [IF EXISTS]', + 'DROP [MATERIALIZED] VIEW [IF EXISTS]', + 'DROP [TABLE] FUNCTION [IF EXISTS]', + 'DROP PROCEDURE [IF EXISTS]', + 'DROP ROW ACCESS POLICY', + 'DROP ALL ROW ACCESS POLICIES', + 'DROP CAPACITY [IF EXISTS]', + 'DROP RESERVATION [IF EXISTS]', + 'DROP ASSIGNMENT [IF EXISTS]', + 'DROP SEARCH INDEX [IF EXISTS]', + 'DROP [IF EXISTS]', // DCL, https://cloud.google.com/bigquery/docs/reference/standard-sql/data-control-language 'GRANT', 'REVOKE', diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 422223db4..53074c989 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -693,8 +693,7 @@ describe('BigQueryFormatter', () => { const input = ` ${drop} mydataset.name`; const expected = dedent` - ${drop} - mydataset.name`; + ${drop} mydataset.name`; expect(format(input)).toBe(expected); }); }); @@ -703,8 +702,7 @@ describe('BigQueryFormatter', () => { const input = ` DROP SCHEMA mydataset CASCADE`; const expected = dedent` - DROP SCHEMA - mydataset CASCADE`; + DROP SCHEMA mydataset CASCADE`; expect(format(input)).toBe(expected); }); @@ -712,8 +710,7 @@ describe('BigQueryFormatter', () => { const input = ` DROP SCHEMA mydataset RESTRICT`; const expected = dedent` - DROP SCHEMA - mydataset RESTRICT`; + DROP SCHEMA mydataset RESTRICT`; expect(format(input)).toBe(expected); }); @@ -723,8 +720,7 @@ describe('BigQueryFormatter', () => { const input = ` ${dropSearchIndex} index2 ON mydataset.mytable`; const expected = dedent` - ${dropSearchIndex} - index2 ON mydataset.mytable`; + ${dropSearchIndex} index2 ON mydataset.mytable`; expect(format(input)).toBe(expected); }); }); @@ -733,8 +729,7 @@ describe('BigQueryFormatter', () => { const input = ` DROP mypolicy ON mydataset.mytable`; const expected = dedent` - DROP - mypolicy ON mydataset.mytable`; + DROP mypolicy ON mydataset.mytable`; expect(format(input)).toBe(expected); }); @@ -742,8 +737,7 @@ describe('BigQueryFormatter', () => { const input = ` DROP IF EXISTS mypolicy ON mydataset.mytable`; const expected = dedent` - DROP IF EXISTS - mypolicy ON mydataset.mytable`; + DROP IF EXISTS mypolicy ON mydataset.mytable`; expect(format(input)).toBe(expected); }); @@ -751,8 +745,7 @@ describe('BigQueryFormatter', () => { const input = ` DROP ALL ROW ACCESS POLICIES ON table_name`; const expected = dedent` - DROP ALL ROW ACCESS POLICIES - ON table_name`; + DROP ALL ROW ACCESS POLICIES ON table_name`; expect(format(input)).toBe(expected); }); }); From dfc3d399d1f813fcd5e136cd95f9abea029e0e49 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:39:24 +0300 Subject: [PATCH 16/28] Drop excessive tests for BigQuery syntax variants --- test/bigquery.test.ts | 232 +++++++++++++++++------------------------- 1 file changed, 92 insertions(+), 140 deletions(-) diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 53074c989..c022c2245 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -1,7 +1,6 @@ import dedent from 'dedent-js'; import { format as originalFormat, FormatFn } from 'src/sqlFormatter'; -import { flatKeywordList } from 'src/utils'; import behavesLikeSqlFormatter from './behavesLikeSqlFormatter'; import supportsCreateTable from './features/createTable'; @@ -291,51 +290,20 @@ describe('BigQueryFormatter', () => { }); describe('BigQuery DDL Create Statements', () => { - const createCmds = { - schema: ['CREATE SCHEMA', 'CREATE SCHEMA IF NOT EXISTS'], - function: ['CREATE FUNCTION', 'CREATE OR REPLACE FUNCTION', 'CREATE FUNCTION IF NOT EXISTS'], - tempFunction: [ - 'CREATE TEMP FUNCTION', - 'CREATE OR REPLACE TEMP FUNCTION', - 'CREATE TEMP FUNCTION IF NOT EXISTS', - 'CREATE TEMPORARY FUNCTION', - 'CREATE OR REPLACE TEMPORARY FUNCTION', - 'CREATE TEMPORARY FUNCTION IF NOT EXISTS', - ], - tableFunction: [ - 'CREATE TABLE FUNCTION', - 'CREATE OR REPLACE TABLE FUNCTION', - 'CREATE TABLE FUNCTION IF NOT EXISTS', - ], - procedure: [ - 'CREATE PROCEDURE', - 'CREATE OR REPLACE PROCEDURE', - 'CREATE PROCEDURE IF NOT EXISTS', - ], - rowAccessPolicy: [ - 'CREATE ROW ACCESS POLICY', - 'CREATE ROW ACCESS POLICY IF NOT EXISTS', - 'CREATE OR REPLACE ROW ACCESS POLICY', - ], - searchIndex: ['CREATE SEARCH INDEX', 'CREATE SEARCH INDEX IF NOT EXISTS'], - }; - - createCmds.schema.forEach(createSchema => { - it(`Supports ${createSchema}`, () => { - const input = ` - ${createSchema} mydataset - DEFAULT COLLATE 'und:ci' - OPTIONS( - location="us", labels=[("label1","value1"),("label2","value2")])`; - const expected = dedent` - ${createSchema} mydataset - DEFAULT COLLATE 'und:ci' OPTIONS( - location = "us", - labels = [("label1", "value1"), ("label2", "value2")] - ) - `; - expect(format(input)).toBe(expected); - }); + it(`Supports CREATE SCHEMA`, () => { + const input = ` + CREATE SCHEMA mydataset + DEFAULT COLLATE 'und:ci' + OPTIONS( + location="us", labels=[("label1","value1"),("label2","value2")])`; + const expected = dedent` + CREATE SCHEMA mydataset + DEFAULT COLLATE 'und:ci' OPTIONS( + location = "us", + labels = [("label1", "value1"), ("label2", "value2")] + ) + `; + expect(format(input)).toBe(expected); }); it(`Supports CREATE TABLE LIKE`, () => { @@ -396,16 +364,14 @@ describe('BigQueryFormatter', () => { expect(format(input)).toBe(expected); }); - createCmds.function.concat(createCmds.tempFunction).forEach(createFunction => { - it(`Supports ${createFunction}`, () => { - const input = ` - ${createFunction} mydataset.myFunc(x FLOAT64, y FLOAT64) - RETURNS FLOAT64 - AS (x * y);`; - const expected = dedent` - ${createFunction} mydataset.myFunc (x FLOAT64, y FLOAT64) RETURNS FLOAT64 AS (x * y);`; - expect(format(input)).toBe(expected); - }); + it(`Supports CREATE FUNCTION`, () => { + const input = ` + CREATE FUNCTION mydataset.myFunc(x FLOAT64, y FLOAT64) + RETURNS FLOAT64 + AS (x * y);`; + const expected = dedent` + CREATE FUNCTION mydataset.myFunc (x FLOAT64, y FLOAT64) RETURNS FLOAT64 AS (x * y);`; + expect(format(input)).toBe(expected); }); it(`Supports CREATE FUNCTION - LANGUAGE js`, () => { @@ -423,67 +389,61 @@ describe('BigQueryFormatter', () => { expect(format(input)).toBe(expected); }); - createCmds.tableFunction.forEach(createTableFunc => { - it(`Supports ${createTableFunc}`, () => { - const input = ` - ${createTableFunc} mydataset.names_by_year(y INT64) - RETURNS TABLE - AS ( - SELECT year, name - FROM mydataset.mytable - WHERE year = y - )`; + it(`Supports CREATE TABLE FUNCTION`, () => { + const input = ` + CREATE TABLE FUNCTION mydataset.names_by_year(y INT64) + RETURNS TABLE + AS ( + SELECT year, name + FROM mydataset.mytable + WHERE year = y + )`; - // TODO: formatting for can be improved - const expected = dedent` - ${createTableFunc} mydataset.names_by_year (y INT64) RETURNS TABLE < name STRING, - year INT64 > AS ( - SELECT - year, - name - FROM - mydataset.mytable - WHERE - year = y - )`; - expect(format(input)).toBe(expected); - }); + // TODO: formatting for can be improved + const expected = dedent` + CREATE TABLE FUNCTION mydataset.names_by_year (y INT64) RETURNS TABLE < name STRING, + year INT64 > AS ( + SELECT + year, + name + FROM + mydataset.mytable + WHERE + year = y + )`; + expect(format(input)).toBe(expected); }); // not correctly supported yet - createCmds.procedure.forEach(createProcedure => { - it(`Supports ${createProcedure}`, () => { - const input = ` - ${createProcedure} myDataset.QueryTable() - BEGIN - SELECT * FROM anotherDataset.myTable; - END;`; - const expected = dedent` - ${createProcedure} myDataset.QueryTable () - BEGIN - SELECT - * - FROM - anotherDataset.myTable; + it(`Supports CREATE PROCEDURE`, () => { + const input = ` + CREATE PROCEDURE myDataset.QueryTable() + BEGIN + SELECT * FROM anotherDataset.myTable; + END;`; + const expected = dedent` + CREATE PROCEDURE myDataset.QueryTable () + BEGIN + SELECT + * + FROM + anotherDataset.myTable; - END;`; - expect(format(input)).toBe(expected); - }); + END;`; + expect(format(input)).toBe(expected); }); - createCmds.rowAccessPolicy.forEach(createRowAccessPolicy => { - it(`Supports ${createRowAccessPolicy}`, () => { - const input = ` - ${createRowAccessPolicy} us_filter - ON mydataset.table1 - GRANT TO ("group:abc@example.com", "user:hello@example.com") - FILTER USING (Region="US")`; - const expected = dedent` - ${createRowAccessPolicy} us_filter ON mydataset.table1 - GRANT TO ("group:abc@example.com", "user:hello@example.com") - FILTER USING (Region = "US")`; - expect(format(input)).toBe(expected); - }); + it(`Supports CREATE ROW ACCESS POLICY`, () => { + const input = ` + CREATE ROW ACCESS POLICY us_filter + ON mydataset.table1 + GRANT TO ("group:abc@example.com", "user:hello@example.com") + FILTER USING (Region="US")`; + const expected = dedent` + CREATE ROW ACCESS POLICY us_filter ON mydataset.table1 + GRANT TO ("group:abc@example.com", "user:hello@example.com") + FILTER USING (Region = "US")`; + expect(format(input)).toBe(expected); }); it(`Supports CREATE CAPACITY`, () => { @@ -532,15 +492,13 @@ describe('BigQueryFormatter', () => { expect(format(input)).toBe(expected); }); - createCmds.searchIndex.forEach(createSearchIndex => { - it(`Supports ${createSearchIndex}`, () => { - const input = ` - ${createSearchIndex} my_index - ON dataset.my_table(ALL COLUMNS);`; - const expected = dedent` - ${createSearchIndex} my_index ON dataset.my_table (ALL COLUMNS);`; - expect(format(input)).toBe(expected); - }); + it(`Supports CREATE SEARCH INDEX`, () => { + const input = ` + CREATE SEARCH INDEX my_index + ON dataset.my_table(ALL COLUMNS);`; + const expected = dedent` + CREATE SEARCH INDEX my_index ON dataset.my_table (ALL COLUMNS);`; + expect(format(input)).toBe(expected); }); }); @@ -677,18 +635,15 @@ describe('BigQueryFormatter', () => { }); describe('BigQuery DDL Drop Statements', () => { - const dropCmds = { - schema: ['DROP SCHEMA', 'DROP SCHEMA IF EXISTS'], - view: ['DROP VIEW', 'DROP VIEW IF EXISTS'], - materializedViews: ['DROP MATERIALIZED VIEW', 'DROP MATERIALIZED VIEW IF EXISTS'], - function: ['DROP FUNCTION', 'DROP FUNCTION IF EXISTS'], - tableFunction: ['DROP TABLE FUNCTION', 'DROP TABLE FUNCTION IF EXISTS'], - procedure: ['DROP PROCEDURE', 'DROP PROCEDURE IF EXISTS'], - reservation: ['DROP RESERVATION', 'DROP RESERVATION IF EXISTS'], - assignment: ['DROP ASSIGNMENT', 'DROP ASSIGNMENT IF EXISTS'], - }; - - flatKeywordList(dropCmds).forEach(drop => { + [ + 'DROP SCHEMA', + 'DROP VIEW', + 'DROP FUNCTION', + 'DROP TABLE FUNCTION', + 'DROP PROCEDURE', + 'DROP RESERVATION', + 'DROP ASSIGNMENT', + ].forEach(drop => { it(`Supports ${drop}`, () => { const input = ` ${drop} mydataset.name`; @@ -714,15 +669,12 @@ describe('BigQueryFormatter', () => { expect(format(input)).toBe(expected); }); - const dropSearchIndices = ['DROP SEARCH INDEX', 'DROP SEARCH INDEX IF EXISTS']; - dropSearchIndices.forEach(dropSearchIndex => { - it(`Supports ${dropSearchIndex}`, () => { - const input = ` - ${dropSearchIndex} index2 ON mydataset.mytable`; - const expected = dedent` - ${dropSearchIndex} index2 ON mydataset.mytable`; - expect(format(input)).toBe(expected); - }); + it(`Supports DROP SEARCH INDEX`, () => { + const input = ` + DROP SEARCH INDEX index2 ON mydataset.mytable`; + const expected = dedent` + DROP SEARCH INDEX index2 ON mydataset.mytable`; + expect(format(input)).toBe(expected); }); it(`Supports DROP ROW ACCESS POLICY`, () => { From 38fef82643ac041179df1c6fbb7425871362aadc Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:40:32 +0300 Subject: [PATCH 17/28] Drop tests for CREATE TABLE LIKE/COPY/CLONE --- test/bigquery.test.ts | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index c022c2245..5a5d2c33b 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -306,45 +306,6 @@ describe('BigQueryFormatter', () => { expect(format(input)).toBe(expected); }); - it(`Supports CREATE TABLE LIKE`, () => { - const input = ` - CREATE TABLE mydataset.newtable - LIKE mydataset.sourcetable - AS (SELECT * FROM mydataset.myothertable)`; - const expected = dedent` - CREATE TABLE - mydataset.newtable LIKE mydataset.sourcetable AS ( - SELECT - * - FROM - mydataset.myothertable - )`; - - expect(format(input)).toBe(expected); - }); - - it(`Supports CREATE TABLE COPY`, () => { - const input = ` - CREATE TABLE mydataset.newtable - COPY mydataset.sourcetable`; - const expected = dedent` - CREATE TABLE - mydataset.newtable COPY mydataset.sourcetable`; - - expect(format(input)).toBe(expected); - }); - - it(`Supports CREATE TABLE CLONE`, () => { - const input = ` - CREATE TABLE mydataset.newtable - CLONE mydataset.sourcetable`; - const expected = dedent` - CREATE TABLE - mydataset.newtable CLONE mydataset.sourcetable`; - - expect(format(input)).toBe(expected); - }); - it(`Supports CREATE EXTERNAL TABLE ... WITH PARTITION COLUMN`, () => { const input = ` CREATE EXTERNAL TABLE dataset.CsvTable From b97e27d9e6149a6bd5035bd3f40dbf87d390c33a Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:43:34 +0300 Subject: [PATCH 18/28] GROUP tests for statements using AS JSON --- test/bigquery.test.ts | 65 ++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 44 deletions(-) diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 5a5d2c33b..c3989bc77 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -407,50 +407,27 @@ describe('BigQueryFormatter', () => { expect(format(input)).toBe(expected); }); - it(`Supports CREATE CAPACITY`, () => { - const input = dedent` - CREATE CAPACITY admin_project.region-us.my-commitment - AS JSON """{ - "slot_count": 100, - "plan": "FLEX" - }"""`; - const expected = dedent` - CREATE CAPACITY admin_project.region-us.my-commitment - AS JSON """{ - "slot_count": 100, - "plan": "FLEX" - }"""`; - expect(format(input)).toBe(expected); - }); - - it(`Supports CREATE RESERVATION`, () => { - const input = dedent` - CREATE RESERVATION admin_project.region-us.prod - AS JSON """{ - "slot_capacity": 100 - }"""`; - const expected = dedent` - CREATE RESERVATION admin_project.region-us.prod - AS JSON """{ - "slot_capacity": 100 - }"""`; - expect(format(input)).toBe(expected); - }); - - it(`Supports CREATE ASSIGNMENT`, () => { - const input = dedent` - CREATE ASSIGNMENT admin_project.region-us.prod.my_assignment - AS JSON """{ - "assignee": "projects/my_project", - "job_type": "QUERY" - }"""`; - const expected = dedent` - CREATE ASSIGNMENT admin_project.region-us.prod.my_assignment - AS JSON """{ - "assignee": "projects/my_project", - "job_type": "QUERY" - }"""`; - expect(format(input)).toBe(expected); + [ + // Create statements using "AS JSON" + 'CREATE CAPACITY', + 'CREATE RESERVATION', + 'CREATE ASSIGNMENT', + ].forEach(create => { + it(`Supports ${create}`, () => { + const input = dedent` + ${create} admin_project.region-us.my-commitment + AS JSON """{ + "slot_count": 100, + "plan": "FLEX" + }"""`; + const expected = dedent` + ${create} admin_project.region-us.my-commitment + AS JSON """{ + "slot_count": 100, + "plan": "FLEX" + }"""`; + expect(format(input)).toBe(expected); + }); }); it(`Supports CREATE SEARCH INDEX`, () => { From 5f6e88eb6919aba7516ce53083a8def70281792c Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:44:29 +0300 Subject: [PATCH 19/28] Delete DROP SCHEMA CASCADE/RESTRICT tests --- test/bigquery.test.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index c3989bc77..487c50b16 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -591,22 +591,6 @@ describe('BigQueryFormatter', () => { }); }); - it(`Supports DROP SCHEMA - CASCADE`, () => { - const input = ` - DROP SCHEMA mydataset CASCADE`; - const expected = dedent` - DROP SCHEMA mydataset CASCADE`; - expect(format(input)).toBe(expected); - }); - - it(`Supports DROP SCHEMA - RESTRICT`, () => { - const input = ` - DROP SCHEMA mydataset RESTRICT`; - const expected = dedent` - DROP SCHEMA mydataset RESTRICT`; - expect(format(input)).toBe(expected); - }); - it(`Supports DROP SEARCH INDEX`, () => { const input = ` DROP SEARCH INDEX index2 ON mydataset.mytable`; From 1df0064045b3046de4c0da56fbd464dbad264c83 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:47:03 +0300 Subject: [PATCH 20/28] Remove test for DROP IF EXISTS variant --- test/bigquery.test.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 487c50b16..1c40a0a19 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -607,14 +607,6 @@ describe('BigQueryFormatter', () => { expect(format(input)).toBe(expected); }); - it(`Supports DROP ROW ACCESS POLICY IF EXISTS`, () => { - const input = ` - DROP IF EXISTS mypolicy ON mydataset.mytable`; - const expected = dedent` - DROP IF EXISTS mypolicy ON mydataset.mytable`; - expect(format(input)).toBe(expected); - }); - it(`Supports DROP ALL ROW ACCESS POLICIES`, () => { const input = ` DROP ALL ROW ACCESS POLICIES ON table_name`; From b94f81f80a36260f776d707c4b51143c5f781dab Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:51:36 +0300 Subject: [PATCH 21/28] Group all DROP clauses to single test --- test/bigquery.test.ts | 57 +++++++++++++++---------------------------- 1 file changed, 20 insertions(+), 37 deletions(-) diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 1c40a0a19..45cfb24c9 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -573,46 +573,29 @@ describe('BigQueryFormatter', () => { }); describe('BigQuery DDL Drop Statements', () => { - [ - 'DROP SCHEMA', - 'DROP VIEW', - 'DROP FUNCTION', - 'DROP TABLE FUNCTION', - 'DROP PROCEDURE', - 'DROP RESERVATION', - 'DROP ASSIGNMENT', - ].forEach(drop => { - it(`Supports ${drop}`, () => { - const input = ` - ${drop} mydataset.name`; - const expected = dedent` - ${drop} mydataset.name`; - expect(format(input)).toBe(expected); - }); - }); + it(`Supports DROP clauses`, () => { + const input = dedent` + DROP SCHEMA mydataset.name; - it(`Supports DROP SEARCH INDEX`, () => { - const input = ` - DROP SEARCH INDEX index2 ON mydataset.mytable`; - const expected = dedent` - DROP SEARCH INDEX index2 ON mydataset.mytable`; - expect(format(input)).toBe(expected); - }); + DROP VIEW mydataset.name; - it(`Supports DROP ROW ACCESS POLICY`, () => { - const input = ` - DROP mypolicy ON mydataset.mytable`; - const expected = dedent` - DROP mypolicy ON mydataset.mytable`; - expect(format(input)).toBe(expected); - }); + DROP FUNCTION mydataset.name; - it(`Supports DROP ALL ROW ACCESS POLICIES`, () => { - const input = ` - DROP ALL ROW ACCESS POLICIES ON table_name`; - const expected = dedent` - DROP ALL ROW ACCESS POLICIES ON table_name`; - expect(format(input)).toBe(expected); + DROP TABLE FUNCTION mydataset.name; + + DROP PROCEDURE mydataset.name; + + DROP RESERVATION mydataset.name; + + DROP ASSIGNMENT mydataset.name; + + DROP SEARCH INDEX index2 ON mydataset.mytable; + + DROP mypolicy ON mydataset.mytable; + + DROP ALL ROW ACCESS POLICIES ON table_name; + `; + expect(format(input)).toBe(input); }); }); }); From fdf06b7cf60ae651aff741ef6589bdd6c944fdd4 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:54:35 +0300 Subject: [PATCH 22/28] Avoid repeating the same string --- test/bigquery.test.ts | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 45cfb24c9..f5b9fdc68 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -200,25 +200,15 @@ describe('BigQueryFormatter', () => { }); it('supports parameterised types', () => { - const result = format( - ` - DECLARE varString STRING(11) '11charswide'; - DECLARE varBytes BYTES(8); - DECLARE varNumeric NUMERIC(1,1); - DECLARE varDecimal DECIMAL(1,1); - DECLARE varBignumeric BIGNUMERIC(1,1); - DECLARE varBigdecimal BIGDECIMAL(1,1); - `, - { linesBetweenQueries: 0 } - ); - expect(result).toBe(dedent` + const sql = dedent` DECLARE varString STRING(11) '11charswide'; DECLARE varBytes BYTES(8); DECLARE varNumeric NUMERIC(1, 1); DECLARE varDecimal DECIMAL(1, 1); DECLARE varBignumeric BIGNUMERIC(1, 1); DECLARE varBigdecimal BIGDECIMAL(1, 1); - `); + `; + expect(format(sql, { linesBetweenQueries: 0 })).toBe(sql); }); // Regression test for issue #243 From f029c5bb00abab35f1e8cd0695a4741b744bd226 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Sun, 2 Oct 2022 21:55:22 +0300 Subject: [PATCH 23/28] More compact DROP clauses test --- test/bigquery.test.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index f5b9fdc68..43086b48e 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -566,26 +566,17 @@ describe('BigQueryFormatter', () => { it(`Supports DROP clauses`, () => { const input = dedent` DROP SCHEMA mydataset.name; - DROP VIEW mydataset.name; - DROP FUNCTION mydataset.name; - DROP TABLE FUNCTION mydataset.name; - DROP PROCEDURE mydataset.name; - DROP RESERVATION mydataset.name; - DROP ASSIGNMENT mydataset.name; - DROP SEARCH INDEX index2 ON mydataset.mytable; - DROP mypolicy ON mydataset.mytable; - DROP ALL ROW ACCESS POLICIES ON table_name; `; - expect(format(input)).toBe(input); + expect(format(input, { linesBetweenQueries: 0 })).toBe(input); }); }); }); From 0cc7f0ce4f82c2156489f452182fd0d3dc5d2bd3 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Tue, 4 Oct 2022 14:13:40 +0300 Subject: [PATCH 24/28] Format ALTER TABLE using oneline style --- src/languages/bigquery/bigquery.formatter.ts | 22 +++-- src/languages/db2/db2.formatter.ts | 6 +- src/languages/hive/hive.formatter.ts | 6 +- src/languages/mariadb/mariadb.formatter.ts | 10 +- src/languages/mysql/mysql.formatter.ts | 6 +- src/languages/plsql/plsql.formatter.ts | 10 +- .../postgresql/postgresql.formatter.ts | 10 +- src/languages/redshift/redshift.formatter.ts | 6 +- .../singlestoredb/singlestoredb.formatter.ts | 6 +- .../snowflake/snowflake.formatter.ts | 8 +- src/languages/spark/spark.formatter.ts | 6 +- src/languages/sql/sql.formatter.ts | 6 +- src/languages/sqlite/sqlite.formatter.ts | 7 +- .../transactsql/transactsql.formatter.ts | 6 +- src/languages/trino/trino.formatter.ts | 18 ++-- test/behavesLikeMariaDbFormatter.ts | 6 +- test/bigquery.test.ts | 68 +++++--------- test/db2.test.ts | 15 +-- test/features/alterTable.ts | 30 ++---- test/mariadb.test.ts | 15 +-- test/mysql.test.ts | 15 +-- test/postgresql.test.ts | 36 +++---- test/redshift.test.ts | 18 ++-- test/snowflake.test.ts | 94 +++++++------------ test/spark.test.ts | 6 +- test/sql.test.ts | 30 ++---- test/transactsql.test.ts | 6 +- 27 files changed, 185 insertions(+), 287 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index 9b210d020..28952eada 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -39,6 +39,15 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE] [MATERIALIZED] VIEW [IF NOT EXISTS]', 'CREATE [OR REPLACE] [TEMP|TEMPORARY|SNAPSHOT|EXTERNAL] TABLE [IF NOT EXISTS]', 'DROP [SNAPSHOT | EXTERNAL] TABLE [IF EXISTS]', + + 'CLUSTER BY', + 'FOR SYSTEM_TIME AS OF', // CREATE SNAPSHOT TABLE + 'WITH CONNECTION', + 'WITH PARTITION COLUMNS', + 'REMOTE WITH CONNECTION', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE [IF EXISTS]', 'ADD COLUMN [IF NOT EXISTS]', @@ -49,19 +58,12 @@ const reservedClauses = expandPhrases([ 'SET OPTIONS', // for alter column 'DROP NOT NULL', // for alter column 'SET DATA TYPE', // for alter column - - 'CLUSTER BY', - 'FOR SYSTEM_TIME AS OF', // CREATE SNAPSHOT TABLE - 'WITH CONNECTION', - 'WITH PARTITION COLUMNS', - 'REMOTE WITH CONNECTION', + // - alter schema 'ALTER SCHEMA [IF EXISTS]', - + // - alter view 'ALTER [MATERIALIZED] VIEW [IF EXISTS]', + // - alter bi_capacity 'ALTER BI_CAPACITY', -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE TABLE', // - create schema diff --git a/src/languages/db2/db2.formatter.ts b/src/languages/db2/db2.formatter.ts index b42dfb89c..802a22cf0 100644 --- a/src/languages/db2/db2.formatter.ts +++ b/src/languages/db2/db2.formatter.ts @@ -37,6 +37,9 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE] VIEW', 'CREATE [GLOBAL TEMPORARY] TABLE', 'DROP TABLE [HIERARCHY]', +]); + +const onelineClauses = expandPhrases([ // alter table: 'ALTER TABLE', 'ADD [COLUMN]', @@ -46,9 +49,6 @@ const reservedClauses = expandPhrases([ 'SET DATA TYPE', // for alter column 'SET NOT NULL', // for alter column 'DROP {IDENTITY | EXPRESSION | DEFAULT | NOT NULL}', // for alter column -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE [TABLE]', // other diff --git a/src/languages/hive/hive.formatter.ts b/src/languages/hive/hive.formatter.ts index bf42e29c3..5ff282073 100644 --- a/src/languages/hive/hive.formatter.ts +++ b/src/languages/hive/hive.formatter.ts @@ -48,12 +48,12 @@ const reservedClauses = expandPhrases([ 'CREATE [MATERIALIZED] VIEW [IF NOT EXISTS]', 'CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS]', 'DROP TABLE [IF EXISTS]', - // - alter table: - 'ALTER TABLE', - 'RENAME TO', ]); const onelineClauses = expandPhrases([ + // - alter table: + 'ALTER TABLE', + 'RENAME TO', // - truncate: 'TRUNCATE [TABLE]', // other diff --git a/src/languages/mariadb/mariadb.formatter.ts b/src/languages/mariadb/mariadb.formatter.ts index bd26f5e52..e3d6dfde7 100644 --- a/src/languages/mariadb/mariadb.formatter.ts +++ b/src/languages/mariadb/mariadb.formatter.ts @@ -34,6 +34,11 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', 'CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS]', 'DROP [TEMPORARY] TABLE [IF EXISTS]', + // other + 'RETURNING', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER [ONLINE] [IGNORE] TABLE [IF EXISTS]', 'ADD [COLUMN] [IF NOT EXISTS]', @@ -44,11 +49,6 @@ const reservedClauses = expandPhrases([ 'ALTER [COLUMN]', '{SET | DROP} DEFAULT', // for alter column 'SET {VISIBLE | INVISIBLE}', // for alter column - // other - 'RETURNING', -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE [TABLE]', // https://mariadb.com/docs/reference/mdb/sql-statements/ diff --git a/src/languages/mysql/mysql.formatter.ts b/src/languages/mysql/mysql.formatter.ts index fab1aec9b..e766e9be9 100644 --- a/src/languages/mysql/mysql.formatter.ts +++ b/src/languages/mysql/mysql.formatter.ts @@ -34,6 +34,9 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', 'CREATE [TEMPORARY] TABLE [IF NOT EXISTS]', 'DROP [TEMPORARY] TABLE [IF EXISTS]', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE', 'ADD [COLUMN]', @@ -43,9 +46,6 @@ const reservedClauses = expandPhrases([ 'RENAME COLUMN', 'ALTER [COLUMN]', '{SET | DROP} DEFAULT', // for alter column -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE [TABLE]', // https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html diff --git a/src/languages/plsql/plsql.formatter.ts b/src/languages/plsql/plsql.formatter.ts index 7a9742dc0..a0c6c6ba7 100644 --- a/src/languages/plsql/plsql.formatter.ts +++ b/src/languages/plsql/plsql.formatter.ts @@ -38,6 +38,11 @@ const reservedClauses = expandPhrases([ 'CREATE MATERIALIZED VIEW', 'CREATE [GLOBAL TEMPORARY | PRIVATE TEMPORARY | SHARDED | DUPLICATED | IMMUTABLE BLOCKCHAIN | BLOCKCHAIN | IMMUTABLE] TABLE', 'DROP TABLE', + // other + 'RETURNING', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE', 'ADD', @@ -45,11 +50,6 @@ const reservedClauses = expandPhrases([ 'MODIFY', 'RENAME TO', 'RENAME COLUMN', - // other - 'RETURNING', -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE TABLE', // other diff --git a/src/languages/postgresql/postgresql.formatter.ts b/src/languages/postgresql/postgresql.formatter.ts index 7990a10e7..d6311bf1c 100644 --- a/src/languages/postgresql/postgresql.formatter.ts +++ b/src/languages/postgresql/postgresql.formatter.ts @@ -35,6 +35,11 @@ const reservedClauses = expandPhrases([ 'CREATE MATERIALIZED VIEW [IF NOT EXISTS]', 'CREATE [GLOBAL | LOCAL] [TEMPORARY | TEMP | UNLOGGED] TABLE [IF NOT EXISTS]', 'DROP TABLE [IF EXISTS]', + // other + 'RETURNING', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE [IF EXISTS] [ONLY]', 'ALTER TABLE ALL IN TABLESPACE', @@ -46,11 +51,6 @@ const reservedClauses = expandPhrases([ '[SET DATA] TYPE', // for alter column '{SET | DROP} DEFAULT', // for alter column '{SET | DROP} NOT NULL', // for alter column - // other - 'RETURNING', -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE [TABLE] [ONLY]', // other diff --git a/src/languages/redshift/redshift.formatter.ts b/src/languages/redshift/redshift.formatter.ts index 3ae39ca0c..6ebf5f2ef 100644 --- a/src/languages/redshift/redshift.formatter.ts +++ b/src/languages/redshift/redshift.formatter.ts @@ -31,6 +31,9 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE | MATERIALIZED] VIEW', 'CREATE [TEMPORARY | TEMP | LOCAL TEMPORARY | LOCAL TEMP] TABLE [IF NOT EXISTS]', 'DROP TABLE [IF EXISTS]', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE', 'ALTER TABLE APPEND', @@ -41,9 +44,6 @@ const reservedClauses = expandPhrases([ 'ALTER COLUMN', 'TYPE', // for alter column 'ENCODE', // for alter column -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE [TABLE]', // https://docs.aws.amazon.com/redshift/latest/dg/c_SQL_commands.html diff --git a/src/languages/singlestoredb/singlestoredb.formatter.ts b/src/languages/singlestoredb/singlestoredb.formatter.ts index 7d3cc0bb0..437773bfb 100644 --- a/src/languages/singlestoredb/singlestoredb.formatter.ts +++ b/src/languages/singlestoredb/singlestoredb.formatter.ts @@ -35,6 +35,9 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE] [TEMPORARY] PROCEDURE [IF NOT EXISTS]', 'CREATE [OR REPLACE] [EXTERNAL] FUNCTION', 'DROP [TEMPORARY] TABLE [IF EXISTS]', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER [ONLINE] TABLE', 'ADD [COLUMN]', @@ -43,9 +46,6 @@ const reservedClauses = expandPhrases([ 'MODIFY [COLUMN]', 'CHANGE', 'RENAME [TO | AS]', -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE [TABLE]', // https://docs.singlestore.com/managed-service/en/reference/sql-reference.html diff --git a/src/languages/snowflake/snowflake.formatter.ts b/src/languages/snowflake/snowflake.formatter.ts index b89dad829..165496d89 100644 --- a/src/languages/snowflake/snowflake.formatter.ts +++ b/src/languages/snowflake/snowflake.formatter.ts @@ -44,6 +44,9 @@ const reservedClauses = expandPhrases([ 'THEN {UPDATE SET | DELETE}', 'WHEN NOT MATCHED THEN INSERT', 'DROP TABLE [IF EXISTS]', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE [IF EXISTS]', 'RENAME TO', @@ -57,7 +60,7 @@ const reservedClauses = expandPhrases([ '{ADD | ALTER | MODIFY | DROP} [CONSTRAINT]', 'RENAME CONSTRAINT', '{ADD | DROP} SEARCH OPTIMIZATION', - '{SET | UNSET} [TAG]', + '{SET | UNSET} TAG', // Actually TAG is optional, but that conflicts with UPDATE..SET statement '{ADD | DROP} ROW ACCESS POLICY', 'DROP ALL ROW ACCESS POLICIES', '{SET | DROP} DEFAULT', // for alter column @@ -65,9 +68,6 @@ const reservedClauses = expandPhrases([ '[SET DATA] TYPE', // for alter column '[UNSET] COMMENT', // for alter column '{SET | UNSET} MASKING POLICY', // for alter column -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE [TABLE] [IF EXISTS]', // other diff --git a/src/languages/spark/spark.formatter.ts b/src/languages/spark/spark.formatter.ts index c80284dcb..4098e34d7 100644 --- a/src/languages/spark/spark.formatter.ts +++ b/src/languages/spark/spark.formatter.ts @@ -38,6 +38,9 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE] [GLOBAL TEMPORARY | TEMPORARY] VIEW [IF NOT EXISTS]', 'CREATE [EXTERNAL] TABLE [IF NOT EXISTS]', 'DROP TABLE [IF EXISTS]', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE', 'ADD COLUMNS', @@ -45,9 +48,6 @@ const reservedClauses = expandPhrases([ 'RENAME TO', 'RENAME COLUMN', 'ALTER COLUMN', -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE TABLE', // other diff --git a/src/languages/sql/sql.formatter.ts b/src/languages/sql/sql.formatter.ts index 2b9410b15..5b4892c68 100644 --- a/src/languages/sql/sql.formatter.ts +++ b/src/languages/sql/sql.formatter.ts @@ -34,6 +34,9 @@ const reservedClauses = expandPhrases([ 'CREATE [RECURSIVE] VIEW', 'CREATE [GLOBAL TEMPORARY | LOCAL TEMPORARY] TABLE', 'DROP TABLE', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE', 'ADD COLUMN', @@ -45,9 +48,6 @@ const reservedClauses = expandPhrases([ 'ADD SCOPE', // for alter column 'DROP SCOPE {CASCADE | RESTRICT}', // for alter column 'RESTART WITH', // for alter column -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE TABLE', // other diff --git a/src/languages/sqlite/sqlite.formatter.ts b/src/languages/sqlite/sqlite.formatter.ts index 9f12880fe..77d6957ec 100644 --- a/src/languages/sqlite/sqlite.formatter.ts +++ b/src/languages/sqlite/sqlite.formatter.ts @@ -33,16 +33,19 @@ const reservedClauses = expandPhrases([ 'CREATE [TEMPORARY | TEMP] VIEW [IF NOT EXISTS]', 'CREATE [TEMPORARY | TEMP] TABLE [IF NOT EXISTS]', 'DROP TABLE [IF EXISTS]', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE', 'ADD [COLUMN]', 'DROP [COLUMN]', 'RENAME [COLUMN]', 'RENAME TO', + // - set schema + 'SET SCHEMA', ]); -const onelineClauses = expandPhrases(['SET SCHEMA']); - const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT', 'INTERSECT']); // joins - https://www.sqlite.org/syntax/join-operator.html diff --git a/src/languages/transactsql/transactsql.formatter.ts b/src/languages/transactsql/transactsql.formatter.ts index d0d57c0c1..775a87eee 100644 --- a/src/languages/transactsql/transactsql.formatter.ts +++ b/src/languages/transactsql/transactsql.formatter.ts @@ -37,14 +37,14 @@ const reservedClauses = expandPhrases([ 'CREATE [OR ALTER] [MATERIALIZED] VIEW', 'CREATE TABLE', 'DROP TABLE [IF EXISTS]', +]); + +const onelineClauses = expandPhrases([ // - alter table: 'ALTER TABLE', 'ADD', 'DROP COLUMN [IF EXISTS]', 'ALTER COLUMN', -]); - -const onelineClauses = expandPhrases([ // - truncate: 'TRUNCATE TABLE', // https://docs.microsoft.com/en-us/sql/t-sql/statements/statements?view=sql-server-ver15 diff --git a/src/languages/trino/trino.formatter.ts b/src/languages/trino/trino.formatter.ts index 560cb2f15..044d91be0 100644 --- a/src/languages/trino/trino.formatter.ts +++ b/src/languages/trino/trino.formatter.ts @@ -34,15 +34,6 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE] [MATERIALIZED] VIEW', 'CREATE TABLE [IF NOT EXISTS]', 'DROP TABLE [IF EXISTS]', - // - alter table: - 'ALTER TABLE [IF EXISTS]', - 'ADD COLUMN [IF NOT EXISTS]', - 'DROP COLUMN [IF EXISTS]', - 'RENAME COLUMN [IF EXISTS]', - 'RENAME TO', - 'SET AUTHORIZATION [USER | ROLE]', - 'SET PROPERTIES', - 'EXECUTE', // MATCH_RECOGNIZE 'MATCH_RECOGNIZE', 'MEASURES', @@ -55,6 +46,15 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - alter table: + 'ALTER TABLE [IF EXISTS]', + 'ADD COLUMN [IF NOT EXISTS]', + 'DROP COLUMN [IF EXISTS]', + 'RENAME COLUMN [IF EXISTS]', + 'RENAME TO', + 'SET AUTHORIZATION [USER | ROLE]', + 'SET PROPERTIES', + 'EXECUTE', // - truncate: 'TRUNCATE TABLE', diff --git a/test/behavesLikeMariaDbFormatter.ts b/test/behavesLikeMariaDbFormatter.ts index 9824cef5b..f35ceff41 100644 --- a/test/behavesLikeMariaDbFormatter.ts +++ b/test/behavesLikeMariaDbFormatter.ts @@ -102,10 +102,8 @@ export default function behavesLikeMariaDbFormatter(format: FormatFn) { // Issue #181 it('does not wrap CHARACTER SET to multiple lines', () => { expect(format('ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET greek')).toBe(dedent` - ALTER TABLE - t - MODIFY - col1 VARCHAR(50) CHARACTER SET greek + ALTER TABLE t + MODIFY col1 VARCHAR(50) CHARACTER SET greek `); }); diff --git a/test/bigquery.test.ts b/test/bigquery.test.ts index 07087303e..9afe4d5be 100644 --- a/test/bigquery.test.ts +++ b/test/bigquery.test.ts @@ -436,10 +436,8 @@ describe('BigQueryFormatter', () => { ALTER SCHEMA mydataset SET DEFAULT COLLATE 'und:ci'`; const expected = dedent` - ALTER SCHEMA - mydataset - SET DEFAULT COLLATE - 'und:ci'`; + ALTER SCHEMA mydataset + SET DEFAULT COLLATE 'und:ci'`; expect(format(input)).toBe(expected); }); @@ -450,10 +448,8 @@ describe('BigQueryFormatter', () => { default_table_expiration_days=3.75 )`; const expected = dedent` - ALTER SCHEMA - mydataset - SET OPTIONS - (default_table_expiration_days = 3.75)`; + ALTER SCHEMA mydataset + SET OPTIONS (default_table_expiration_days = 3.75)`; expect(format(input)).toBe(expected); }); @@ -464,12 +460,10 @@ describe('BigQueryFormatter', () => { expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) )`; const expected = dedent` - ALTER TABLE - mydataset.mytable - SET OPTIONS - ( - expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) - )`; + ALTER TABLE mydataset.mytable + SET OPTIONS ( + expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) + )`; expect(format(input)).toBe(expected); }); @@ -478,10 +472,8 @@ describe('BigQueryFormatter', () => { ALTER TABLE mydataset.mytable SET DEFAULT COLLATE 'und:ci'`; const expected = dedent` - ALTER TABLE - mydataset.mytable - SET DEFAULT COLLATE - 'und:ci'`; + ALTER TABLE mydataset.mytable + SET DEFAULT COLLATE 'und:ci'`; expect(format(input)).toBe(expected); }); @@ -493,12 +485,9 @@ describe('BigQueryFormatter', () => { description="Price per unit" )`; const expected = dedent` - ALTER TABLE - mydataset.mytable - ALTER COLUMN - price - SET OPTIONS - (description = "Price per unit")`; + ALTER TABLE mydataset.mytable + ALTER COLUMN price + SET OPTIONS (description = "Price per unit")`; expect(format(input)).toBe(expected); }); @@ -508,10 +497,8 @@ describe('BigQueryFormatter', () => { ALTER COLUMN price DROP NOT NULL`; const expected = dedent` - ALTER TABLE - mydataset.mytable - ALTER COLUMN - price + ALTER TABLE mydataset.mytable + ALTER COLUMN price DROP NOT NULL`; expect(format(input)).toBe(expected); }); @@ -522,12 +509,9 @@ describe('BigQueryFormatter', () => { ALTER COLUMN price SET DATA TYPE NUMERIC`; const expected = dedent` - ALTER TABLE - mydataset.mytable - ALTER COLUMN - price - SET DATA TYPE - NUMERIC`; + ALTER TABLE mydataset.mytable + ALTER COLUMN price + SET DATA TYPE NUMERIC`; expect(format(input)).toBe(expected); }); @@ -538,12 +522,10 @@ describe('BigQueryFormatter', () => { expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) )`; const expected = dedent` - ALTER VIEW - mydataset.myview - SET OPTIONS - ( - expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) - )`; + ALTER VIEW mydataset.myview + SET OPTIONS ( + expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) + )`; expect(format(input)).toBe(expected); }); @@ -554,10 +536,8 @@ describe('BigQueryFormatter', () => { size_gb = 250 )`; const expected = dedent` - ALTER BI_CAPACITY - my-project.region-us.default - SET OPTIONS - (size_gb = 250)`; + ALTER BI_CAPACITY my-project.region-us.default + SET OPTIONS (size_gb = 250)`; expect(format(input)).toBe(expected); }); }); diff --git a/test/db2.test.ts b/test/db2.test.ts index 87480c832..9c0446485 100644 --- a/test/db2.test.ts +++ b/test/db2.test.ts @@ -118,17 +118,12 @@ describe('Db2Formatter', () => { ALTER TABLE t ALTER COLUMN foo SET NOT NULL;` ) ).toBe(dedent` - ALTER TABLE - t - ALTER COLUMN - foo - SET DATA TYPE - VARCHAR; + ALTER TABLE t + ALTER COLUMN foo + SET DATA TYPE VARCHAR; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo SET NOT NULL; `); }); diff --git a/test/features/alterTable.ts b/test/features/alterTable.ts index 6494a84a0..9f0feaa06 100644 --- a/test/features/alterTable.ts +++ b/test/features/alterTable.ts @@ -15,10 +15,8 @@ export default function supportsAlterTable(format: FormatFn, cfg: AlterTableConf it('formats ALTER TABLE ... ADD COLUMN query', () => { const result = format('ALTER TABLE supplier ADD COLUMN unit_price DECIMAL NOT NULL;'); expect(result).toBe(dedent` - ALTER TABLE - supplier - ADD COLUMN - unit_price DECIMAL NOT NULL; + ALTER TABLE supplier + ADD COLUMN unit_price DECIMAL NOT NULL; `); }); } @@ -27,10 +25,8 @@ export default function supportsAlterTable(format: FormatFn, cfg: AlterTableConf it('formats ALTER TABLE ... DROP COLUMN query', () => { const result = format('ALTER TABLE supplier DROP COLUMN unit_price;'); expect(result).toBe(dedent` - ALTER TABLE - supplier - DROP COLUMN - unit_price; + ALTER TABLE supplier + DROP COLUMN unit_price; `); }); } @@ -39,10 +35,8 @@ export default function supportsAlterTable(format: FormatFn, cfg: AlterTableConf it('formats ALTER TABLE ... MODIFY statement', () => { const result = format('ALTER TABLE supplier MODIFY supplier_id DECIMAL NULL;'); expect(result).toBe(dedent` - ALTER TABLE - supplier - MODIFY - supplier_id DECIMAL NULL; + ALTER TABLE supplier + MODIFY supplier_id DECIMAL NULL; `); }); } @@ -51,10 +45,8 @@ export default function supportsAlterTable(format: FormatFn, cfg: AlterTableConf it('formats ALTER TABLE ... RENAME TO statement', () => { const result = format('ALTER TABLE supplier RENAME TO the_one_who_supplies;'); expect(result).toBe(dedent` - ALTER TABLE - supplier - RENAME TO - the_one_who_supplies; + ALTER TABLE supplier + RENAME TO the_one_who_supplies; `); }); } @@ -63,10 +55,8 @@ export default function supportsAlterTable(format: FormatFn, cfg: AlterTableConf it('formats ALTER TABLE ... RENAME COLUMN statement', () => { const result = format('ALTER TABLE supplier RENAME COLUMN supplier_id TO id;'); expect(result).toBe(dedent` - ALTER TABLE - supplier - RENAME COLUMN - supplier_id TO id; + ALTER TABLE supplier + RENAME COLUMN supplier_id TO id; `); }); } diff --git a/test/mariadb.test.ts b/test/mariadb.test.ts index 0a5b7411e..cc08418a6 100644 --- a/test/mariadb.test.ts +++ b/test/mariadb.test.ts @@ -77,17 +77,12 @@ describe('MariaDbFormatter', () => { ALTER TABLE t ALTER COLUMN foo DROP DEFAULT;` ) ).toBe(dedent` - ALTER TABLE - t - ALTER COLUMN - foo - SET DEFAULT - 10; + ALTER TABLE t + ALTER COLUMN foo + SET DEFAULT 10; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo DROP DEFAULT; `); }); diff --git a/test/mysql.test.ts b/test/mysql.test.ts index 2acbe3679..13dc1ff45 100644 --- a/test/mysql.test.ts +++ b/test/mysql.test.ts @@ -84,17 +84,12 @@ describe('MySqlFormatter', () => { ALTER TABLE t ALTER COLUMN foo DROP DEFAULT;` ) ).toBe(dedent` - ALTER TABLE - t - ALTER COLUMN - foo - SET DEFAULT - 10; + ALTER TABLE t + ALTER COLUMN foo + SET DEFAULT 10; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo DROP DEFAULT; `); }); diff --git a/test/postgresql.test.ts b/test/postgresql.test.ts index 59d1a0bfa..8ba232ca1 100644 --- a/test/postgresql.test.ts +++ b/test/postgresql.test.ts @@ -237,36 +237,24 @@ describe('PostgreSqlFormatter', () => { ALTER TABLE t ALTER COLUMN foo DROP NOT NULL;` ) ).toBe(dedent` - ALTER TABLE - t - ALTER COLUMN - foo - SET DATA TYPE - VARCHAR; + ALTER TABLE t + ALTER COLUMN foo + SET DATA TYPE VARCHAR; - ALTER TABLE - t - ALTER COLUMN - foo - SET DEFAULT - 5; + ALTER TABLE t + ALTER COLUMN foo + SET DEFAULT 5; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo DROP DEFAULT; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo SET NOT NULL; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo DROP NOT NULL; `); }); diff --git a/test/redshift.test.ts b/test/redshift.test.ts index 3a8a92211..6b5ff2090 100644 --- a/test/redshift.test.ts +++ b/test/redshift.test.ts @@ -134,19 +134,13 @@ describe('RedshiftFormatter', () => { ALTER TABLE t ALTER COLUMN foo ENCODE my_encoding;` ) ).toBe(dedent` - ALTER TABLE - t - ALTER COLUMN - foo - TYPE - VARCHAR; + ALTER TABLE t + ALTER COLUMN foo + TYPE VARCHAR; - ALTER TABLE - t - ALTER COLUMN - foo - ENCODE - my_encoding; + ALTER TABLE t + ALTER COLUMN foo + ENCODE my_encoding; `); }); }); diff --git a/test/snowflake.test.ts b/test/snowflake.test.ts index cd9168cee..791a6b6cb 100644 --- a/test/snowflake.test.ts +++ b/test/snowflake.test.ts @@ -106,77 +106,49 @@ describe('SnowflakeFormatter', () => { ALTER TABLE t ALTER COLUMN foo UNSET TAG tname;` ) ).toBe(dedent` - ALTER TABLE - t - ALTER COLUMN - foo - SET DATA TYPE - VARCHAR; - - ALTER TABLE - t - ALTER COLUMN - foo - SET DEFAULT - 5; - - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo + SET DATA TYPE VARCHAR; + + ALTER TABLE t + ALTER COLUMN foo + SET DEFAULT 5; + + ALTER TABLE t + ALTER COLUMN foo DROP DEFAULT; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo SET NOT NULL; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo DROP NOT NULL; - ALTER TABLE - t - ALTER COLUMN - foo - COMMENT - 'blah'; - - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo + COMMENT 'blah'; + + ALTER TABLE t + ALTER COLUMN foo UNSET COMMENT; - ALTER TABLE - t - ALTER COLUMN - foo - SET MASKING POLICY - polis; - - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo + SET MASKING POLICY polis; + + ALTER TABLE t + ALTER COLUMN foo UNSET MASKING POLICY; - ALTER TABLE - t - ALTER COLUMN - foo - SET TAG - tname = 10; - - ALTER TABLE - t - ALTER COLUMN - foo - UNSET TAG - tname; + ALTER TABLE t + ALTER COLUMN foo + SET TAG tname = 10; + + ALTER TABLE t + ALTER COLUMN foo + UNSET TAG tname; `); }); }); diff --git a/test/spark.test.ts b/test/spark.test.ts index 5bbb2eccd..447d6fed5 100644 --- a/test/spark.test.ts +++ b/test/spark.test.ts @@ -128,10 +128,8 @@ describe('SparkFormatter', () => { it('formats ALTER TABLE ... ALTER COLUMN', () => { expect(format(`ALTER TABLE StudentInfo ALTER COLUMN FirstName COMMENT "new comment";`)) .toBe(dedent` - ALTER TABLE - StudentInfo - ALTER COLUMN - FirstName COMMENT "new comment"; + ALTER TABLE StudentInfo + ALTER COLUMN FirstName COMMENT "new comment"; `); }); }); diff --git a/test/sql.test.ts b/test/sql.test.ts index 1cc78ea04..9a8bf5809 100644 --- a/test/sql.test.ts +++ b/test/sql.test.ts @@ -79,31 +79,21 @@ describe('SqlFormatter', () => { ALTER TABLE t ALTER COLUMN foo RESTART WITH 10;` ) ).toBe(dedent` - ALTER TABLE - t - ALTER COLUMN - foo - SET DEFAULT - 5; + ALTER TABLE t + ALTER COLUMN foo + SET DEFAULT 5; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo DROP DEFAULT; - ALTER TABLE - t - ALTER COLUMN - foo + ALTER TABLE t + ALTER COLUMN foo DROP SCOPE CASCADE; - ALTER TABLE - t - ALTER COLUMN - foo - RESTART WITH - 10; + ALTER TABLE t + ALTER COLUMN foo + RESTART WITH 10; `); }); }); diff --git a/test/transactsql.test.ts b/test/transactsql.test.ts index cdcfe4d08..83ea31426 100644 --- a/test/transactsql.test.ts +++ b/test/transactsql.test.ts @@ -113,10 +113,8 @@ describe('TransactSqlFormatter', () => { it('formats ALTER TABLE ... ALTER COLUMN', () => { expect(format(`ALTER TABLE t ALTER COLUMN foo INT NOT NULL DEFAULT 5;`)).toBe(dedent` - ALTER TABLE - t - ALTER COLUMN - foo INT NOT NULL DEFAULT 5; + ALTER TABLE t + ALTER COLUMN foo INT NOT NULL DEFAULT 5; `); }); }); From 9d0feadd19f6094b964560ac3b81f172b71522ac Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Tue, 4 Oct 2022 14:20:39 +0300 Subject: [PATCH 25/28] Use oneline style for DROP TABLE --- src/languages/bigquery/bigquery.formatter.ts | 3 ++- src/languages/db2/db2.formatter.ts | 3 ++- src/languages/hive/hive.formatter.ts | 3 ++- src/languages/mariadb/mariadb.formatter.ts | 3 ++- src/languages/mysql/mysql.formatter.ts | 3 ++- src/languages/n1ql/n1ql.formatter.ts | 1 + src/languages/plsql/plsql.formatter.ts | 3 ++- src/languages/postgresql/postgresql.formatter.ts | 3 ++- src/languages/redshift/redshift.formatter.ts | 3 ++- src/languages/singlestoredb/singlestoredb.formatter.ts | 3 ++- src/languages/snowflake/snowflake.formatter.ts | 3 ++- src/languages/spark/spark.formatter.ts | 3 ++- src/languages/sql/sql.formatter.ts | 3 ++- src/languages/sqlite/sqlite.formatter.ts | 3 ++- src/languages/transactsql/transactsql.formatter.ts | 3 ++- src/languages/trino/trino.formatter.ts | 3 ++- test/features/dropTable.ts | 6 ++---- 17 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index 28952eada..fe77897e9 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -38,7 +38,6 @@ const reservedClauses = expandPhrases([ // Data definition, https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language 'CREATE [OR REPLACE] [MATERIALIZED] VIEW [IF NOT EXISTS]', 'CREATE [OR REPLACE] [TEMP|TEMPORARY|SNAPSHOT|EXTERNAL] TABLE [IF NOT EXISTS]', - 'DROP [SNAPSHOT | EXTERNAL] TABLE [IF EXISTS]', 'CLUSTER BY', 'FOR SYSTEM_TIME AS OF', // CREATE SNAPSHOT TABLE @@ -48,6 +47,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP [SNAPSHOT | EXTERNAL] TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE [IF EXISTS]', 'ADD COLUMN [IF NOT EXISTS]', diff --git a/src/languages/db2/db2.formatter.ts b/src/languages/db2/db2.formatter.ts index 802a22cf0..eea485f4a 100644 --- a/src/languages/db2/db2.formatter.ts +++ b/src/languages/db2/db2.formatter.ts @@ -36,10 +36,11 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [OR REPLACE] VIEW', 'CREATE [GLOBAL TEMPORARY] TABLE', - 'DROP TABLE [HIERARCHY]', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE [HIERARCHY]', // alter table: 'ALTER TABLE', 'ADD [COLUMN]', diff --git a/src/languages/hive/hive.formatter.ts b/src/languages/hive/hive.formatter.ts index 5ff282073..f8af21427 100644 --- a/src/languages/hive/hive.formatter.ts +++ b/src/languages/hive/hive.formatter.ts @@ -47,10 +47,11 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [MATERIALIZED] VIEW [IF NOT EXISTS]', 'CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS]', - 'DROP TABLE [IF EXISTS]', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE', 'RENAME TO', diff --git a/src/languages/mariadb/mariadb.formatter.ts b/src/languages/mariadb/mariadb.formatter.ts index e3d6dfde7..c59b8afcd 100644 --- a/src/languages/mariadb/mariadb.formatter.ts +++ b/src/languages/mariadb/mariadb.formatter.ts @@ -33,12 +33,13 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', 'CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS]', - 'DROP [TEMPORARY] TABLE [IF EXISTS]', // other 'RETURNING', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP [TEMPORARY] TABLE [IF EXISTS]', // - alter table: 'ALTER [ONLINE] [IGNORE] TABLE [IF EXISTS]', 'ADD [COLUMN] [IF NOT EXISTS]', diff --git a/src/languages/mysql/mysql.formatter.ts b/src/languages/mysql/mysql.formatter.ts index e766e9be9..1c6f3c5b0 100644 --- a/src/languages/mysql/mysql.formatter.ts +++ b/src/languages/mysql/mysql.formatter.ts @@ -33,10 +33,11 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', 'CREATE [TEMPORARY] TABLE [IF NOT EXISTS]', - 'DROP [TEMPORARY] TABLE [IF EXISTS]', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP [TEMPORARY] TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE', 'ADD [COLUMN]', diff --git a/src/languages/n1ql/n1ql.formatter.ts b/src/languages/n1ql/n1ql.formatter.ts index 307439d2f..ebbf63edc 100644 --- a/src/languages/n1ql/n1ql.formatter.ts +++ b/src/languages/n1ql/n1ql.formatter.ts @@ -41,6 +41,7 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - set schema: 'SET SCHEMA', // https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/reservedwords.html 'ADVISE', diff --git a/src/languages/plsql/plsql.formatter.ts b/src/languages/plsql/plsql.formatter.ts index a0c6c6ba7..8ee446408 100644 --- a/src/languages/plsql/plsql.formatter.ts +++ b/src/languages/plsql/plsql.formatter.ts @@ -37,12 +37,13 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE] [NO FORCE | FORCE] [EDITIONING | EDITIONABLE | EDITIONABLE EDITIONING | NONEDITIONABLE] VIEW', 'CREATE MATERIALIZED VIEW', 'CREATE [GLOBAL TEMPORARY | PRIVATE TEMPORARY | SHARDED | DUPLICATED | IMMUTABLE BLOCKCHAIN | BLOCKCHAIN | IMMUTABLE] TABLE', - 'DROP TABLE', // other 'RETURNING', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE', // - alter table: 'ALTER TABLE', 'ADD', diff --git a/src/languages/postgresql/postgresql.formatter.ts b/src/languages/postgresql/postgresql.formatter.ts index d6311bf1c..ec5750cf8 100644 --- a/src/languages/postgresql/postgresql.formatter.ts +++ b/src/languages/postgresql/postgresql.formatter.ts @@ -34,12 +34,13 @@ const reservedClauses = expandPhrases([ 'CREATE [OR REPLACE] [TEMP | TEMPORARY] [RECURSIVE] VIEW', 'CREATE MATERIALIZED VIEW [IF NOT EXISTS]', 'CREATE [GLOBAL | LOCAL] [TEMPORARY | TEMP | UNLOGGED] TABLE [IF NOT EXISTS]', - 'DROP TABLE [IF EXISTS]', // other 'RETURNING', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE [IF EXISTS] [ONLY]', 'ALTER TABLE ALL IN TABLESPACE', diff --git a/src/languages/redshift/redshift.formatter.ts b/src/languages/redshift/redshift.formatter.ts index 6ebf5f2ef..4f8787e76 100644 --- a/src/languages/redshift/redshift.formatter.ts +++ b/src/languages/redshift/redshift.formatter.ts @@ -30,10 +30,11 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [OR REPLACE | MATERIALIZED] VIEW', 'CREATE [TEMPORARY | TEMP | LOCAL TEMPORARY | LOCAL TEMP] TABLE [IF NOT EXISTS]', - 'DROP TABLE [IF EXISTS]', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE', 'ALTER TABLE APPEND', diff --git a/src/languages/singlestoredb/singlestoredb.formatter.ts b/src/languages/singlestoredb/singlestoredb.formatter.ts index 437773bfb..09c194f3a 100644 --- a/src/languages/singlestoredb/singlestoredb.formatter.ts +++ b/src/languages/singlestoredb/singlestoredb.formatter.ts @@ -34,10 +34,11 @@ const reservedClauses = expandPhrases([ 'CREATE [ROWSTORE] [REFERENCE | TEMPORARY | GLOBAL TEMPORARY] TABLE [IF NOT EXISTS]', 'CREATE [OR REPLACE] [TEMPORARY] PROCEDURE [IF NOT EXISTS]', 'CREATE [OR REPLACE] [EXTERNAL] FUNCTION', - 'DROP [TEMPORARY] TABLE [IF EXISTS]', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP [TEMPORARY] TABLE [IF EXISTS]', // - alter table: 'ALTER [ONLINE] TABLE', 'ADD [COLUMN]', diff --git a/src/languages/snowflake/snowflake.formatter.ts b/src/languages/snowflake/snowflake.formatter.ts index 165496d89..b25f9b8da 100644 --- a/src/languages/snowflake/snowflake.formatter.ts +++ b/src/languages/snowflake/snowflake.formatter.ts @@ -43,10 +43,11 @@ const reservedClauses = expandPhrases([ 'WHEN MATCHED [AND]', 'THEN {UPDATE SET | DELETE}', 'WHEN NOT MATCHED THEN INSERT', - 'DROP TABLE [IF EXISTS]', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE [IF EXISTS]', 'RENAME TO', diff --git a/src/languages/spark/spark.formatter.ts b/src/languages/spark/spark.formatter.ts index 4098e34d7..22734370c 100644 --- a/src/languages/spark/spark.formatter.ts +++ b/src/languages/spark/spark.formatter.ts @@ -37,10 +37,11 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [OR REPLACE] [GLOBAL TEMPORARY | TEMPORARY] VIEW [IF NOT EXISTS]', 'CREATE [EXTERNAL] TABLE [IF NOT EXISTS]', - 'DROP TABLE [IF EXISTS]', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE', 'ADD COLUMNS', diff --git a/src/languages/sql/sql.formatter.ts b/src/languages/sql/sql.formatter.ts index 5b4892c68..541cf5eb8 100644 --- a/src/languages/sql/sql.formatter.ts +++ b/src/languages/sql/sql.formatter.ts @@ -33,10 +33,11 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [RECURSIVE] VIEW', 'CREATE [GLOBAL TEMPORARY | LOCAL TEMPORARY] TABLE', - 'DROP TABLE', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE', // - alter table: 'ALTER TABLE', 'ADD COLUMN', diff --git a/src/languages/sqlite/sqlite.formatter.ts b/src/languages/sqlite/sqlite.formatter.ts index 77d6957ec..5d39b0207 100644 --- a/src/languages/sqlite/sqlite.formatter.ts +++ b/src/languages/sqlite/sqlite.formatter.ts @@ -32,10 +32,11 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [TEMPORARY | TEMP] VIEW [IF NOT EXISTS]', 'CREATE [TEMPORARY | TEMP] TABLE [IF NOT EXISTS]', - 'DROP TABLE [IF EXISTS]', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE', 'ADD [COLUMN]', diff --git a/src/languages/transactsql/transactsql.formatter.ts b/src/languages/transactsql/transactsql.formatter.ts index 775a87eee..58d7d3b6d 100644 --- a/src/languages/transactsql/transactsql.formatter.ts +++ b/src/languages/transactsql/transactsql.formatter.ts @@ -36,10 +36,11 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [OR ALTER] [MATERIALIZED] VIEW', 'CREATE TABLE', - 'DROP TABLE [IF EXISTS]', ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE', 'ADD', diff --git a/src/languages/trino/trino.formatter.ts b/src/languages/trino/trino.formatter.ts index 044d91be0..ce836e3e4 100644 --- a/src/languages/trino/trino.formatter.ts +++ b/src/languages/trino/trino.formatter.ts @@ -33,7 +33,6 @@ const reservedClauses = expandPhrases([ // Data definition 'CREATE [OR REPLACE] [MATERIALIZED] VIEW', 'CREATE TABLE [IF NOT EXISTS]', - 'DROP TABLE [IF EXISTS]', // MATCH_RECOGNIZE 'MATCH_RECOGNIZE', 'MEASURES', @@ -46,6 +45,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - drop table: + 'DROP TABLE [IF EXISTS]', // - alter table: 'ALTER TABLE [IF EXISTS]', 'ADD COLUMN [IF NOT EXISTS]', diff --git a/test/features/dropTable.ts b/test/features/dropTable.ts index 25b44ed86..5802c0809 100644 --- a/test/features/dropTable.ts +++ b/test/features/dropTable.ts @@ -10,8 +10,7 @@ export default function supportsDropTable(format: FormatFn, { ifExists }: DropTa it('formats DROP TABLE statement', () => { const result = format('DROP TABLE admin_role;'); expect(result).toBe(dedent` - DROP TABLE - admin_role; + DROP TABLE admin_role; `); }); @@ -19,8 +18,7 @@ export default function supportsDropTable(format: FormatFn, { ifExists }: DropTa it('formats DROP TABLE IF EXISTS statement', () => { const result = format('DROP TABLE IF EXISTS admin_role;'); expect(result).toBe(dedent` - DROP TABLE IF EXISTS - admin_role; + DROP TABLE IF EXISTS admin_role; `); }); } From b3a18aa62f6f7688bd112c4fd6555538887da3ac Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Tue, 4 Oct 2022 14:34:01 +0300 Subject: [PATCH 26/28] Use oneline formatting for DELETE FROM --- src/languages/bigquery/bigquery.formatter.ts | 4 ++-- src/languages/db2/db2.formatter.ts | 4 ++-- src/languages/hive/hive.formatter.ts | 4 ++-- src/languages/mariadb/mariadb.formatter.ts | 4 ++-- src/languages/mysql/mysql.formatter.ts | 4 ++-- src/languages/n1ql/n1ql.formatter.ts | 4 ++-- src/languages/plsql/plsql.formatter.ts | 4 ++-- src/languages/postgresql/postgresql.formatter.ts | 4 ++-- src/languages/redshift/redshift.formatter.ts | 4 ++-- src/languages/singlestoredb/singlestoredb.formatter.ts | 4 ++-- src/languages/snowflake/snowflake.formatter.ts | 4 ++-- src/languages/sql/sql.formatter.ts | 4 ++-- src/languages/sqlite/sqlite.formatter.ts | 4 ++-- src/languages/transactsql/transactsql.formatter.ts | 4 ++-- src/languages/trino/trino.formatter.ts | 4 ++-- test/features/deleteFrom.ts | 6 ++---- test/n1ql.test.ts | 3 +-- 17 files changed, 33 insertions(+), 36 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index fe77897e9..1877c639e 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -29,8 +29,6 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE', 'SET', - // - delete: - 'DELETE [FROM]', // - merge: 'MERGE [INTO]', 'WHEN [NOT] MATCHED [BY SOURCE | BY TARGET] [THEN]', @@ -47,6 +45,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE [FROM]', // - drop table: 'DROP [SNAPSHOT | EXTERNAL] TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/db2/db2.formatter.ts b/src/languages/db2/db2.formatter.ts index eea485f4a..e156647b8 100644 --- a/src/languages/db2/db2.formatter.ts +++ b/src/languages/db2/db2.formatter.ts @@ -26,8 +26,6 @@ const reservedClauses = expandPhrases([ 'SET', 'WHERE CURRENT OF', 'WITH {RR | RS | CS | UR}', - // - delete: - 'DELETE FROM', // - merge: 'MERGE INTO', 'WHEN [NOT] MATCHED [THEN]', @@ -39,6 +37,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE FROM', // - drop table: 'DROP TABLE [HIERARCHY]', // alter table: diff --git a/src/languages/hive/hive.formatter.ts b/src/languages/hive/hive.formatter.ts index f8af21427..5657f2912 100644 --- a/src/languages/hive/hive.formatter.ts +++ b/src/languages/hive/hive.formatter.ts @@ -30,8 +30,6 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE', 'SET', - // - delete: - 'DELETE FROM', // - merge: 'MERGE INTO', 'WHEN [NOT] MATCHED [THEN]', @@ -50,6 +48,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE FROM', // - drop table: 'DROP TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/mariadb/mariadb.formatter.ts b/src/languages/mariadb/mariadb.formatter.ts index c59b8afcd..66d336745 100644 --- a/src/languages/mariadb/mariadb.formatter.ts +++ b/src/languages/mariadb/mariadb.formatter.ts @@ -28,8 +28,6 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE [LOW_PRIORITY] [IGNORE]', 'SET', - // - delete: - 'DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM', // Data definition 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', 'CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS]', @@ -38,6 +36,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM', // - drop table: 'DROP [TEMPORARY] TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/mysql/mysql.formatter.ts b/src/languages/mysql/mysql.formatter.ts index 1c6f3c5b0..ab70a1ffd 100644 --- a/src/languages/mysql/mysql.formatter.ts +++ b/src/languages/mysql/mysql.formatter.ts @@ -28,14 +28,14 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE [LOW_PRIORITY] [IGNORE]', 'SET', - // - delete: - 'DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM', // Data definition 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', 'CREATE [TEMPORARY] TABLE [IF NOT EXISTS]', ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM', // - drop table: 'DROP [TEMPORARY] TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/n1ql/n1ql.formatter.ts b/src/languages/n1ql/n1ql.formatter.ts index ebbf63edc..b6028cc81 100644 --- a/src/languages/n1ql/n1ql.formatter.ts +++ b/src/languages/n1ql/n1ql.formatter.ts @@ -26,8 +26,6 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE', 'SET', - // - delete: - 'DELETE FROM', // - merge: 'MERGE INTO', 'WHEN [NOT] MATCHED THEN', @@ -41,6 +39,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE FROM', // - set schema: 'SET SCHEMA', // https://docs.couchbase.com/server/current/n1ql/n1ql-language-reference/reservedwords.html diff --git a/src/languages/plsql/plsql.formatter.ts b/src/languages/plsql/plsql.formatter.ts index 8ee446408..48c27f0aa 100644 --- a/src/languages/plsql/plsql.formatter.ts +++ b/src/languages/plsql/plsql.formatter.ts @@ -27,8 +27,6 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE [ONLY]', 'SET', - // - delete: - 'DELETE FROM [ONLY]', // - merge: 'MERGE [INTO]', 'WHEN [NOT] MATCHED [THEN]', @@ -42,6 +40,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE FROM [ONLY]', // - drop table: 'DROP TABLE', // - alter table: diff --git a/src/languages/postgresql/postgresql.formatter.ts b/src/languages/postgresql/postgresql.formatter.ts index ec5750cf8..d314cc9a2 100644 --- a/src/languages/postgresql/postgresql.formatter.ts +++ b/src/languages/postgresql/postgresql.formatter.ts @@ -28,8 +28,6 @@ const reservedClauses = expandPhrases([ 'UPDATE [ONLY]', 'SET', 'WHERE CURRENT OF', - // - delete: - 'DELETE FROM [ONLY]', // Data definition 'CREATE [OR REPLACE] [TEMP | TEMPORARY] [RECURSIVE] VIEW', 'CREATE MATERIALIZED VIEW [IF NOT EXISTS]', @@ -39,6 +37,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE FROM [ONLY]', // - drop table: 'DROP TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/redshift/redshift.formatter.ts b/src/languages/redshift/redshift.formatter.ts index 4f8787e76..529280651 100644 --- a/src/languages/redshift/redshift.formatter.ts +++ b/src/languages/redshift/redshift.formatter.ts @@ -25,14 +25,14 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE', 'SET', - // - delete: - 'DELETE [FROM]', // Data definition 'CREATE [OR REPLACE | MATERIALIZED] VIEW', 'CREATE [TEMPORARY | TEMP | LOCAL TEMPORARY | LOCAL TEMP] TABLE [IF NOT EXISTS]', ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE [FROM]', // - drop table: 'DROP TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/singlestoredb/singlestoredb.formatter.ts b/src/languages/singlestoredb/singlestoredb.formatter.ts index 09c194f3a..5b67efcd1 100644 --- a/src/languages/singlestoredb/singlestoredb.formatter.ts +++ b/src/languages/singlestoredb/singlestoredb.formatter.ts @@ -27,8 +27,6 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE', 'SET', - // - delete: - 'DELETE [FROM]', // Data definition 'CREATE VIEW', 'CREATE [ROWSTORE] [REFERENCE | TEMPORARY | GLOBAL TEMPORARY] TABLE [IF NOT EXISTS]', @@ -37,6 +35,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE [FROM]', // - drop table: 'DROP [TEMPORARY] TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/snowflake/snowflake.formatter.ts b/src/languages/snowflake/snowflake.formatter.ts index b25f9b8da..9f91b046b 100644 --- a/src/languages/snowflake/snowflake.formatter.ts +++ b/src/languages/snowflake/snowflake.formatter.ts @@ -27,8 +27,6 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE', 'SET', - // - delete: - 'DELETE FROM', // Data definition // - view 'CREATE [OR REPLACE] [SECURE] [RECURSIVE] VIEW [IF NOT EXISTS]', @@ -46,6 +44,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE FROM', // - drop table: 'DROP TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/sql/sql.formatter.ts b/src/languages/sql/sql.formatter.ts index 541cf5eb8..e7c3424bd 100644 --- a/src/languages/sql/sql.formatter.ts +++ b/src/languages/sql/sql.formatter.ts @@ -28,14 +28,14 @@ const reservedClauses = expandPhrases([ 'UPDATE', 'SET', 'WHERE CURRENT OF', - // - delete: - 'DELETE FROM', // Data definition 'CREATE [RECURSIVE] VIEW', 'CREATE [GLOBAL TEMPORARY | LOCAL TEMPORARY] TABLE', ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE FROM', // - drop table: 'DROP TABLE', // - alter table: diff --git a/src/languages/sqlite/sqlite.formatter.ts b/src/languages/sqlite/sqlite.formatter.ts index 5d39b0207..435e3e6e9 100644 --- a/src/languages/sqlite/sqlite.formatter.ts +++ b/src/languages/sqlite/sqlite.formatter.ts @@ -27,14 +27,14 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE [OR ABORT | OR FAIL | OR IGNORE | OR REPLACE | OR ROLLBACK]', 'SET', - // - delete: - 'DELETE FROM', // Data definition 'CREATE [TEMPORARY | TEMP] VIEW [IF NOT EXISTS]', 'CREATE [TEMPORARY | TEMP] TABLE [IF NOT EXISTS]', ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE FROM', // - drop table: 'DROP TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/transactsql/transactsql.formatter.ts b/src/languages/transactsql/transactsql.formatter.ts index 58d7d3b6d..c253cfd4b 100644 --- a/src/languages/transactsql/transactsql.formatter.ts +++ b/src/languages/transactsql/transactsql.formatter.ts @@ -27,8 +27,6 @@ const reservedClauses = expandPhrases([ 'UPDATE', 'SET', 'WHERE CURRENT OF', - // - delete: - 'DELETE [FROM]', // - merge: 'MERGE [INTO]', 'WHEN [NOT] MATCHED [BY TARGET | BY SOURCE] [THEN]', @@ -39,6 +37,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE [FROM]', // - drop table: 'DROP TABLE [IF EXISTS]', // - alter table: diff --git a/src/languages/trino/trino.formatter.ts b/src/languages/trino/trino.formatter.ts index ce836e3e4..9c92ef382 100644 --- a/src/languages/trino/trino.formatter.ts +++ b/src/languages/trino/trino.formatter.ts @@ -28,8 +28,6 @@ const reservedClauses = expandPhrases([ // - update: 'UPDATE', 'SET', - // - delete: - 'DELETE FROM', // Data definition 'CREATE [OR REPLACE] [MATERIALIZED] VIEW', 'CREATE TABLE [IF NOT EXISTS]', @@ -45,6 +43,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - delete: + 'DELETE FROM', // - drop table: 'DROP TABLE [IF EXISTS]', // - alter table: diff --git a/test/features/deleteFrom.ts b/test/features/deleteFrom.ts index 542a2a4f4..2b26cc54a 100644 --- a/test/features/deleteFrom.ts +++ b/test/features/deleteFrom.ts @@ -13,8 +13,7 @@ export default function supportsDeleteFrom( it('formats DELETE FROM statement', () => { const result = format("DELETE FROM Customers WHERE CustomerName='Alfred' AND Phone=5002132;"); expect(result).toBe(dedent` - DELETE FROM - Customers + DELETE FROM Customers WHERE CustomerName = 'Alfred' AND Phone = 5002132; @@ -25,8 +24,7 @@ export default function supportsDeleteFrom( it('formats DELETE statement (without FROM)', () => { const result = format("DELETE Customers WHERE CustomerName='Alfred';"); expect(result).toBe(dedent` - DELETE - Customers + DELETE Customers WHERE CustomerName = 'Alfred'; `); diff --git a/test/n1ql.test.ts b/test/n1ql.test.ts index fe45b3494..ca35e465f 100644 --- a/test/n1ql.test.ts +++ b/test/n1ql.test.ts @@ -126,8 +126,7 @@ describe('N1qlFormatter', () => { const result = format("EXPLAIN DELETE FROM tutorial t USE KEYS 'baldwin'"); expect(result).toBe(dedent` EXPLAIN - DELETE FROM - tutorial t + DELETE FROM tutorial t USE KEYS 'baldwin' `); From 80b8ef67ab63202ecf402c730759ac8c2731046c Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Tue, 4 Oct 2022 14:42:33 +0300 Subject: [PATCH 27/28] Format UPDATE statement using online style --- src/languages/bigquery/bigquery.formatter.ts | 3 ++- src/languages/db2/db2.formatter.ts | 7 ++++--- src/languages/hive/hive.formatter.ts | 3 ++- src/languages/mariadb/mariadb.formatter.ts | 3 ++- src/languages/mysql/mysql.formatter.ts | 3 ++- src/languages/n1ql/n1ql.formatter.ts | 3 ++- src/languages/plsql/plsql.formatter.ts | 3 ++- src/languages/postgresql/postgresql.formatter.ts | 5 +++-- src/languages/redshift/redshift.formatter.ts | 3 ++- .../singlestoredb/singlestoredb.formatter.ts | 3 ++- src/languages/snowflake/snowflake.formatter.ts | 3 ++- src/languages/sql/sql.formatter.ts | 5 +++-- src/languages/sqlite/sqlite.formatter.ts | 3 ++- src/languages/transactsql/transactsql.formatter.ts | 5 +++-- src/languages/trino/trino.formatter.ts | 3 ++- test/db2.test.ts | 3 +-- test/features/update.ts | 12 ++++-------- test/n1ql.test.ts | 3 +-- 18 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/languages/bigquery/bigquery.formatter.ts b/src/languages/bigquery/bigquery.formatter.ts index 1877c639e..9c7b13e45 100644 --- a/src/languages/bigquery/bigquery.formatter.ts +++ b/src/languages/bigquery/bigquery.formatter.ts @@ -27,7 +27,6 @@ const reservedClauses = expandPhrases([ 'INSERT [INTO]', 'VALUES', // - update: - 'UPDATE', 'SET', // - merge: 'MERGE [INTO]', @@ -45,6 +44,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', // - delete: 'DELETE [FROM]', // - drop table: diff --git a/src/languages/db2/db2.formatter.ts b/src/languages/db2/db2.formatter.ts index e156647b8..7fdef5c68 100644 --- a/src/languages/db2/db2.formatter.ts +++ b/src/languages/db2/db2.formatter.ts @@ -22,10 +22,7 @@ const reservedClauses = expandPhrases([ 'INSERT INTO', 'VALUES', // - update: - 'UPDATE', 'SET', - 'WHERE CURRENT OF', - 'WITH {RR | RS | CS | UR}', // - merge: 'MERGE INTO', 'WHEN [NOT] MATCHED [THEN]', @@ -37,6 +34,10 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', + 'WHERE CURRENT OF', + 'WITH {RR | RS | CS | UR}', // - delete: 'DELETE FROM', // - drop table: diff --git a/src/languages/hive/hive.formatter.ts b/src/languages/hive/hive.formatter.ts index 5657f2912..997c829a6 100644 --- a/src/languages/hive/hive.formatter.ts +++ b/src/languages/hive/hive.formatter.ts @@ -28,7 +28,6 @@ const reservedClauses = expandPhrases([ 'INSERT INTO [TABLE]', 'VALUES', // - update: - 'UPDATE', 'SET', // - merge: 'MERGE INTO', @@ -48,6 +47,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', // - delete: 'DELETE FROM', // - drop table: diff --git a/src/languages/mariadb/mariadb.formatter.ts b/src/languages/mariadb/mariadb.formatter.ts index 66d336745..89ceac0dd 100644 --- a/src/languages/mariadb/mariadb.formatter.ts +++ b/src/languages/mariadb/mariadb.formatter.ts @@ -26,7 +26,6 @@ const reservedClauses = expandPhrases([ 'REPLACE [LOW_PRIORITY | DELAYED] [INTO]', 'VALUES', // - update: - 'UPDATE [LOW_PRIORITY] [IGNORE]', 'SET', // Data definition 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', @@ -36,6 +35,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE [LOW_PRIORITY] [IGNORE]', // - delete: 'DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM', // - drop table: diff --git a/src/languages/mysql/mysql.formatter.ts b/src/languages/mysql/mysql.formatter.ts index ab70a1ffd..a21e102cd 100644 --- a/src/languages/mysql/mysql.formatter.ts +++ b/src/languages/mysql/mysql.formatter.ts @@ -26,7 +26,6 @@ const reservedClauses = expandPhrases([ 'REPLACE [LOW_PRIORITY | DELAYED] [INTO]', 'VALUES', // - update: - 'UPDATE [LOW_PRIORITY] [IGNORE]', 'SET', // Data definition 'CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS]', @@ -34,6 +33,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE [LOW_PRIORITY] [IGNORE]', // - delete: 'DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM', // - drop table: diff --git a/src/languages/n1ql/n1ql.formatter.ts b/src/languages/n1ql/n1ql.formatter.ts index b6028cc81..b12941e09 100644 --- a/src/languages/n1ql/n1ql.formatter.ts +++ b/src/languages/n1ql/n1ql.formatter.ts @@ -24,7 +24,6 @@ const reservedClauses = expandPhrases([ 'INSERT INTO', 'VALUES', // - update: - 'UPDATE', 'SET', // - merge: 'MERGE INTO', @@ -39,6 +38,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', // - delete: 'DELETE FROM', // - set schema: diff --git a/src/languages/plsql/plsql.formatter.ts b/src/languages/plsql/plsql.formatter.ts index 48c27f0aa..9879c2dd6 100644 --- a/src/languages/plsql/plsql.formatter.ts +++ b/src/languages/plsql/plsql.formatter.ts @@ -25,7 +25,6 @@ const reservedClauses = expandPhrases([ 'INSERT [INTO | ALL INTO]', 'VALUES', // - update: - 'UPDATE [ONLY]', 'SET', // - merge: 'MERGE [INTO]', @@ -40,6 +39,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE [ONLY]', // - delete: 'DELETE FROM [ONLY]', // - drop table: diff --git a/src/languages/postgresql/postgresql.formatter.ts b/src/languages/postgresql/postgresql.formatter.ts index d314cc9a2..5ad88bd08 100644 --- a/src/languages/postgresql/postgresql.formatter.ts +++ b/src/languages/postgresql/postgresql.formatter.ts @@ -25,9 +25,7 @@ const reservedClauses = expandPhrases([ 'INSERT INTO', 'VALUES', // - update: - 'UPDATE [ONLY]', 'SET', - 'WHERE CURRENT OF', // Data definition 'CREATE [OR REPLACE] [TEMP | TEMPORARY] [RECURSIVE] VIEW', 'CREATE MATERIALIZED VIEW [IF NOT EXISTS]', @@ -37,6 +35,9 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE [ONLY]', + 'WHERE CURRENT OF', // - delete: 'DELETE FROM [ONLY]', // - drop table: diff --git a/src/languages/redshift/redshift.formatter.ts b/src/languages/redshift/redshift.formatter.ts index 529280651..8d14294bc 100644 --- a/src/languages/redshift/redshift.formatter.ts +++ b/src/languages/redshift/redshift.formatter.ts @@ -23,7 +23,6 @@ const reservedClauses = expandPhrases([ 'INSERT INTO', 'VALUES', // - update: - 'UPDATE', 'SET', // Data definition 'CREATE [OR REPLACE | MATERIALIZED] VIEW', @@ -31,6 +30,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', // - delete: 'DELETE [FROM]', // - drop table: diff --git a/src/languages/singlestoredb/singlestoredb.formatter.ts b/src/languages/singlestoredb/singlestoredb.formatter.ts index 5b67efcd1..1c4bd3107 100644 --- a/src/languages/singlestoredb/singlestoredb.formatter.ts +++ b/src/languages/singlestoredb/singlestoredb.formatter.ts @@ -25,7 +25,6 @@ const reservedClauses = expandPhrases([ 'VALUES', 'REPLACE [INTO]', // - update: - 'UPDATE', 'SET', // Data definition 'CREATE VIEW', @@ -35,6 +34,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', // - delete: 'DELETE [FROM]', // - drop table: diff --git a/src/languages/snowflake/snowflake.formatter.ts b/src/languages/snowflake/snowflake.formatter.ts index 9f91b046b..b0dbaaf87 100644 --- a/src/languages/snowflake/snowflake.formatter.ts +++ b/src/languages/snowflake/snowflake.formatter.ts @@ -25,7 +25,6 @@ const reservedClauses = expandPhrases([ '{THEN | ELSE} INTO', 'VALUES', // - update: - 'UPDATE', 'SET', // Data definition // - view @@ -44,6 +43,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', // - delete: 'DELETE FROM', // - drop table: diff --git a/src/languages/sql/sql.formatter.ts b/src/languages/sql/sql.formatter.ts index e7c3424bd..51f31ddb7 100644 --- a/src/languages/sql/sql.formatter.ts +++ b/src/languages/sql/sql.formatter.ts @@ -25,15 +25,16 @@ const reservedClauses = expandPhrases([ 'INSERT INTO', 'VALUES', // - update: - 'UPDATE', 'SET', - 'WHERE CURRENT OF', // Data definition 'CREATE [RECURSIVE] VIEW', 'CREATE [GLOBAL TEMPORARY | LOCAL TEMPORARY] TABLE', ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', + 'WHERE CURRENT OF', // - delete: 'DELETE FROM', // - drop table: diff --git a/src/languages/sqlite/sqlite.formatter.ts b/src/languages/sqlite/sqlite.formatter.ts index 435e3e6e9..5c4c9efe9 100644 --- a/src/languages/sqlite/sqlite.formatter.ts +++ b/src/languages/sqlite/sqlite.formatter.ts @@ -25,7 +25,6 @@ const reservedClauses = expandPhrases([ 'REPLACE INTO', 'VALUES', // - update: - 'UPDATE [OR ABORT | OR FAIL | OR IGNORE | OR REPLACE | OR ROLLBACK]', 'SET', // Data definition 'CREATE [TEMPORARY | TEMP] VIEW [IF NOT EXISTS]', @@ -33,6 +32,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE [OR ABORT | OR FAIL | OR IGNORE | OR REPLACE | OR ROLLBACK]', // - delete: 'DELETE FROM', // - drop table: diff --git a/src/languages/transactsql/transactsql.formatter.ts b/src/languages/transactsql/transactsql.formatter.ts index c253cfd4b..cbda06b6f 100644 --- a/src/languages/transactsql/transactsql.formatter.ts +++ b/src/languages/transactsql/transactsql.formatter.ts @@ -24,9 +24,7 @@ const reservedClauses = expandPhrases([ 'INSERT [INTO]', 'VALUES', // - update: - 'UPDATE', 'SET', - 'WHERE CURRENT OF', // - merge: 'MERGE [INTO]', 'WHEN [NOT] MATCHED [BY TARGET | BY SOURCE] [THEN]', @@ -37,6 +35,9 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', + 'WHERE CURRENT OF', // - delete: 'DELETE [FROM]', // - drop table: diff --git a/src/languages/trino/trino.formatter.ts b/src/languages/trino/trino.formatter.ts index 9c92ef382..3965dd901 100644 --- a/src/languages/trino/trino.formatter.ts +++ b/src/languages/trino/trino.formatter.ts @@ -26,7 +26,6 @@ const reservedClauses = expandPhrases([ 'INSERT INTO', 'VALUES', // - update: - 'UPDATE', 'SET', // Data definition 'CREATE [OR REPLACE] [MATERIALIZED] VIEW', @@ -43,6 +42,8 @@ const reservedClauses = expandPhrases([ ]); const onelineClauses = expandPhrases([ + // - update: + 'UPDATE', // - delete: 'DELETE FROM', // - drop table: diff --git a/test/db2.test.ts b/test/db2.test.ts index 9c0446485..ec028200c 100644 --- a/test/db2.test.ts +++ b/test/db2.test.ts @@ -103,8 +103,7 @@ describe('Db2Formatter', () => { it('supports WITH isolation level modifiers for UPDATE statement', () => { expect(format('UPDATE foo SET x = 10 WITH CS')).toBe(dedent` - UPDATE - foo + UPDATE foo SET x = 10 WITH CS diff --git a/test/features/update.ts b/test/features/update.ts index 533e0f9f9..a412cba9a 100644 --- a/test/features/update.ts +++ b/test/features/update.ts @@ -12,8 +12,7 @@ export default function supportsUpdate(format: FormatFn, { whereCurrentOf }: Upd "UPDATE Customers SET ContactName='Alfred Schmidt', City='Hamburg' WHERE CustomerName='Alfreds Futterkiste';" ); expect(result).toBe(dedent` - UPDATE - Customers + UPDATE Customers SET ContactName = 'Alfred Schmidt', City = 'Hamburg' @@ -27,8 +26,7 @@ export default function supportsUpdate(format: FormatFn, { whereCurrentOf }: Upd 'UPDATE customers SET total_orders = order_summary.total FROM ( SELECT * FROM bank) AS order_summary' ); expect(result).toBe(dedent` - UPDATE - customers + UPDATE customers SET total_orders = order_summary.total FROM @@ -45,12 +43,10 @@ export default function supportsUpdate(format: FormatFn, { whereCurrentOf }: Upd it('formats UPDATE statement with cursor position', () => { const result = format("UPDATE Customers SET Name='John' WHERE CURRENT OF my_cursor;"); expect(result).toBe(dedent` - UPDATE - Customers + UPDATE Customers SET Name = 'John' - WHERE CURRENT OF - my_cursor; + WHERE CURRENT OF my_cursor; `); }); } diff --git a/test/n1ql.test.ts b/test/n1ql.test.ts index ca35e465f..278e6dd8a 100644 --- a/test/n1ql.test.ts +++ b/test/n1ql.test.ts @@ -135,8 +135,7 @@ describe('N1qlFormatter', () => { it('formats UPDATE query with USE KEYS', () => { const result = format("UPDATE tutorial USE KEYS 'baldwin' SET type = 'actor'"); expect(result).toBe(dedent` - UPDATE - tutorial + UPDATE tutorial USE KEYS 'baldwin' SET From 52373483474b97b3effe55492aff880660aef956 Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Tue, 4 Oct 2022 14:47:32 +0300 Subject: [PATCH 28/28] Format N1QL USE KEYS clause in oneline style --- src/languages/n1ql/n1ql.formatter.ts | 2 +- test/n1ql.test.ts | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/languages/n1ql/n1ql.formatter.ts b/src/languages/n1ql/n1ql.formatter.ts index b12941e09..7e7029ca9 100644 --- a/src/languages/n1ql/n1ql.formatter.ts +++ b/src/languages/n1ql/n1ql.formatter.ts @@ -31,7 +31,6 @@ const reservedClauses = expandPhrases([ 'UPDATE SET', 'INSERT', // other - 'USE KEYS', 'NEST', 'UNNEST', 'RETURNING', @@ -76,6 +75,7 @@ const onelineClauses = expandPhrases([ 'LET', 'SET CURRENT SCHEMA', 'SHOW', + 'USE [PRIMARY] KEYS', ]); const reservedSetOperations = expandPhrases(['UNION [ALL]', 'EXCEPT [ALL]', 'INTERSECT [ALL]']); diff --git a/test/n1ql.test.ts b/test/n1ql.test.ts index 278e6dd8a..2629e74e6 100644 --- a/test/n1ql.test.ts +++ b/test/n1ql.test.ts @@ -115,8 +115,7 @@ describe('N1qlFormatter', () => { * FROM usr - USE KEYS - 'Elinor_33313792' + USE KEYS 'Elinor_33313792' NEST orders_with_users orders ON KEYS ARRAY s.order_id FOR s IN usr.shipped_order_history END; `); @@ -127,8 +126,7 @@ describe('N1qlFormatter', () => { expect(result).toBe(dedent` EXPLAIN DELETE FROM tutorial t - USE KEYS - 'baldwin' + USE KEYS 'baldwin' `); }); @@ -136,8 +134,7 @@ describe('N1qlFormatter', () => { const result = format("UPDATE tutorial USE KEYS 'baldwin' SET type = 'actor'"); expect(result).toBe(dedent` UPDATE tutorial - USE KEYS - 'baldwin' + USE KEYS 'baldwin' SET type = 'actor' `);