SQL is a predominately variable free language in terms of simple usage, in the
    sense that most queries do not create references to variables which are not
    already static tables in a dataset. However, it is possible to do this via
    derived tables. If we don't require this functionality, we can tighten the
    grammar, because we don't need to support aliased tables.

def update_grammar_to_be_variable_free(grammar_dictionary: Dict[str, List[str]]):
    """
    SQL is a predominately variable free language in terms of simple usage, in the
    sense that most queries do not create references to variables which are not
    already static tables in a dataset. However, it is possible to do this via
    derived tables. If we don't require this functionality, we can tighten the
    grammar, because we don't need to support aliased tables.
    """

    # Tables in variable free grammars cannot be aliased, so we
    # remove this functionality from the grammar.
    grammar_dictionary["select_result"] = ['"*"', '(table_name ws ".*")', 'expr']

    # Similarly, collapse the definition of a source table
    # to not contain aliases and modify references to subqueries.
    grammar_dictionary["single_source"] = ['table_name', '("(" ws query ws ")")']
    del grammar_dictionary["source_subq"]
    del grammar_dictionary["source_table"]

    grammar_dictionary["expr"] = ['in_expr',
                                  '(value wsp "LIKE" wsp string)',
                                  '(value ws "BETWEEN" wsp value ws "AND" wsp value)',
                                  '(value ws binaryop wsp expr)',
                                  '(unaryop ws expr)',
                                  '(col_ref ws "IS" ws "NOT" ws "NULL")',
                                  '(col_ref ws "IS" ws "NULL")',
                                  # This used to be source_subq - now
                                  # we don't need aliases, we can colapse it to queries.
                                  '("(" ws query ws ")")',
                                  'value']

    # Finally, remove the ability to reference an arbitrary name,
    # because now we don't have aliased tables, we don't need
    # to recognise new variables.
    del grammar_dictionary["name"]