feat: parse query parameters in PostgreSQL query (#1732) · googleapis/java-spanner@7357ac6 (original) (raw)

`@@ -24,6 +24,7 @@

`

24

24

`import static org.junit.Assert.assertFalse;

`

25

25

`import static org.junit.Assert.assertTrue;

`

26

26

`import static org.junit.Assert.fail;

`

``

27

`+

import static org.junit.Assume.assumeTrue;

`

27

28

``

28

29

`import com.google.cloud.spanner.Dialect;

`

29

30

`import com.google.cloud.spanner.ErrorCode;

`

`@@ -33,6 +34,7 @@

`

33

34

`import com.google.cloud.spanner.connection.AbstractStatementParser.StatementType;

`

34

35

`import com.google.cloud.spanner.connection.ClientSideStatementImpl.CompileException;

`

35

36

`import com.google.common.collect.ImmutableMap;

`

``

37

`+

import com.google.common.collect.ImmutableSet;

`

36

38

`import com.google.common.truth.Truth;

`

37

39

`import java.io.File;

`

38

40

`import java.io.FileNotFoundException;

`

`@@ -42,7 +44,6 @@

`

42

44

`import java.util.Set;

`

43

45

`import java.util.regex.Matcher;

`

44

46

`import java.util.regex.Pattern;

`

45

``

`-

import org.junit.Assume;

`

46

47

`import org.junit.Before;

`

47

48

`import org.junit.Test;

`

48

49

`import org.junit.runner.RunWith;

`

`@@ -158,7 +159,7 @@ public void testRemoveComments() {

`

158

159

``

159

160

`@Test

`

160

161

`public void testGoogleStandardSQLRemoveCommentsGsql() {

`

161

``

`-

Assume.assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

``

162

`+

assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

162

163

``

163

164

`assertThat(parser.removeCommentsAndTrim("/GSQL/")).isEqualTo("");

`

164

165

`assertThat(parser.removeCommentsAndTrim("/GSQL/SELECT * FROM FOO"))

`

`@@ -183,7 +184,7 @@ public void testGoogleStandardSQLRemoveCommentsGsql() {

`

183

184

``

184

185

`@Test

`

185

186

`public void testPostgreSQLDialectRemoveCommentsGsql() {

`

186

``

`-

Assume.assumeTrue(dialect == Dialect.POSTGRESQL);

`

``

187

`+

assumeTrue(dialect == Dialect.POSTGRESQL);

`

187

188

``

188

189

`assertThat(parser.removeCommentsAndTrim("/GSQL/")).isEqualTo("/GSQL/");

`

189

190

`assertThat(parser.removeCommentsAndTrim("/GSQL/SELECT * FROM FOO"))

`

`@@ -273,7 +274,7 @@ public void testStatementWithCommentContainingSlashAndNoAsteriskOnNewLine() {

`

273

274

``

274

275

`@Test

`

275

276

`public void testPostgresSQLDialectDollarQuoted() {

`

276

``

`-

Assume.assumeTrue(dialect == Dialect.POSTGRESQL);

`

``

277

`+

assumeTrue(dialect == Dialect.POSTGRESQL);

`

277

278

``

278

279

`assertThat(parser.removeCommentsAndTrim("$$foo$$")).isEqualTo("$$foo$$");

`

279

280

`assertThat(parser.removeCommentsAndTrim("$$--foo$$")).isEqualTo("$$--foo$$");

`

`@@ -296,7 +297,7 @@ public void testPostgresSQLDialectDollarQuoted() {

`

296

297

``

297

298

`@Test

`

298

299

`public void testPostgreSQLDialectSupportsEmbeddedComments() {

`

299

``

`-

Assume.assumeTrue(dialect == Dialect.POSTGRESQL);

`

``

300

`+

assumeTrue(dialect == Dialect.POSTGRESQL);

`

300

301

``

301

302

`final String sql =

`

302

303

`"/* This is a comment /* This is an embedded comment */ This is after the embedded comment */ SELECT 1";

`

`@@ -305,7 +306,7 @@ public void testPostgreSQLDialectSupportsEmbeddedComments() {

`

305

306

``

306

307

`@Test

`

307

308

`public void testGoogleStandardSQLDialectDoesNotSupportEmbeddedComments() {

`

308

``

`-

Assume.assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

``

309

`+

assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

309

310

``

310

311

`final String sql =

`

311

312

`"/* This is a comment /* This is an embedded comment */ This is after the embedded comment */ SELECT 1";

`

`@@ -315,7 +316,7 @@ public void testGoogleStandardSQLDialectDoesNotSupportEmbeddedComments() {

`

315

316

``

316

317

`@Test

`

317

318

`public void testPostgreSQLDialectUnterminatedComment() {

`

318

``

`-

Assume.assumeTrue(dialect == Dialect.POSTGRESQL);

`

``

319

`+

assumeTrue(dialect == Dialect.POSTGRESQL);

`

319

320

``

320

321

`final String sql =

`

321

322

`"/* This is a comment /* This is still a comment */ this is unterminated SELECT 1";

`

`@@ -334,7 +335,7 @@ public void testPostgreSQLDialectUnterminatedComment() {

`

334

335

``

335

336

`@Test

`

336

337

`public void testGoogleStandardSqlDialectDialectUnterminatedComment() {

`

337

``

`-

Assume.assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

``

338

`+

assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

338

339

``

339

340

`final String sql =

`

340

341

`"/* This is a comment /* This is still a comment */ this is unterminated SELECT 1";

`

`@@ -360,7 +361,7 @@ public void testShowStatements() {

`

360

361

``

361

362

`@Test

`

362

363

`public void testGoogleStandardSQLDialectStatementWithHashTagSingleLineComment() {

`

363

``

`-

Assume.assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

``

364

`+

assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

364

365

``

365

366

`// Supports # based comments

`

366

367

`assertThat(

`

`@@ -382,7 +383,7 @@ public void testGoogleStandardSQLDialectStatementWithHashTagSingleLineComment()

`

382

383

``

383

384

`@Test

`

384

385

`public void testPostgreSQLDialectStatementWithHashTagSingleLineComment() {

`

385

``

`-

Assume.assumeTrue(dialect == Dialect.POSTGRESQL);

`

``

386

`+

assumeTrue(dialect == Dialect.POSTGRESQL);

`

386

387

``

387

388

`// Does not support # based comments

`

388

389

`assertThat(

`

`@@ -615,7 +616,7 @@ public void testIsQuery() {

`

615

616

``

616

617

`@Test

`

617

618

`public void testGoogleStandardSQLDialectIsQuery_QueryHints() {

`

618

``

`-

Assume.assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

``

619

`+

assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

619

620

``

620

621

`// Supports query hints, PostgreSQL dialect does NOT

`

621

622

`// Valid query hints.

`

`@@ -663,7 +664,7 @@ public void testGoogleStandardSQLDialectIsQuery_QueryHints() {

`

663

664

``

664

665

`@Test

`

665

666

`public void testIsUpdate_QueryHints() {

`

666

``

`-

Assume.assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

``

667

`+

assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

667

668

``

668

669

`// Supports query hints, PostgreSQL dialect does NOT

`

669

670

`// Valid query hints.

`

`@@ -1093,7 +1094,7 @@ public void testConvertPositionalParametersToNamedParametersWithGsqlException()

`

1093

1094

``

1094

1095

`@Test

`

1095

1096

`public void testGoogleStandardSQLDialectConvertPositionalParametersToNamedParameters() {

`

1096

``

`-

Assume.assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

``

1097

`+

assumeTrue(dialect == Dialect.GOOGLE_STANDARD_SQL);

`

1097

1098

``

1098

1099

`assertThat(

`

1099

1100

`parser.convertPositionalParametersToNamedParameters(

`

`@@ -1203,7 +1204,7 @@ public void testGoogleStandardSQLDialectConvertPositionalParametersToNamedParame

`

1203

1204

``

1204

1205

`@Test

`

1205

1206

`public void testPostgreSQLDialectDialectConvertPositionalParametersToNamedParameters() {

`

1206

``

`-

Assume.assumeTrue(dialect == Dialect.POSTGRESQL);

`

``

1207

`+

assumeTrue(dialect == Dialect.POSTGRESQL);

`

1207

1208

``

1208

1209

`assertThat(

`

1209

1210

`parser.convertPositionalParametersToNamedParameters(

`

`@@ -1318,6 +1319,25 @@ public void testPostgreSQLDialectDialectConvertPositionalParametersToNamedParame

`

1318

1319

` + "and col8 between 12and12 and 12and13")));

`

1319

1320

` }

`

1320

1321

``

``

1322

`+

@Test

`

``

1323

`+

public void testPostgreSQLGetQueryParameters() {

`

``

1324

`+

assumeTrue(dialect == Dialect.POSTGRESQL);

`

``

1325

+

``

1326

`+

PostgreSQLStatementParser parser = (PostgreSQLStatementParser) this.parser;

`

``

1327

`+

assertEquals(ImmutableSet.of(), parser.getQueryParameters("select * from foo"));

`

``

1328

`+

assertEquals(

`

``

1329

`+

ImmutableSet.of("$1"), parser.getQueryParameters("select * from foo where bar=$1"));

`

``

1330

`+

assertEquals(

`

``

1331

`+

ImmutableSet.of("$1", "$2", "$3"),

`

``

1332

`+

parser.getQueryParameters("select 2fromfoowherebar=2 from foo where bar=2fromfoowherebar=1 and baz=$3"));

`

``

1333

`+

assertEquals(

`

``

1334

`+

ImmutableSet.of("$1", "$3"),

`

``

1335

`+

parser.getQueryParameters("select '$2' from foo where bar=$1 and baz in ($1, $3)"));

`

``

1336

`+

assertEquals(

`

``

1337

`+

ImmutableSet.of("$1"),

`

``

1338

`+

parser.getQueryParameters("select '$2' from foo where bar=$1 and baz=$foo"));

`

``

1339

`+

}

`

``

1340

+

1321

1341

`private void assertUnclosedLiteral(String sql) {

`

1322

1342

`try {

`

1323

1343

`parser.convertPositionalParametersToNamedParameters('?', sql);

`