From b989e95b307b06cce222d0d203e3a4587299432f Mon Sep 17 00:00:00 2001
From: Ariya Hidayat <ariya@metabase.com>
Date: Wed, 5 Jan 2022 08:31:30 -0800
Subject: [PATCH] Parser fuzzing: remove previous limitations which do not
 apply anymore (#19474)

The previous Chevrotain-based parser had a few limitations, which need
to be taken account by the expression generator for the fuzzer. With the
new recursive parser (PR #19335), these limitations are not necessary
anymore:

* leading decimal digit, e.g. `.25`
* nested negatives, e.g. `-- 3`
* nested boolean NOT, e.g. `NOT NOT X`
---
 frontend/test/metabase/lib/expressions/generator.js | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/frontend/test/metabase/lib/expressions/generator.js b/frontend/test/metabase/lib/expressions/generator.js
index b84a1bc51b6..9af68ac546f 100644
--- a/frontend/test/metabase/lib/expressions/generator.js
+++ b/frontend/test/metabase/lib/expressions/generator.js
@@ -12,7 +12,9 @@ export function generateExpression(seed, resultType, depth = 13) {
   const zero = () => 0;
   const one = () => 1;
   const integer = () => randomInt(1e6);
-  const float = () => String(integer()) + "." + String(integer());
+  const float1 = () => String(integer()) + ".";
+  const float2 = () => "." + String(integer());
+  const float3 = () => String(integer()) + "." + String(integer());
 
   const string = () => '"' + characters() + '"';
 
@@ -135,7 +137,7 @@ export function generateExpression(seed, resultType, depth = 13) {
 
   const numberLiteral = () => {
     const exp = () => randomItem(["", "-", "+"]) + randomInt(1e2);
-    const number = () => oneOf([zero, one, integer, float])(); // LIMITATION: no dangling decimal point, e.g. "3."
+    const number = () => oneOf([zero, one, integer, float1, float2, float3])();
     const sci = () => number() + randomItem(["e", "E"]) + exp();
     return {
       type: NODE.Literal,
@@ -153,12 +155,11 @@ export function generateExpression(seed, resultType, depth = 13) {
     };
   };
 
-  // LIMITATION: no negative on negative, e.g. "--4"
   const unaryMinus = () => {
     return {
       type: NODE.Unary,
       op: "-",
-      child: oneOf([numberLiteral])(),
+      child: numberExpression(),
     };
   };
 
@@ -233,12 +234,11 @@ export function generateExpression(seed, resultType, depth = 13) {
     return node;
   };
 
-  // LIMITATION: no NOT on NOT, e.g. "NOT NOT [HighlyRated]"
   const logicalNot = () => {
     return {
       type: NODE.Unary,
       op: "NOT ",
-      child: oneOf([field, comparison, logicalGroup])(),
+      child: booleanExpression(),
     };
   };
 
-- 
GitLab