@Override public ParsedSql parse(String sql, StatementContext ctx) { return ParsedSql.builder().append(sql).build(); }
@Test public void testFactoryNamedParameters() { final List<String> names = Arrays.asList("a", "b", "c"); final String sql = "insert into test (a, b, c) values (?, ?, ?)"; final ParsedParameters parameters = ParsedParameters.named(names); final ParsedSql parsedSql = ParsedSql.of(sql, parameters); assertThat(parsedSql).isNotNull(); assertThat(parsedSql.getSql()).isEqualTo(sql); assertThat(parsedSql.getParameters().isPositional()).isFalse(); assertThat(parsedSql.getParameters().getParameterNames()).containsExactly("a", "b", "c"); }
/** * A static factory of {@link ParsedSql} instances. The statement * may contain only positional parameters * (the {@value #POSITIONAL_PARAM} character). If your SQL * code contains named parameters (for example variables preceded * by a colon) then you have to replace them with positional * parameters and specify the mapping in the * {@link ParsedParameters}. You cannot mix named and positional * parameters in one SQL statement. * * @param sql the SQL code containing only positional parameters * @param parameters the ordered list of named parameters, or positional parameters * @return New {@link ParsedSql} instance * @see ParsedParameters#positional(int) * @see ParsedParameters#named(List) */ public static ParsedSql of(String sql, ParsedParameters parameters) { return new ParsedSql(sql, parameters); }
@Test public void testBuilderWithNamedParameters() { final List<String> names = Arrays.asList("a", "b", "c"); final ParsedSql parsedSql = ParsedSql.builder() .append("insert into test (a, b, c) values (") .appendNamedParameter(names.get(0)) .append(", ") .appendNamedParameter(names.get(1)) .append(", ") .appendNamedParameter(names.get(2)) .append(")") .build(); assertThat(parsedSql).isNotNull(); assertThat(parsedSql.getSql()).isEqualTo("insert into test (a, b, c) values (?, ?, ?)"); assertThat(parsedSql.getParameters().isPositional()).isFalse(); assertThat(parsedSql.getParameters().getParameterNames()).containsExactly("a", "b", "c"); }
private String parseString(final String src) { return parser.parse(src, mock(StatementContext.class)).getSql(); }
.getSqlParser() .parse(renderedSql, ctx); String sql = parsedSql.getSql(); ctx.setParsedSql(parsedSql); ArgumentBinder.bind(parsedSql.getParameters(), getBinding(), stmt, ctx);
@Test public void testBuilderWithPositionalParameters() { final ParsedSql parsedSql = ParsedSql.builder() .append("insert into test (a, b, c) values (") .appendPositionalParameter() .append(", ") .appendPositionalParameter() .append(", ") .appendPositionalParameter() .append(")") .build(); assertThat(parsedSql).isNotNull(); assertThat(parsedSql.getSql()).isEqualTo("insert into test (a, b, c) values (?, ?, ?)"); assertThat(parsedSql.getParameters().isPositional()).isTrue(); assertThat(parsedSql.getParameters().getParameterNames()).containsOnly("?"); } }
@Test public void testOddCharacters() { ParsedSql parsed = parser.parse("~* #boo '#nope' _%&^& *@ #id", ctx); assertThat(parsed.getSql()).isEqualTo("~* ? '#nope' _%&^& *@ ?"); }
.getSqlParser() .parse(renderedSql, getContext()); String sql = parsedSql.getSql(); ParsedParameters parsedParameters = parsedSql.getParameters(); getContext().setParsedSql(parsedSql);
@Test public void testEscapedQuestionMark() { String sql = "SELECT '{\"a\":1, \"b\":2}'::jsonb ?? :key"; ParsedSql parsed = parser.parse(sql, ctx); assertThat(parsed).isEqualTo(ParsedSql.builder() .append("SELECT '{\"a\":1, \"b\":2}'::jsonb ?? ") .appendNamedParameter("key") .build()); } }
@Test public void testOddCharacters() { ParsedSql parsed = parser.parse("~* :boo ':nope' _%&^& *@ :id", ctx); assertThat(parsed.getSql()).isEqualTo("~* ? ':nope' _%&^& *@ ?"); }
.getSqlParser() .parse(renderedSql, getContext()); String sql = parsedSql.getSql(); ParsedParameters parsedParameters = parsedSql.getParameters(); getContext().setParsedSql(sql);
@Test public void testFactoryPositionalParameters() { final String sql = "insert into test (a, b, c) values (?, ?, ?)"; final ParsedParameters parameters = ParsedParameters.positional(3); final ParsedSql parsedSql = ParsedSql.of(sql, parameters); assertThat(parsedSql).isNotNull(); assertThat(parsedSql.getSql()).isEqualTo(sql); assertThat(parsedSql.getParameters().isPositional()).isTrue(); assertThat(parsedSql.getParameters().getParameterNames()).containsOnly("?"); }
/** * @return the finalized {@link ParsedSql} object. */ public ParsedSql build() { if (positional && named) { throw new UnableToExecuteStatementException( "Cannot mix named and positional parameters in a SQL statement: " + parameterNames); } ParsedParameters parameters = new ParsedParameters(positional, parameterNames); return new ParsedSql(sql.toString(), parameters); } }
@Test public void testEscapedQuestionMark() { String sql = "SELECT '{\"a\":1, \"b\":2}'::jsonb ?? #key"; ParsedSql parsed = parser.parse(sql, ctx); assertThat(parsed).isEqualTo(ParsedSql.builder() .append("SELECT '{\"a\":1, \"b\":2}'::jsonb ?? ") .appendNamedParameter("key") .build()); } }
@Test public void testNumbers() { ParsedSql parsed = parser.parse(":bo0 ':nope' _%&^& *@ :id", ctx); assertThat(parsed.getSql()).isEqualTo("? ':nope' _%&^& *@ ?"); }
.getSqlParser() .parse(renderedSql, getContext()); String sql = parsedSql.getSql(); ParsedParameters parsedParameters = parsedSql.getParameters(); getContext().setParsedSql(sql);
/** * @return the finalized {@link ParsedSql} object. */ public ParsedSql build() { if (positional && named) { throw new UnableToExecuteStatementException( "Cannot mix named and positional parameters in a SQL statement: " + parameterNames); } ParsedParameters parameters = new ParsedParameters(positional, parameterNames); return new ParsedSql(sql.toString(), parameters); } }
private ParsedSql internalParse(final String sql) { ParsedSql.Builder parsedSql = ParsedSql.builder(); HashStatementLexer lexer = new HashStatementLexer(new ANTLRStringStream(sql)); Token t = lexer.nextToken(); while (t.getType() != EOF) { switch (t.getType()) { case COMMENT: case LITERAL: case QUOTED_TEXT: case DOUBLE_QUOTED_TEXT: parsedSql.append(t.getText()); break; case NAMED_PARAM: parsedSql.appendNamedParameter(t.getText().substring(1)); break; case POSITIONAL_PARAM: parsedSql.appendPositionalParameter(); break; case ESCAPED_TEXT: parsedSql.append(t.getText().substring(1)); break; default: break; } t = lexer.nextToken(); } return parsedSql.build(); } }
@Test public void testBailsOutOnInvalidInput() { assertThatThrownBy(() -> parser.parse("select * from something\n where id = :\u0087\u008e\u0092\u0097\u009c", ctx).getSql()) .isInstanceOf(UnableToCreateStatementException.class); }