2020
2121import com .fasterxml .jackson .databind .JsonNode ;
2222import java .util .Collections ;
23+ import java .util .List ;
2324import java .util .Random ;
2425import java .util .concurrent .TimeUnit ;
2526import org .apache .pinot .broker .broker .AccessControlFactory ;
2627import org .apache .pinot .broker .broker .AllowAllAccessControlFactory ;
2728import org .apache .pinot .common .metrics .BrokerMetrics ;
2829import org .apache .pinot .common .response .broker .BrokerResponseNative ;
30+ import org .apache .pinot .common .response .broker .ResultTable ;
2931import org .apache .pinot .common .utils .DataSchema ;
3032import org .apache .pinot .spi .env .PinotConfiguration ;
3133import org .apache .pinot .spi .metrics .PinotMetricUtils ;
@@ -104,6 +106,22 @@ public void testLiteralOnlyTransformBrokerRequestFromSQL() {
104106 Assert .assertFalse (BaseBrokerRequestHandler .isLiteralOnlyQuery (CalciteSqlParser
105107 .compileToPinotQuery ("SELECT count(*) from foo "
106108 + "where bar = decodeUrl('key1%3Dvalue+1%26key2%3Dvalue%40%21%242%26key3%3Dvalue%253')" )));
109+ Assert .assertTrue (BaseBrokerRequestHandler .isLiteralOnlyQuery (CalciteSqlParser .compileToPinotQuery (
110+ "SELECT toUtf8('hello!')," + " fromUtf8(toUtf8('hello!')) FROM myTable" )));
111+ Assert .assertFalse (BaseBrokerRequestHandler .isLiteralOnlyQuery (CalciteSqlParser .compileToPinotQuery (
112+ "SELECT reverse(fromUtf8(foo))," + " toUtf8('hello!') FROM myTable" )));
113+ Assert .assertTrue (BaseBrokerRequestHandler .isLiteralOnlyQuery (CalciteSqlParser .compileToPinotQuery (
114+ "SELECT toBase64(toUtf8('hello!'))," + " fromBase64('aGVsbG8h') FROM myTable" )));
115+ Assert .assertFalse (BaseBrokerRequestHandler .isLiteralOnlyQuery (CalciteSqlParser .compileToPinotQuery (
116+ "SELECT reverse(toBase64(foo))," + " toBase64(fromBase64('aGVsbG8h')) FROM myTable" )));
117+ Assert .assertFalse (BaseBrokerRequestHandler .isLiteralOnlyQuery (
118+ CalciteSqlParser .compileToPinotQuery ("SELECT fromBase64(toBase64(to_utf8(foo))) FROM myTable" )));
119+ Assert .assertFalse (BaseBrokerRequestHandler .isLiteralOnlyQuery (
120+ CalciteSqlParser .compileToPinotQuery ("SELECT count(*) from foo " + "where bar = toBase64(toASCII('hello!'))" )));
121+ Assert .assertFalse (BaseBrokerRequestHandler .isLiteralOnlyQuery (
122+ CalciteSqlParser .compileToPinotQuery ("SELECT count(*) from foo " + "where bar = fromBase64('aGVsbG8h')" )));
123+ Assert .assertFalse (BaseBrokerRequestHandler .isLiteralOnlyQuery (CalciteSqlParser .compileToPinotQuery (
124+ "SELECT count(*) from foo " + "where bar = fromUtf8(fromBase64('aGVsbG8h'))" )));
107125 }
108126
109127 @ Test
@@ -115,6 +133,10 @@ public void testLiteralOnlyWithAsBrokerRequestFromSQL() {
115133 Assert .assertTrue (BaseBrokerRequestHandler .isLiteralOnlyQuery (CalciteSqlParser .compileToPinotQuery (
116134 "SELECT encodeUrl('key1=value 1&key2=value@!$2&key3=value%3') AS encoded, "
117135 + "decodeUrl('key1%3Dvalue+1%26key2%3Dvalue%40%21%242%26key3%3Dvalue%253') AS decoded" )));
136+ Assert .assertTrue (BaseBrokerRequestHandler .isLiteralOnlyQuery (CalciteSqlParser .compileToPinotQuery (
137+ "SELECT toUtf8('hello!') AS encoded, " + "fromUtf8(toUtf8('hello!')) AS decoded" )));
138+ Assert .assertTrue (BaseBrokerRequestHandler .isLiteralOnlyQuery (CalciteSqlParser .compileToPinotQuery (
139+ "SELECT toBase64(toUtf8('hello!')) AS encoded, " + "fromBase64('aGVsbG8h') AS decoded" )));
118140 }
119141
120142 @ Test
@@ -211,6 +233,76 @@ public void testBrokerRequestHandlerWithAsFunction()
211233 Assert .assertEquals (brokerResponse .getResultTable ().getRows ().get (0 )[1 ].toString (),
212234 "key1=value 1&key2=value@!$2&key3=value%3" );
213235 Assert .assertEquals (brokerResponse .getTotalDocs (), 0 );
236+
237+ request = JsonUtils .stringToJsonNode (
238+ "{\" sql\" :\" SELECT toBase64(toUtf8('hello!')) AS encoded, " + "fromUtf8(fromBase64('aGVsbG8h')) AS decoded\" }" );
239+ requestStats = Tracing .getTracer ().createRequestScope ();
240+ brokerResponse = requestHandler .handleRequest (request , null , requestStats );
241+ ResultTable resultTable = brokerResponse .getResultTable ();
242+ DataSchema dataSchema = resultTable .getDataSchema ();
243+ List <Object []> rows = resultTable .getRows ();
244+ Assert .assertEquals (dataSchema .getColumnName (0 ), "encoded" );
245+ Assert .assertEquals (dataSchema .getColumnDataType (0 ), DataSchema .ColumnDataType .STRING );
246+ Assert .assertEquals (dataSchema .getColumnName (1 ), "decoded" );
247+ Assert .assertEquals (dataSchema .getColumnDataType (1 ), DataSchema .ColumnDataType .STRING );
248+ Assert .assertEquals (rows .size (), 1 );
249+ Assert .assertEquals (rows .get (0 ).length , 2 );
250+ Assert .assertEquals (rows .get (0 )[0 ].toString (), "aGVsbG8h" );
251+ Assert .assertEquals (rows .get (0 )[1 ].toString (), "hello!" );
252+ Assert .assertEquals (brokerResponse .getTotalDocs (), 0 );
253+
254+ request = JsonUtils .stringToJsonNode (
255+ "{\" sql\" :\" SELECT fromUtf8(fromBase64(toBase64(toUtf8('nested')))) AS output\" }" );
256+ requestStats = Tracing .getTracer ().createRequestScope ();
257+ brokerResponse = requestHandler .handleRequest (request , null , requestStats );
258+ resultTable = brokerResponse .getResultTable ();
259+ dataSchema = resultTable .getDataSchema ();
260+ rows = resultTable .getRows ();
261+ Assert .assertEquals (dataSchema .getColumnName (0 ), "output" );
262+ Assert .assertEquals (dataSchema .getColumnDataType (0 ), DataSchema .ColumnDataType .STRING );
263+ Assert .assertEquals (rows .size (), 1 );
264+ Assert .assertEquals (rows .get (0 ).length , 1 );
265+ Assert .assertEquals (rows .get (0 )[0 ].toString (), "nested" );
266+ Assert .assertEquals (brokerResponse .getTotalDocs (), 0 );
267+
268+ request = JsonUtils .stringToJsonNode (
269+ "{\" sql\" :\" SELECT toBase64(toUtf8('this is a long string that will encode to more than 76 characters using "
270+ + "base64'))"
271+ + " AS encoded\" }" );
272+ requestStats = Tracing .getTracer ().createRequestScope ();
273+ brokerResponse = requestHandler .handleRequest (request , null , requestStats );
274+ resultTable = brokerResponse .getResultTable ();
275+ dataSchema = resultTable .getDataSchema ();
276+ rows = resultTable .getRows ();
277+ Assert .assertEquals (dataSchema .getColumnName (0 ), "encoded" );
278+ Assert .assertEquals (dataSchema .getColumnDataType (0 ), DataSchema .ColumnDataType .STRING );
279+ Assert .assertEquals (rows .size (), 1 );
280+ Assert .assertEquals (rows .get (0 ).length , 1 );
281+ Assert .assertEquals (rows .get (0 )[0 ].toString (),
282+ "dGhpcyBpcyBhIGxvbmcgc3RyaW5nIHRoYXQgd2lsbCBlbmNvZGUgdG8gbW9yZSB0aGFuIDc2IGNoYXJhY3RlcnMgdXNpbmcgYmFzZTY0" );
283+ Assert .assertEquals (brokerResponse .getTotalDocs (), 0 );
284+
285+ request = JsonUtils .stringToJsonNode ("{\" sql\" :\" SELECT fromUtf8(fromBase64"
286+ + "('dGhpcyBpcyBhIGxvbmcgc3RyaW5nIHRoYXQgd2lsbCBlbmNvZGUgdG8gbW9yZSB0aGFuIDc2IGNoYXJhY3RlcnMgdXNpbmcgYmFzZTY0"
287+ + "')) AS decoded\" }" );
288+ requestStats = Tracing .getTracer ().createRequestScope ();
289+ brokerResponse = requestHandler .handleRequest (request , null , requestStats );
290+ resultTable = brokerResponse .getResultTable ();
291+ dataSchema = resultTable .getDataSchema ();
292+ rows = resultTable .getRows ();
293+ Assert .assertEquals (dataSchema .getColumnName (0 ), "decoded" );
294+ Assert .assertEquals (dataSchema .getColumnDataType (0 ), DataSchema .ColumnDataType .STRING );
295+ Assert .assertEquals (rows .size (), 1 );
296+ Assert .assertEquals (rows .get (0 ).length , 1 );
297+ Assert .assertEquals (rows .get (0 )[0 ].toString (),
298+ "this is a long string that will encode to more than 76 characters using base64" );
299+ Assert .assertEquals (brokerResponse .getTotalDocs (), 0 );
300+
301+ request = JsonUtils .stringToJsonNode ("{\" sql\" :\" SELECT fromBase64" + "(0) AS decoded\" }" );
302+ requestStats = Tracing .getTracer ().createRequestScope ();
303+ brokerResponse = requestHandler .handleRequest (request , null , requestStats );
304+ Assert .assertTrue (
305+ brokerResponse .getProcessingExceptions ().get (0 ).getMessage ().contains ("IllegalArgumentException" ));
214306 }
215307
216308 /** Tests for EXPLAIN PLAN for literal only queries. */
0 commit comments