[
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "",
    "afterCursor": "",
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT BAABO BOOAA BLARGH, ",
    "afterCursor": " FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestColumns": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT foo, bar, SELECT, ",
    "afterCursor": " FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestColumns": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT foo, baa baa baa baa, SELECT, ",
    "afterCursor": " FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestColumns": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest tables and databases",
    "beforeCursor": "SELECT * ",
    "afterCursor": "",
    "containsKeywords": [
      "FROM"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest tables and databases",
    "beforeCursor": "SELECT *\r\n",
    "afterCursor": "",
    "containsKeywords": [
      "FROM"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should not suggest anything",
    "beforeCursor": "SELECT u.",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT foo, bar ",
    "afterCursor": "",
    "containsKeywords": [
      "AS",
      "+",
      "FROM",
      "DIV"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT foo AS a, bar ",
    "afterCursor": "",
    "containsKeywords": [
      "AS",
      "+"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM testTableA tta, testTableB ",
    "afterCursor": "",
    "expectedResult": {
      "suggestJoins": {
        "prependJoin": true,
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableB"
              }
            ]
          }
        ]
      },
      "suggestFilters": {
        "prefix": "WHERE",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableA"
              }
            ],
            "alias": "tta"
          },
          {
            "identifierChain": [
              {
                "name": "testTableB"
              }
            ]
          }
        ]
      },
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableA"
              }
            ],
            "alias": "tta"
          },
          {
            "identifierChain": [
              {
                "name": "testTableB"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableA"
              }
            ],
            "alias": "tta"
          },
          {
            "identifierChain": [
              {
                "name": "testTableB"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "AS",
        "WHERE",
        "GROUP BY",
        "HAVING",
        "ORDER BY",
        "LIMIT",
        "UNION",
        "FULL JOIN",
        "FULL OUTER JOIN",
        "INNER JOIN",
        "JOIN",
        "LEFT JOIN",
        "LEFT OUTER JOIN",
        "RIGHT JOIN",
        "RIGHT OUTER JOIN"
      ],
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest databases or tables",
    "beforeCursor": "SELECT * fr",
    "afterCursor": "",
    "containsKeywords": [
      "FROM"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should not report errors",
    "beforeCursor": "SELECT 4 / 2; ",
    "afterCursor": "",
    "noErrors": true,
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should not report errors",
    "beforeCursor": "SELECT 4 DIV 2; ",
    "afterCursor": "",
    "noErrors": true,
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should not report errors",
    "beforeCursor": "SELECT bla NOT RLIKE 'ble', ble NOT REGEXP 'b' FROM tbl; ",
    "afterCursor": "",
    "noErrors": true,
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should not report errors",
    "beforeCursor": "SELECT * FROM tbl limit ${limit=20}; ",
    "afterCursor": "",
    "noErrors": true,
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT IF(baa, boo, bee) AS b, ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "*",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestAnalyticFunctions": true,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT IF(baa > 2, boo, bee) AS b, ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "*",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestAnalyticFunctions": true,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should not report errors",
    "beforeCursor": "select testUdf(not id), cos(-1), sin(1+id) from autocomp_test;",
    "afterCursor": "",
    "noErrors": true,
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 62
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 43
          }
        },
        {
          "type": "function",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 14
          },
          "function": "testudf"
        },
        {
          "type": "functionArgument",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 16,
            "last_column": 22
          },
          "function": "testudf",
          "argumentPosition": 0,
          "identifierChain": [
            {
              "name": "testUdf"
            }
          ],
          "expression": {
            "types": [
              "BOOLEAN"
            ],
            "text": "not id"
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 20,
            "last_column": 22
          },
          "identifierChain": [
            {
              "name": "id"
            }
          ],
          "qualified": false,
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "autocomp_test"
                }
              ]
            }
          ]
        },
        {
          "type": "function",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 25,
            "last_column": 27
          },
          "function": "cos"
        },
        {
          "type": "functionArgument",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 29,
            "last_column": 31
          },
          "function": "cos",
          "argumentPosition": 0,
          "identifierChain": [
            {
              "name": "cos"
            }
          ],
          "expression": {
            "types": [
              "NUMBER"
            ],
            "text": "- 1"
          }
        },
        {
          "type": "function",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 34,
            "last_column": 36
          },
          "function": "sin"
        },
        {
          "type": "functionArgument",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 38,
            "last_column": 42
          },
          "function": "sin",
          "argumentPosition": 0,
          "identifierChain": [
            {
              "name": "sin"
            }
          ],
          "expression": {
            "types": [
              "NUMBER"
            ],
            "text": "1 + id"
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 40,
            "last_column": 42
          },
          "identifierChain": [
            {
              "name": "id"
            }
          ],
          "qualified": false,
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "autocomp_test"
                }
              ]
            }
          ]
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 49,
            "last_column": 62
          },
          "identifierChain": [
            {
              "name": "autocomp_test"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 62,
            "last_column": 62
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 62,
            "last_column": 62
          }
        }
      ],
      "lowerCase": true
    }
  },
  {
    "namePrefix": "should not report errors",
    "beforeCursor": "select count(*), tst.count, avg (id), avg from autocomp_test tst;",
    "afterCursor": "",
    "noErrors": true,
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 65
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 42
          }
        },
        {
          "type": "function",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 12
          },
          "function": "count"
        },
        {
          "type": "functionArgument",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 14,
            "last_column": 15
          },
          "function": "count",
          "argumentPosition": 0,
          "identifierChain": [
            {
              "name": "count"
            }
          ],
          "expression": {
            "text": "*"
          }
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 18,
            "last_column": 21
          },
          "identifierChain": [
            {
              "name": "autocomp_test"
            }
          ]
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 22,
            "last_column": 27
          },
          "identifierChain": [
            {
              "name": "count"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "autocomp_test"
                }
              ],
              "alias": "tst"
            }
          ],
          "qualified": true
        },
        {
          "type": "function",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 29,
            "last_column": 32
          },
          "function": "avg"
        },
        {
          "type": "functionArgument",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 34,
            "last_column": 36
          },
          "function": "avg",
          "argumentPosition": 0,
          "identifierChain": [
            {
              "name": "avg"
            }
          ],
          "expression": {
            "types": [
              "COLREF"
            ],
            "columnReference": [
              {
                "name": "id"
              }
            ]
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 34,
            "last_column": 36
          },
          "identifierChain": [
            {
              "name": "id"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "autocomp_test"
                }
              ],
              "alias": "tst"
            }
          ],
          "qualified": false
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 39,
            "last_column": 42
          },
          "identifierChain": [
            {
              "name": "avg"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "autocomp_test"
                }
              ],
              "alias": "tst"
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 48,
            "last_column": 61
          },
          "identifierChain": [
            {
              "name": "autocomp_test"
            }
          ]
        },
        {
          "type": "alias",
          "source": "table",
          "alias": "tst",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 62,
            "last_column": 65
          },
          "identifierChain": [
            {
              "name": "autocomp_test"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 65,
            "last_column": 65
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 65,
            "last_column": 65
          }
        }
      ],
      "lowerCase": true
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT ",
    "afterCursor": "",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT ",
    "afterCursor": ";\n\nSELECT * FROM foo;",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT * FROM foo;\n\nSELECT ",
    "afterCursor": ";",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT ",
    "afterCursor": ";\n\nSELECT * FROM foo boo;",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT * FROM foo boo;\n\nSELECT ",
    "afterCursor": ";",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest lowerCase",
    "beforeCursor": "select ",
    "afterCursor": "",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": true,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT ALL ",
    "afterCursor": "",
    "containsKeywords": [
      "*",
      "CASE"
    ],
    "doesNotContainKeywords": [
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT DISTINCT ",
    "afterCursor": "",
    "containsKeywords": [
      "*"
    ],
    "doesNotContainKeywords": [
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT DISTINCT ",
    "afterCursor": " a, b, c FROM tbl",
    "containsKeywords": [
      "*"
    ],
    "doesNotContainKeywords": [
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tbl"
              }
            ]
          }
        ]
      },
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 34
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 15,
            "last_column": 25
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 18,
            "last_column": 19
          },
          "identifierChain": [
            {
              "name": "a"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "tbl"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 21,
            "last_column": 22
          },
          "identifierChain": [
            {
              "name": "b"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "tbl"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 24,
            "last_column": 25
          },
          "identifierChain": [
            {
              "name": "c"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "tbl"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 31,
            "last_column": 34
          },
          "identifierChain": [
            {
              "name": "tbl"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 34,
            "last_column": 34
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 34,
            "last_column": 34
          }
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM tableA;",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT ",
    "afterCursor": " AS boo FROM tableA;",
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT ",
    "afterCursor": " boo FROM tableA;",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT bla",
    "afterCursor": " AS boo FROM tableA;",
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM testWHERE",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testWHERE"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testWHERE"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT (bl",
    "afterCursor": " AND boo FROM testWHERE",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testWHERE"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT (bla",
    "afterCursor": " AND boo FROM testWHERE",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testWHERE"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM testON",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testON"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testON"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM transactions",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "transactions"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "transactions"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest aliases",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM testTableA tta, testTableB",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableA"
              }
            ],
            "alias": "tta"
          },
          {
            "identifierChain": [
              {
                "name": "testTableB"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableA"
              }
            ],
            "alias": "tta"
          },
          {
            "identifierChain": [
              {
                "name": "testTableB"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "tta.",
          "type": "alias"
        },
        {
          "name": "testTableB.",
          "type": "table"
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT TTA.",
    "afterCursor": " FROM testTableA tta",
    "containsKeywords": [
      "*"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableA"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT tta.",
    "afterCursor": " FROM testTableA TTA",
    "containsKeywords": [
      "*"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableA"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM db.tbl1, db.tbl2",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "db"
              },
              {
                "name": "tbl1"
              }
            ]
          },
          {
            "identifierChain": [
              {
                "name": "db"
              },
              {
                "name": "tbl2"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "db"
              },
              {
                "name": "tbl1"
              }
            ]
          },
          {
            "identifierChain": [
              {
                "name": "db"
              },
              {
                "name": "tbl2"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "tbl1.",
          "type": "table"
        },
        {
          "name": "tbl2.",
          "type": "table"
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "select ",
    "afterCursor": " from database_two.testTable",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": true,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "database_two"
              },
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "database_two"
              },
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "select ",
    "afterCursor": " from `database one`.`test table`",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": true,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "database one"
              },
              {
                "name": "test table"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "database one"
              },
              {
                "name": "test table"
              }
            ]
          }
        ]
      },
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 41
          }
        },
        {
          "type": "selectList",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 7,
            "last_column": 7
          }
        },
        {
          "type": "database",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 14,
            "last_column": 28
          },
          "identifierChain": [
            {
              "name": "database one"
            }
          ]
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 29,
            "last_column": 41
          },
          "identifierChain": [
            {
              "name": "database one"
            },
            {
              "name": "test table"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 41,
            "last_column": 41
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 41,
            "last_column": 41
          }
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, ",
    "afterCursor": " FROM tableA;",
    "containsKeywords": [
      "*",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a,",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "*",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT *, ",
    "afterCursor": " FROM tableA;",
    "containsKeywords": [
      "*",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableA"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT a ",
    "afterCursor": " FROM tableA;",
    "containsKeywords": [
      "AS",
      "="
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "tableA"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT a ",
    "afterCursor": ", FROM tableA;",
    "containsKeywords": [
      "AS",
      "="
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "tableA"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT a, b ",
    "afterCursor": " FROM tableA;",
    "containsKeywords": [
      "AS",
      "="
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "tableA"
          },
          {
            "name": "b"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT a ",
    "afterCursor": ", b, c AS foo, d FROM tableA;",
    "containsKeywords": [
      "AS",
      "="
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "tableA"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ",
    "afterCursor": " a, cast(b as int), c, d FROM testTable WHERE a = 'US' AND b >= 998 ORDER BY c DESC LIMIT 15",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, ",
    "afterCursor": ",c, d FROM testTable WHERE a = 'US' AND b >= 998 ORDER BY c DESC LIMIT 15",
    "containsKeywords": [
      "*",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 87
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 22
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 9
          },
          "identifierChain": [
            {
              "name": "a"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "testTable"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 11,
            "last_column": 12
          },
          "identifierChain": [
            {
              "name": "b"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "testTable"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 15,
            "last_column": 16
          },
          "identifierChain": [
            {
              "name": "c"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "testTable"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 18,
            "last_column": 19
          },
          "identifierChain": [
            {
              "name": "d"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "testTable"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 25,
            "last_column": 34
          },
          "identifierChain": [
            {
              "name": "testTable"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 35,
            "last_column": 62
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 41,
            "last_column": 42
          },
          "identifierChain": [
            {
              "name": "a"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "testTable"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 54,
            "last_column": 55
          },
          "identifierChain": [
            {
              "name": "b"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "testTable"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 72,
            "last_column": 73
          },
          "identifierChain": [
            {
              "name": "c"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "testTable"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "limitClause",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 79,
            "last_column": 87
          }
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM ${some_variable};",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "${some_variable}"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "${some_variable}"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM testTable WHERE ${some_variable} ",
    "afterCursor": "",
    "containsKeywords": [
      "<",
      "BETWEEN"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "${some_variable}"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE ${some_variable} + 1 = ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE",
      "NULL"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should not report errors",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a) FROM testTable;",
    "afterCursor": "",
    "noErrors": true,
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should not report errors",
    "beforeCursor": "SELECT COUNT(DISTINCT a) OVER (PARTITION by c) FROM testTable;",
    "afterCursor": "",
    "noErrors": true,
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest analytical functions",
    "beforeCursor": "SELECT ",
    "afterCursor": "",
    "containsKeywords": [
      "*"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() ",
    "afterCursor": "",
    "containsKeywords": [
      "OVER"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "OVER"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() ",
    "afterCursor": ", b, c FROM testTable",
    "containsKeywords": [
      "OVER"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT count(DISTINCT a) ",
    "afterCursor": "",
    "containsKeywords": [
      "OVER"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT count(DISTINCT a) ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "OVER"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT count(DISTINCT a) ",
    "afterCursor": ", b, c FROM testTable",
    "containsKeywords": [
      "OVER"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER ( ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "PARTITION BY"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "BY"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a, b ORDER ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "BY"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT row_number() OVER (ORDER BY ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT row_number() OVER (ORDER BY ",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT row_number() OVER (ORDER BY a ",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "ASC",
      "DESC"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a, ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ",
    "afterCursor": "",
    "containsKeywords": [
      "ASC",
      "ROWS BETWEEN",
      "RANGE BETWEEN"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "CURRENT ROW",
        "UNBOUNDED PRECEDING"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN 1 ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "PRECEDING"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN UNBOUNDED ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "PRECEDING"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN CURRENT ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "ROW"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN 1 PRECEDING ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "AND"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "AND"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN CURRENT ROW ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "AND"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN 1 PRECEDING AND ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "CURRENT ROW",
        "UNBOUNDED FOLLOWING"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "CURRENT ROW",
        "UNBOUNDED FOLLOWING"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN CURRENT ROW AND ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "CURRENT ROW",
        "UNBOUNDED FOLLOWING"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN 1 PRECEDING AND CURRENT ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "ROW"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "FOLLOWING"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT row_number() OVER (PARTITION BY a ORDER BY b ROWS BETWEEN CURRENT ROW AND 1 ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "FOLLOWING"
      ]
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT COUNT(*) ",
    "afterCursor": "",
    "containsKeywords": [
      "AS",
      "+"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestTables": {
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT COUNT(foo ",
    "afterCursor": "",
    "containsKeywords": [
      "AND",
      "="
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT COUNT(foo, ",
    "afterCursor": ") FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT COUNT(foo, bl",
    "afterCursor": ",bla) FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT COUNT(foo ",
    "afterCursor": ", bar)",
    "containsKeywords": [
      "AND",
      "="
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns and values",
    "beforeCursor": "SELECT COUNT(foo, bl = ",
    "afterCursor": ",bla) FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "hasErrors": false,
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      },
      "suggestValues": {},
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bl"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns and values",
    "beforeCursor": "SELECT bl = '",
    "afterCursor": " FROM bar;",
    "hasErrors": false,
    "expectedResult": {
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 23
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 15
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 10
          },
          "identifierChain": [
            {
              "name": "bl"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "bar"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 20,
            "last_column": 23
          },
          "identifierChain": [
            {
              "name": "bar"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 23,
            "last_column": 23
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 23,
            "last_column": 23
          }
        }
      ],
      "lowerCase": false,
      "suggestValues": {
        "partialQuote": "'",
        "missingEndQuote": true
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bl"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns and values",
    "beforeCursor": "SELECT bl = '",
    "afterCursor": "' FROM bar;",
    "hasErrors": false,
    "expectedResult": {
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 24
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 16
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 10
          },
          "identifierChain": [
            {
              "name": "bl"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "bar"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 21,
            "last_column": 24
          },
          "identifierChain": [
            {
              "name": "bar"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 24,
            "last_column": 24
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 24,
            "last_column": 24
          }
        }
      ],
      "lowerCase": false,
      "suggestValues": {
        "partialQuote": "'",
        "missingEndQuote": false
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bl"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns and values",
    "beforeCursor": "SELECT bl = 'bl",
    "afterCursor": " bl' FROM bar;",
    "hasErrors": false,
    "expectedResult": {
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 29
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 19
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 10
          },
          "identifierChain": [
            {
              "name": "bl"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "bar"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 26,
            "last_column": 29
          },
          "identifierChain": [
            {
              "name": "bar"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 29,
            "last_column": 29
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 29,
            "last_column": 29
          }
        }
      ],
      "lowerCase": false,
      "suggestValues": {
        "partialQuote": "'",
        "missingEndQuote": false
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bl"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns and values",
    "beforeCursor": "SELECT bl = \"",
    "afterCursor": " FROM bar;",
    "hasErrors": false,
    "expectedResult": {
      "lowerCase": false,
      "suggestValues": {
        "partialQuote": "\"",
        "missingEndQuote": true
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bl"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns and values",
    "beforeCursor": "SELECT bl = \"",
    "afterCursor": "\" FROM bar;",
    "hasErrors": false,
    "expectedResult": {
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 24
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 16
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 10
          },
          "identifierChain": [
            {
              "name": "bl"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "bar"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 21,
            "last_column": 24
          },
          "identifierChain": [
            {
              "name": "bar"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 24,
            "last_column": 24
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 24,
            "last_column": 24
          }
        }
      ],
      "lowerCase": false,
      "suggestValues": {
        "partialQuote": "\"",
        "missingEndQuote": false
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bl"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns and values",
    "beforeCursor": "SELECT bl = \"bl",
    "afterCursor": " bl\" FROM bar;",
    "hasErrors": false,
    "expectedResult": {
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 29
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 19
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 10
          },
          "identifierChain": [
            {
              "name": "bl"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "bar"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 26,
            "last_column": 29
          },
          "identifierChain": [
            {
              "name": "bar"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 29,
            "last_column": 29
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 29,
            "last_column": 29
          }
        }
      ],
      "lowerCase": false,
      "suggestValues": {
        "partialQuote": "\"",
        "missingEndQuote": false
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bl"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest functions",
    "beforeCursor": "SELECT CAST(",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {}
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CAST(",
    "afterCursor": " FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CAST(bla",
    "afterCursor": " FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CAST(",
    "afterCursor": " AS FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CAST(",
    "afterCursor": " AS INT FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CAST(",
    "afterCursor": " AS STRING) FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CAST(bla",
    "afterCursor": " AS STRING) FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CAST(bla ",
    "afterCursor": "",
    "containsKeywords": [
      "AS",
      "AND"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CAST(bla ",
    "afterCursor": " FROM bar;",
    "containsKeywords": [
      "AS",
      "="
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bla"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "select cast(bla as ",
    "afterCursor": "",
    "containsKeywords": [
      "INT",
      "STRING"
    ],
    "expectedResult": {
      "lowerCase": true
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CAST(bla AS ",
    "afterCursor": " FROM bar;",
    "containsKeywords": [
      "INT",
      "STRING"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CAST(bla AS ST",
    "afterCursor": ") FROM bar;",
    "containsKeywords": [
      "INT",
      "STRING"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CAST(AS ",
    "afterCursor": "",
    "containsKeywords": [
      "INT",
      "STRING"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should not report errors for",
    "beforeCursor": "SELECT db.customUdf(col) FROM bar;",
    "afterCursor": "",
    "containsKeywords": [
      "SELECT"
    ],
    "noErrors": true,
    "expectedResult": {
      "lowerCase": false,
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 34
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 25
          }
        },
        {
          "type": "database",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 10
          },
          "identifierChain": [
            {
              "name": "db"
            }
          ]
        },
        {
          "type": "function",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 11,
            "last_column": 19
          },
          "identifierChain": [
            {
              "name": "db"
            },
            {
              "name": "customUdf"
            }
          ],
          "function": "customudf"
        },
        {
          "type": "functionArgument",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 21,
            "last_column": 24
          },
          "function": "customudf",
          "argumentPosition": 0,
          "identifierChain": [
            {
              "name": "db"
            },
            {
              "name": "customUdf"
            }
          ],
          "expression": {
            "types": [
              "COLREF"
            ],
            "columnReference": [
              {
                "name": "col"
              }
            ]
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 21,
            "last_column": 24
          },
          "identifierChain": [
            {
              "name": "col"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "bar"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 31,
            "last_column": 34
          },
          "identifierChain": [
            {
              "name": "bar"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 34,
            "last_column": 34
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 34,
            "last_column": 34
          }
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT db.customUdf(",
    "afterCursor": " FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "customudf",
        "position": 1
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT db.customUdf(1, ",
    "afterCursor": " FROM bar;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "customudf",
        "position": 2
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT AVG(",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "DISTINCT",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "avg",
        "position": 1
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT COUNT(",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "*",
      "DISTINCT",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT STDDEV_POP(",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "DISTINCT",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "stddev_pop",
        "position": 1
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT STDDEV_SAMP(",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "DISTINCT",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "stddev_samp",
        "position": 1
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT SUM(",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "DISTINCT",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "sum",
        "position": 1
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT MAX(",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "DISTINCT",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "max",
        "position": 1
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT MIN(",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "DISTINCT",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "min",
        "position": 1
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT VAR_POP(",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "DISTINCT",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "var_pop",
        "position": 1
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT var_samp(",
    "afterCursor": ") FROM testTable",
    "containsKeywords": [
      "DISTINCT",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "var_samp",
        "position": 1
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT id, SUM(a * ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE ",
    "afterCursor": " FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "WHEN"
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN a = b AND ",
    "afterCursor": " THEN FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a = b AND ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CASE a = b ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "WHEN",
      "AND",
      "<>"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN a = b OR ",
    "afterCursor": " THEN boo FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN a = b OR c THEN boo OR ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a =",
    "afterCursor": " WHEN c THEN d END FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestValues": {},
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a =",
    "afterCursor": " WHEN c THEN d ELSE e END FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestValues": {},
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a = c WHEN c THEN d ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "END",
      "<>"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a = c WHEN c THEN d=",
    "afterCursor": " ELSE FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestValues": {},
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CASE a = c WHEN c THEN d=1 ",
    "afterCursor": " bla=foo FROM testTable",
    "containsKeywords": [
      "AND",
      "WHEN",
      "ELSE",
      "END",
      "<"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CASE a = c WHEN c THEN d=1 ",
    "afterCursor": " bla=foo FROM testTable",
    "containsKeywords": [
      "AND",
      "WHEN",
      "ELSE",
      ">"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a = c WHEN c THEN d ELSE ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a = c WHEN c THEN d ELSE e AND ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE ELSE ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE ",
    "afterCursor": " ELSE a FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "WHEN"
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE ",
    "afterCursor": " ELSE FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "WHEN"
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a = c WHEN c THEN d ELSE e ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "END",
      "="
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "e"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN THEN boo OR ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CASE ",
    "afterCursor": " a = b THEN FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "WHEN"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CASE ",
    "afterCursor": " a = b THEN boo FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "WHEN"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CASE ",
    "afterCursor": " THEN boo FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "WHEN"
      ],
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN ",
    "afterCursor": " boo FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "THEN"
      ],
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN bla",
    "afterCursor": " boo WHEN b THEN c END FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "THEN"
      ],
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a WHEN b THEN c WHEN ",
    "afterCursor": " boo ELSE c FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "THEN"
      ],
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a WHEN b THEN c WHEN ",
    "afterCursor": " boo WHEN d THEN e END FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "THEN"
      ],
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CASE a WHEN b THEN c ",
    "afterCursor": " WHEN d THEN e END FROM testTable",
    "containsKeywords": [
      "WHEN",
      "<"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "c"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT CASE a WHEN b THEN c ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "WHEN",
      ">"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "c"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN ",
    "afterCursor": " THEN FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values",
    "beforeCursor": "SELECT CASE WHEN ",
    "afterCursor": " = a FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestValues": {},
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN ab",
    "afterCursor": " THEN bla ELSE foo FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE bla WHEN ab",
    "afterCursor": " THEN bla ELSE foo END FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a WHEN ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN a = ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestValues": {},
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN a = b ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "AND",
      "THEN",
      "<"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a = c WHEN c ",
    "afterCursor": " d FROM testTable",
    "containsKeywords": [
      "THEN",
      ">"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "c"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a = c WHEN c THEN ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE a = c WHEN c THEN ",
    "afterCursor": " g FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN THEN ",
    "afterCursor": " g FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT CASE WHEN THEN ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest functions for",
    "beforeCursor": "SELECT 'boo \\' baa' = ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "STRING"
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest functions",
    "beforeCursor": "SELECT \"boo \\\" baa\" = ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "STRING"
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest identifiers",
    "beforeCursor": "SELECT 1 = ",
    "afterCursor": " OR false FROM tableOne boo, tableTwo baa;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableOne"
              }
            ],
            "alias": "boo"
          },
          {
            "identifierChain": [
              {
                "name": "tableTwo"
              }
            ],
            "alias": "baa"
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "boo.",
          "type": "alias"
        },
        {
          "name": "baa.",
          "type": "alias"
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM tbl1, tbl2 atbl2, tbl3 WHERE id = atbl2.",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestColumns": {
        "source": "where",
        "types": [
          "T"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tbl2"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM tbl1, tbl2 atbl2, tbl3 WHERE id = atbl2.",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestColumns": {
        "source": "where",
        "types": [
          "T"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tbl2"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values",
    "beforeCursor": "SELECT * FROM testTable WHERE id =",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "id"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE -",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT -",
    "afterCursor": " FROM testTable WHERE id = 1;",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT 1 < ",
    "afterCursor": " FROM testTable WHERE id = 1;",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "select foo from tbl where ",
    "afterCursor": " % 2 = 0",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": true,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tbl"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values",
    "beforeCursor": "SELECT * FROM testTable WHERE -id = ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "id"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT greatest(1, 2, a, 4, ",
    "afterCursor": " FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "greatest",
        "position": 5
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT greatest(1, ",
    "afterCursor": ", a, 4) FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "udfArgument": {
        "name": "greatest",
        "position": 2
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ",
    "afterCursor": " > id FROM testTable",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestColumns": {
        "source": "select",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestValues": {},
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "id"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values and columns",
    "beforeCursor": "SELECT * FROM testTable WHERE ",
    "afterCursor": " = id",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "id"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values and columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d >= ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values and columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d < ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values and columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d <= ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values and columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d <=> ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values and columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d <> ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values and columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d >= ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values and columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d > ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values and columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d != ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d + 1 != ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE bla",
    "afterCursor": " + 1 != 3",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d + ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d - ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d * ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d / ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d % ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d | ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d & ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d ^ ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE ~",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE -",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "NUMBER"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, c FROM testTable WHERE d ",
    "afterCursor": " RLIKE 'bla bla'",
    "containsKeywords": [
      "<",
      "IN"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "d"
          }
        ]
      },
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT bar FROM foo WHERE id = 1 ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "GROUP BY",
        "HAVING",
        "ORDER BY",
        "LIMIT",
        "UNION",
        "<",
        "<=",
        "<=>",
        "<>",
        "=",
        ">",
        ">=",
        "AND",
        "BETWEEN",
        "IN",
        "IS FALSE",
        "IS NOT FALSE",
        "IS NOT NULL",
        "IS NOT TRUE",
        "IS NULL",
        "IS TRUE",
        "NOT BETWEEN",
        "NOT IN",
        "OR"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE id <=> 1 ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "GROUP BY",
        "HAVING",
        "ORDER BY",
        "LIMIT",
        "UNION",
        "<",
        "<=",
        "<=>",
        "<>",
        "=",
        ">",
        ">=",
        "AND",
        "BETWEEN",
        "IN",
        "IS FALSE",
        "IS NOT FALSE",
        "IS NOT NULL",
        "IS NOT TRUE",
        "IS NULL",
        "IS TRUE",
        "NOT BETWEEN",
        "NOT IN",
        "OR"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE id IS ",
    "afterCursor": "",
    "containsKeywords": [
      "NOT NULL",
      "NULL",
      "NOT TRUE",
      "TRUE",
      "NOT FALSE",
      "FALSE"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE id IS NOT ",
    "afterCursor": "",
    "containsKeywords": [
      "NULL",
      "FALSE",
      "TRUE"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE id IS ",
    "afterCursor": " NULL",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "NOT"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE id IS ",
    "afterCursor": " FALSE",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "NOT"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE id IS ",
    "afterCursor": " TRUE",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "NOT"
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM foo WHERE id LIKE ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "STRING"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "STRING"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE id LIKE ('bla bla') ",
    "afterCursor": "",
    "containsKeywords": [
      "AND"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest identifiers",
    "beforeCursor": "SELECT * FROM foo bla, bar WHERE id IS NULL AND ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bla"
          },
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      },
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bla"
          },
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "bla.",
          "type": "alias"
        },
        {
          "name": "bar.",
          "type": "table"
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM foo AS bla WHERE id IS NULL && ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bla"
          }
        ]
      },
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bla"
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "bla.",
          "type": "alias"
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM foo AS bla WHERE id IS NULL OR ",
    "afterCursor": " AND 1 + 1 > 1",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bla"
          }
        ]
      },
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bla"
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "bla.",
          "type": "alias"
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM foo AS bla WHERE id IS NULL || ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bla"
          }
        ]
      },
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bla"
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "bla.",
          "type": "alias"
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM foo bar WHERE NOT ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bar"
          }
        ]
      },
      "suggestKeywords": [
        "EXISTS"
      ],
      "suggestIdentifiers": [
        {
          "name": "bar.",
          "type": "alias"
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM foo bar WHERE ! ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "BOOLEAN"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "BOOLEAN"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ],
            "alias": "bar"
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "bar.",
          "type": "alias"
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "EXISTS",
        "NOT EXISTS"
      ],
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE a",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "EXISTS",
        "NOT EXISTS"
      ],
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE baa = 1 AND ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE",
      "EXISTS",
      "NOT",
      "NULL"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestFunctions": {},
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE ",
    "afterCursor": " AND baa = 1",
    "containsKeywords": [
      "CASE",
      "EXISTS",
      "NOT",
      "NULL"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestFunctions": {},
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE baa = 1 OR ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE",
      "EXISTS",
      "NOT",
      "NULL"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestFunctions": {},
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE ",
    "afterCursor": " OR baa = 1",
    "containsKeywords": [
      "CASE",
      "EXISTS",
      "NOT",
      "NULL"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestFunctions": {},
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM testTable WHERE NOT ",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "EXISTS"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM testTable WHERE foo = 'bar' ",
    "afterCursor": "",
    "containsKeywords": [
      "AND",
      "<"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT a, b, c, d, e FROM tableOne WHERE c >= 9998 an",
    "afterCursor": "",
    "containsKeywords": [
      "AND",
      "="
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableOne"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableOne"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE foo = 'bar' AND ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestFilters": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestColumns": {
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a, b, \nc,\nd, ",
    "afterCursor": "\ng,\nf\nFROM testTable WHERE a > 1 AND b = 'b' ORDER BY c;",
    "containsKeywords": [
      "*",
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT a,b, ",
    "afterCursor": " c FROM testTable",
    "containsKeywords": [
      "*"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ",
    "afterCursor": " a, b, c FROM testTable",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {},
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT a ",
    "afterCursor": ", b, c FROM testTable",
    "containsKeywords": [
      "AS",
      ">"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM testTable WHERE ",
    "afterCursor": " = 'bar' AND ",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "STRING"
        ]
      },
      "suggestColumns": {
        "source": "where",
        "types": [
          "STRING"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM testTable WHERE a ",
    "afterCursor": "",
    "containsKeywords": [
      "BETWEEN",
      "NOT BETWEEN"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "a"
          }
        ]
      },
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM testTable WHERE a NOT ",
    "afterCursor": "",
    "containsKeywords": [
      "BETWEEN",
      "EXISTS",
      "IN",
      "LIKE"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest values",
    "beforeCursor": "SELECT * FROM testTable WHERE a BETWEEN ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM testTable WHERE a OR NOT EXISTS (",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "SELECT"
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT testTable.",
    "afterCursor": " FROM testTable",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "*"
      ],
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT tt.",
    "afterCursor": " FROM testTable tt",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "*"
      ],
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT tt.",
    "afterCursor": " FROM database_two.testTable tt",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "*"
      ],
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "database_two"
              },
              {
                "name": "testTable"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT tta.",
    "afterCursor": " FROM testTableA tta, testTableB ttb",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "*"
      ],
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableA"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ttb.",
    "afterCursor": " FROM testTableA tta, testTableB ttb",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "*"
      ],
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTableB"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM testTable GROUP BY a ",
    "afterCursor": " LIMIT 10",
    "doesNotContainKeywords": [
      "LIMIT"
    ],
    "containsKeywords": [
      "ORDER BY"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "testTable"
          },
          {
            "name": "a"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE bar ",
    "afterCursor": "",
    "containsKeywords": [
      "IN",
      "NOT IN"
    ],
    "containsColRefKeywords": true,
    "expectedResult": {
      "lowerCase": false,
      "colRef": {
        "identifierChain": [
          {
            "name": "foo"
          },
          {
            "name": "bar"
          }
        ]
      },
      "suggestGroupBys": {
        "prefix": "GROUP BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      },
      "suggestOrderBys": {
        "prefix": "ORDER BY",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE bar NOT ",
    "afterCursor": "",
    "containsKeywords": [
      "IN"
    ],
    "expectedResult": {
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM foo WHERE bar IN (",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "SELECT"
      ],
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          }
        ]
      },
      "colRef": {
        "identifierChain": [
          {
            "name": "foo"
          },
          {
            "name": "bar"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "select * from foo, bar where bar.bla in (",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": true,
      "suggestKeywords": [
        "SELECT"
      ],
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          },
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "foo.",
          "type": "table"
        },
        {
          "name": "bar.",
          "type": "table"
        }
      ],
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bla"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest values",
    "beforeCursor": "select * from foo, bar where bar.bla in ('a', ",
    "afterCursor": "",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "lowerCase": true,
      "suggestFunctions": {
        "types": [
          "COLREF"
        ]
      },
      "suggestValues": {},
      "suggestColumns": {
        "source": "where",
        "types": [
          "COLREF"
        ],
        "tables": [
          {
            "identifierChain": [
              {
                "name": "foo"
              }
            ]
          },
          {
            "identifierChain": [
              {
                "name": "bar"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "foo.",
          "type": "table"
        },
        {
          "name": "bar.",
          "type": "table"
        }
      ],
      "colRef": {
        "identifierChain": [
          {
            "name": "bar"
          },
          {
            "name": "bla"
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT * FROM foo WHERE bar IN (SELECT ",
    "afterCursor": "",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT * FROM bar WHERE foo NOT IN (SELECT ",
    "afterCursor": ")",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "SELECT * FROM (",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": false,
      "suggestKeywords": [
        "SELECT"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "select * from (",
    "afterCursor": "",
    "expectedResult": {
      "lowerCase": true,
      "suggestKeywords": [
        "SELECT"
      ]
    }
  },
  {
    "namePrefix": "should suggest keywords",
    "beforeCursor": "select foo.* from (",
    "afterCursor": ") foo",
    "containsKeywords": [
      "SELECT"
    ],
    "expectedResult": {
      "lowerCase": true
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT * FROM (SELECT ",
    "afterCursor": "",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT \"contains an even number\" FROM t1, t2 AS ta2 WHERE EXISTS (SELECT t3.foo FROM t3 WHERE ",
    "afterCursor": " % 2 = 0",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "suggestColumns": {
        "types": [
          "NUMBER"
        ],
        "source": "where",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "t1"
              }
            ]
          },
          {
            "identifierChain": [
              {
                "name": "t2"
              }
            ],
            "alias": "ta2"
          },
          {
            "identifierChain": [
              {
                "name": "t3"
              }
            ]
          }
        ]
      },
      "suggestFunctions": {
        "types": [
          "NUMBER"
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "t1.",
          "type": "table"
        },
        {
          "name": "ta2.",
          "type": "alias"
        },
        {
          "name": "t3.",
          "type": "table"
        }
      ],
      "lowerCase": false,
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 103
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 8,
            "last_column": 33
          }
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 39,
            "last_column": 41
          },
          "identifierChain": [
            {
              "name": "t1"
            }
          ]
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 43,
            "last_column": 45
          },
          "identifierChain": [
            {
              "name": "t2"
            }
          ]
        },
        {
          "type": "alias",
          "source": "table",
          "alias": "ta2",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 49,
            "last_column": 52
          },
          "identifierChain": [
            {
              "name": "t2"
            }
          ]
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 52,
            "last_column": 52
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 52,
            "last_column": 52
          }
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 74,
            "last_column": 80
          },
          "subquery": true
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 74,
            "last_column": 76
          },
          "identifierChain": [
            {
              "name": "t3"
            }
          ]
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 77,
            "last_column": 80
          },
          "identifierChain": [
            {
              "name": "foo"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "t3"
                }
              ]
            }
          ],
          "qualified": true
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 86,
            "last_column": 88
          },
          "identifierChain": [
            {
              "name": "t3"
            }
          ]
        },
        {
          "type": "whereClause",
          "subquery": true,
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 88,
            "last_column": 88
          }
        },
        {
          "type": "limitClause",
          "subquery": true,
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 88,
            "last_column": 88
          }
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest identifiers",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM testTable tt, (SELECT bla FROM abc WHERE foo > 1) bar",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "locations": [
        {
          "type": "statement",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 1,
            "last_column": 67
          }
        },
        {
          "type": "selectList",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 7,
            "last_column": 7
          }
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 14,
            "last_column": 23
          },
          "identifierChain": [
            {
              "name": "testTable"
            }
          ]
        },
        {
          "type": "alias",
          "source": "table",
          "alias": "tt",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 24,
            "last_column": 26
          },
          "identifierChain": [
            {
              "name": "testTable"
            }
          ]
        },
        {
          "type": "selectList",
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 36,
            "last_column": 39
          },
          "subquery": true
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 36,
            "last_column": 39
          },
          "identifierChain": [
            {
              "name": "bla"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "abc"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "table",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 45,
            "last_column": 48
          },
          "identifierChain": [
            {
              "name": "abc"
            }
          ]
        },
        {
          "type": "whereClause",
          "subquery": true,
          "missing": false,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 49,
            "last_column": 62
          }
        },
        {
          "type": "column",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 55,
            "last_column": 58
          },
          "identifierChain": [
            {
              "name": "foo"
            }
          ],
          "tables": [
            {
              "identifierChain": [
                {
                  "name": "abc"
                }
              ]
            }
          ],
          "qualified": false
        },
        {
          "type": "limitClause",
          "subquery": true,
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 62,
            "last_column": 62
          }
        },
        {
          "type": "alias",
          "source": "subquery",
          "alias": "bar",
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 64,
            "last_column": 67
          }
        },
        {
          "type": "whereClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 67,
            "last_column": 67
          }
        },
        {
          "type": "limitClause",
          "missing": true,
          "location": {
            "first_line": 1,
            "last_line": 1,
            "first_column": 67,
            "last_column": 67
          }
        }
      ],
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ],
            "alias": "tt"
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "testTable"
              }
            ],
            "alias": "tt"
          },
          {
            "identifierChain": [
              {
                "subQuery": "bar"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "tt.",
          "type": "alias"
        },
        {
          "name": "bar.",
          "type": "sub-query"
        }
      ],
      "subQueries": [
        {
          "alias": "bar",
          "columns": [
            {
              "identifierChain": [
                {
                  "name": "abc"
                },
                {
                  "name": "bla"
                }
              ],
              "type": "COLREF"
            }
          ]
        }
      ],
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "select ",
    "afterCursor": " from (select id i, name as n, bla from foo) bar",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "subQuery": "bar"
              }
            ]
          }
        ]
      },
      "subQueries": [
        {
          "alias": "bar",
          "columns": [
            {
              "alias": "i",
              "identifierChain": [
                {
                  "name": "foo"
                },
                {
                  "name": "id"
                }
              ],
              "type": "COLREF"
            },
            {
              "alias": "n",
              "identifierChain": [
                {
                  "name": "foo"
                },
                {
                  "name": "name"
                }
              ],
              "type": "COLREF"
            },
            {
              "identifierChain": [
                {
                  "name": "foo"
                },
                {
                  "name": "bla"
                }
              ],
              "type": "COLREF"
            }
          ]
        }
      ],
      "suggestIdentifiers": [
        {
          "name": "bar.",
          "type": "sub-query"
        }
      ],
      "lowerCase": true
    }
  },
  {
    "namePrefix": "should suggest sub-query columns",
    "beforeCursor": "SELECT bar.",
    "afterCursor": " FROM (SELECT col1, col2, (col3 + 1) col3alias FROM foo) bar",
    "expectedResult": {
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "subQuery": "bar"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "*"
      ],
      "lowerCase": false,
      "subQueries": [
        {
          "alias": "bar",
          "columns": [
            {
              "identifierChain": [
                {
                  "name": "foo"
                },
                {
                  "name": "col1"
                }
              ],
              "type": "COLREF"
            },
            {
              "identifierChain": [
                {
                  "name": "foo"
                },
                {
                  "name": "col2"
                }
              ],
              "type": "COLREF"
            },
            {
              "alias": "col3alias",
              "type": "NUMBER"
            }
          ]
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest sub-query columns",
    "beforeCursor": "SELECT bar.",
    "afterCursor": " FROM (SELECT b FROM foo) boo, (SELECT a FROM bla) bar",
    "expectedResult": {
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "subQuery": "bar"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "*"
      ],
      "subQueries": [
        {
          "alias": "boo",
          "columns": [
            {
              "identifierChain": [
                {
                  "name": "foo"
                },
                {
                  "name": "b"
                }
              ],
              "type": "COLREF"
            }
          ]
        },
        {
          "alias": "bar",
          "columns": [
            {
              "identifierChain": [
                {
                  "name": "bla"
                },
                {
                  "name": "a"
                }
              ],
              "type": "COLREF"
            }
          ]
        }
      ],
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest identifiers",
    "beforeCursor": "SELECT cos(",
    "afterCursor": " FROM (SELECT b FROM foo) boo, (SELECT a FROM bla) bar",
    "containsKeywords": [
      "CASE"
    ],
    "expectedResult": {
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "subQuery": "boo"
              }
            ]
          },
          {
            "identifierChain": [
              {
                "subQuery": "bar"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "boo.",
          "type": "sub-query"
        },
        {
          "name": "bar.",
          "type": "sub-query"
        }
      ],
      "suggestFunctions": {},
      "udfArgument": {
        "name": "cos",
        "position": 1
      },
      "subQueries": [
        {
          "alias": "boo",
          "columns": [
            {
              "identifierChain": [
                {
                  "name": "foo"
                },
                {
                  "name": "b"
                }
              ],
              "type": "COLREF"
            }
          ]
        },
        {
          "alias": "bar",
          "columns": [
            {
              "identifierChain": [
                {
                  "name": "bla"
                },
                {
                  "name": "a"
                }
              ],
              "type": "COLREF"
            }
          ]
        }
      ],
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest tables",
    "beforeCursor": "SELECT * FROM (SELECT ",
    "afterCursor": ")",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestTables": {
        "prependQuestionMark": true,
        "prependFrom": true
      },
      "suggestDatabases": {
        "prependQuestionMark": true,
        "prependFrom": true,
        "appendDot": true
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM (SELECT ",
    "afterCursor": " FROM tableOne) subQueryOne, someDb.tableTwo talias, (SELECT * FROM t3 JOIN t4 ON t3.id = t4.id) AS subQueryTwo;",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableOne"
              }
            ]
          }
        ]
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "name": "tableOne"
              }
            ]
          }
        ]
      }
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM (SELECT * FROM (SELECT * FROM tableOne) subQueryOne) subQueryTwo",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "subQuery": "subQueryTwo"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "subQueryTwo.",
          "type": "sub-query"
        }
      ],
      "subQueries": [
        {
          "alias": "subQueryTwo",
          "columns": [
            {
              "tables": [
                {
                  "identifierChain": [
                    {
                      "subQuery": "subQueryOne"
                    }
                  ]
                }
              ]
            }
          ],
          "subQueries": [
            {
              "alias": "subQueryOne",
              "columns": [
                {
                  "tables": [
                    {
                      "identifierChain": [
                        {
                          "name": "tableOne"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ],
      "lowerCase": false
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT ",
    "afterCursor": " FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM tableOne) subQueryOne) subQueryTwo) subQueryThree",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "subQuery": "subQueryThree"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "subQueryThree.",
          "type": "sub-query"
        }
      ],
      "subQueries": [
        {
          "alias": "subQueryThree",
          "columns": [
            {
              "tables": [
                {
                  "identifierChain": [
                    {
                      "subQuery": "subQueryTwo"
                    }
                  ]
                }
              ]
            }
          ],
          "subQueries": [
            {
              "alias": "subQueryTwo",
              "columns": [
                {
                  "tables": [
                    {
                      "identifierChain": [
                        {
                          "subQuery": "subQueryOne"
                        }
                      ]
                    }
                  ]
                }
              ],
              "subQueries": [
                {
                  "alias": "subQueryOne",
                  "columns": [
                    {
                      "tables": [
                        {
                          "identifierChain": [
                            {
                              "name": "tableOne"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM (SELECT ",
    "afterCursor": " FROM (SELECT * FROM (SELECT * FROM tableOne) subQueryOne) subQueryTwo) subQueryThree",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "subQuery": "subQueryTwo"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "subQueryTwo.",
          "type": "sub-query"
        }
      ],
      "subQueries": [
        {
          "alias": "subQueryTwo",
          "columns": [
            {
              "tables": [
                {
                  "identifierChain": [
                    {
                      "subQuery": "subQueryOne"
                    }
                  ]
                }
              ]
            }
          ],
          "subQueries": [
            {
              "alias": "subQueryOne",
              "columns": [
                {
                  "tables": [
                    {
                      "identifierChain": [
                        {
                          "name": "tableOne"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT * FROM (SELECT * FROM (SELECT ",
    "afterCursor": " FROM (SELECT * FROM tableOne) subQueryOne) subQueryTwo) subQueryThree",
    "containsKeywords": [
      "*",
      "ALL",
      "DISTINCT"
    ],
    "expectedResult": {
      "lowerCase": false,
      "suggestAggregateFunctions": {
        "tables": []
      },
      "suggestAnalyticFunctions": true,
      "suggestFunctions": {},
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "subQuery": "subQueryOne"
              }
            ]
          }
        ]
      },
      "suggestIdentifiers": [
        {
          "name": "subQueryOne.",
          "type": "sub-query"
        }
      ],
      "subQueries": [
        {
          "alias": "subQueryOne",
          "columns": [
            {
              "tables": [
                {
                  "identifierChain": [
                    {
                      "name": "tableOne"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  },
  {
    "namePrefix": "should suggest columns",
    "beforeCursor": "SELECT s2.",
    "afterCursor": " FROM (SELECT a, bla FROM (SELECT a, b, abs(1) as bla FROM testTable) s1) s2;",
    "expectedResult": {
      "suggestColumns": {
        "source": "select",
        "tables": [
          {
            "identifierChain": [
              {
                "subQuery": "s2"
              }
            ]
          }
        ]
      },
      "suggestKeywords": [
        "*"
      ],
      "subQueries": [
        {
          "alias": "s2",
          "columns": [
            {
              "identifierChain": [
                {
                  "subQuery": "s1"
                },
                {
                  "name": "a"
                }
              ],
              "type": "COLREF"
            },
            {
              "identifierChain": [
                {
                  "subQuery": "s1"
                },
                {
                  "name": "bla"
                }
              ],
              "type": "COLREF"
            }
          ],
          "subQueries": [
            {
              "alias": "s1",
              "columns": [
                {
                  "identifierChain": [
                    {
                      "name": "testTable"
                    },
                    {
                      "name": "a"
                    }
                  ],
                  "type": "COLREF"
                },
                {
                  "identifierChain": [
                    {
                      "name": "testTable"
                    },
                    {
                      "name": "b"
                    }
                  ],
                  "type": "COLREF"
                },
                {
                  "alias": "bla",
                  "type": "UDFREF",
                  "udfRef": "abs"
                }
              ]
            }
          ]
        }
      ],
      "lowerCase": false
    }
  }
]
