/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.engine.query; import org.hibernate.engine.query.spi.ParamLocationRecognizer; import org.hibernate.engine.query.spi.ParameterParser; import org.hibernate.engine.query.spi.ParameterParser.Recognizer; import org.hibernate.testing.TestForIssue; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * Unit tests of the ParameterParser class * * @author Steve Ebersole */ public class ParameterParserTest { @Test public void testEscapeCallRecognition() { assertTrue( ParameterParser.startsWithEscapeCallTemplate( "{ ? = call abc(?) }" ) ); assertFalse( ParameterParser.startsWithEscapeCallTemplate( "from User u where u.userName = ? and u.userType = 'call'" ) ); } @Test public void testQuotedTextInComment() { ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); ParameterParser.parse("-- 'This' should not fail the test.\n" + "SELECT column FROM Table WHERE column <> :param", recognizer); assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("param")); } @Test public void testContractionInComment() { ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); ParameterParser.parse("-- This shouldn't fail the test.\n" + "SELECT column FROM Table WHERE column <> :param", recognizer); assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("param")); } @Test public void testDoubleDashInCharLiteral() { ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); ParameterParser.parse("select coalesce(i.name, '--NONE--') as itname from Item i where i.intVal=? ",recognizer); assertEquals( 1, recognizer.getOrdinalParameterLocationList().size() ); } @Test public void testSlashStarInCharLiteral() { ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); ParameterParser.parse("select coalesce(i.name, '/*NONE') as itname from Item i where i.intVal=? ",recognizer); assertEquals( 1, recognizer.getOrdinalParameterLocationList().size() ); } @Test public void testApostropheInOracleAlias() { ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); ParameterParser.parse("SELECT column as \"Table's column\" FROM Table WHERE column <> :param", recognizer); assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("param")); } @Test @TestForIssue( jiraKey = "HHH-1237") public void testParseColonCharacterEscaped() { final StringBuilder captured = new StringBuilder(); Recognizer recognizer = new Recognizer() { @Override public void outParameter(int position) { fail(); } @Override public void ordinalParameter(int position) { fail(); } @Override public void namedParameter(String name, int position) { fail(); } @Override public void jpaPositionalParameter(String name, int position) { fail(); } @Override public void other(char character) { captured.append(character); } }; ParameterParser.parse("SELECT @a,(@a::=20) FROM tbl_name", recognizer); assertEquals("SELECT @a,(@a:=20) FROM tbl_name", captured.toString()); } @Test public void testParseNamedParameter() { ParamLocationRecognizer recognizer = new ParamLocationRecognizer(); ParameterParser.parse("from Stock s where s.stockCode = :stockCode and s.xyz = :pxyz", recognizer); assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("stockCode")); assertTrue(recognizer.getNamedParameterDescriptionMap().containsKey("pxyz")); assertEquals( 2, recognizer.getNamedParameterDescriptionMap().size() ); } }