SqlScanner.java

/* The following code was generated by JFlex 1.4.3 on 6/5/25, 10:27 PM */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
// This file is copied from
// https://github.com/cloudera/Impala/blob/v0.7refresh/fe/src/main/jflex/sql-scanner.flex
// and modified by Doris

package org.apache.doris.analysis;

import java_cup.runtime.Symbol;
import java.io.StringWriter;
import java.lang.Integer;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;

import org.apache.doris.analysis.SqlParserSymbols;
import org.apache.doris.common.util.SqlUtils;
import org.apache.doris.qe.SqlModeHelper;


/**
 * This class is a scanner generated by 
 * <a href="http://www.jflex.de/">JFlex</a> 1.4.3
 * on 6/5/25, 10:27 PM from the specification file
 * <tt>/root/doris/fe/fe-core/src/main/jflex/sql_scanner.flex</tt>
 */
public final class SqlScanner implements java_cup.runtime.Scanner {

  /** This character denotes the end of file */
  public static final int YYEOF = -1;

  /** initial size of the lookahead buffer */
  private static final int ZZ_BUFFERSIZE = 16384;

  /** lexical states */
  public static final int EOLHINT = 2;
  public static final int YYINITIAL = 0;

  /**
   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
   *                  at the beginning of a line
   * l is of the form l = 2*k, k a non negative integer
   */
  private static final int ZZ_LEXSTATE[] = { 
     0,  0,  1, 1
  };

  /** 
   * Translates characters to character classes
   */
  private static final String ZZ_CMAP_PACKED = 
    "\11\6\1\3\1\2\1\0\1\3\1\1\16\6\4\0\1\22\1\44"+
    "\1\14\1\0\1\5\1\40\1\7\1\12\1\30\1\31\1\24\1\20"+
    "\1\26\1\21\1\16\1\23\12\15\1\32\1\33\1\45\1\43\1\25"+
    "\1\46\1\27\4\5\1\17\25\5\1\34\1\13\1\35\1\41\1\5"+
    "\1\11\4\5\1\17\25\5\1\36\1\10\1\37\1\42\41\6\2\0"+
    "\4\5\4\0\1\5\2\0\1\6\7\0\1\5\4\0\1\5\5\0"+
    "\27\5\1\0\37\5\1\0\u01ca\5\4\0\14\5\16\0\5\5\7\0"+
    "\1\5\1\0\1\5\21\0\160\6\5\5\1\0\2\5\2\0\4\5"+
    "\1\0\1\5\6\0\1\5\1\0\3\5\1\0\1\5\1\0\24\5"+
    "\1\0\123\5\1\0\213\5\1\0\5\6\2\0\246\5\1\0\46\5"+
    "\2\0\1\5\6\0\51\5\6\0\1\5\1\0\55\6\1\0\1\6"+
    "\1\0\2\6\1\0\2\6\1\0\1\6\10\0\33\5\4\0\4\5"+
    "\15\0\6\6\5\0\1\5\4\0\13\6\1\0\1\6\3\0\53\5"+
    "\25\6\12\4\4\0\2\5\1\6\143\5\1\0\1\5\10\6\1\0"+
    "\6\6\2\5\2\6\1\0\4\6\2\5\12\4\3\5\2\0\1\5"+
    "\17\0\1\6\1\5\1\6\36\5\33\6\2\0\131\5\13\6\1\5"+
    "\16\0\12\4\41\5\11\6\2\5\4\0\1\5\2\0\1\6\30\5"+
    "\4\6\1\5\11\6\1\5\3\6\1\5\5\6\22\0\31\5\3\6"+
    "\4\0\13\5\65\0\25\5\1\0\22\5\13\0\61\6\66\5\3\6"+
    "\1\5\22\6\1\5\7\6\12\5\2\6\2\0\12\4\1\0\20\5"+
    "\3\6\1\0\10\5\2\0\2\5\2\0\26\5\1\0\7\5\1\0"+
    "\1\5\3\0\4\5\2\0\1\6\1\5\7\6\2\0\2\6\2\0"+
    "\3\6\1\5\10\0\1\6\4\0\2\5\1\0\3\5\2\6\2\0"+
    "\12\4\4\5\7\0\2\5\1\0\1\6\2\0\3\6\1\0\6\5"+
    "\4\0\2\5\2\0\26\5\1\0\7\5\1\0\2\5\1\0\2\5"+
    "\1\0\2\5\2\0\1\6\1\0\5\6\4\0\2\6\2\0\3\6"+
    "\3\0\1\6\7\0\4\5\1\0\1\5\7\0\12\4\2\6\3\5"+
    "\1\6\13\0\3\6\1\0\11\5\1\0\3\5\1\0\26\5\1\0"+
    "\7\5\1\0\2\5\1\0\5\5\2\0\1\6\1\5\10\6\1\0"+
    "\3\6\1\0\3\6\2\0\1\5\17\0\2\5\2\6\2\0\12\4"+
    "\1\0\1\5\7\0\1\5\6\6\1\0\3\6\1\0\10\5\2\0"+
    "\2\5\2\0\26\5\1\0\7\5\1\0\2\5\1\0\5\5\2\0"+
    "\1\6\1\5\7\6\2\0\2\6\2\0\3\6\7\0\3\6\4\0"+
    "\2\5\1\0\3\5\2\6\2\0\12\4\1\0\1\5\20\0\1\6"+
    "\1\5\1\0\6\5\3\0\3\5\1\0\4\5\3\0\2\5\1\0"+
    "\1\5\1\0\2\5\3\0\2\5\3\0\3\5\3\0\14\5\4\0"+
    "\5\6\3\0\3\6\1\0\4\6\2\0\1\5\6\0\1\6\16\0"+
    "\12\4\11\0\1\5\6\0\5\6\10\5\1\0\3\5\1\0\27\5"+
    "\1\0\20\5\3\0\1\5\7\6\1\0\3\6\1\0\4\6\7\0"+
    "\2\6\1\0\3\5\5\0\2\5\2\6\2\0\12\4\20\0\1\5"+
    "\3\6\1\0\10\5\1\0\3\5\1\0\27\5\1\0\12\5\1\0"+
    "\5\5\2\0\1\6\1\5\7\6\1\0\3\6\1\0\4\6\7\0"+
    "\2\6\7\0\1\5\1\0\2\5\2\6\2\0\12\4\1\0\2\5"+
    "\15\0\4\6\11\5\1\0\3\5\1\0\51\5\2\6\1\5\7\6"+
    "\1\0\3\6\1\0\4\6\1\5\5\0\3\5\1\6\7\0\3\5"+
    "\2\6\2\0\12\4\12\0\6\5\1\0\3\6\1\0\22\5\3\0"+
    "\30\5\1\0\11\5\1\0\1\5\2\0\7\5\3\0\1\6\4\0"+
    "\6\6\1\0\1\6\1\0\10\6\6\0\12\4\2\0\2\6\15\0"+
    "\60\5\1\6\2\5\7\6\4\0\10\5\10\6\1\0\12\4\47\0"+
    "\2\5\1\0\1\5\1\0\5\5\1\0\30\5\1\0\1\5\1\0"+
    "\12\5\1\6\2\5\11\6\1\5\2\0\5\5\1\0\1\5\1\0"+
    "\6\6\2\0\12\4\2\0\4\5\40\0\1\5\27\0\2\6\6\0"+
    "\12\4\13\0\1\6\1\0\1\6\1\0\1\6\4\0\2\6\10\5"+
    "\1\0\44\5\4\0\24\6\1\0\2\6\5\5\13\6\1\0\44\6"+
    "\11\0\1\6\71\0\53\5\24\6\1\5\12\4\6\0\6\5\4\6"+
    "\4\5\3\6\1\5\3\6\2\5\7\6\3\5\4\6\15\5\14\6"+
    "\1\5\1\6\12\4\4\6\2\0\46\5\1\0\1\5\5\0\1\5"+
    "\2\0\53\5\1\0\u014d\5\1\0\4\5\2\0\7\5\1\0\1\5"+
    "\1\0\4\5\2\0\51\5\1\0\4\5\2\0\41\5\1\0\4\5"+
    "\2\0\7\5\1\0\1\5\1\0\4\5\2\0\17\5\1\0\71\5"+
    "\1\0\4\5\2\0\103\5\2\0\3\6\40\0\20\5\20\0\126\5"+
    "\2\0\6\5\3\0\u026c\5\2\0\21\5\1\0\32\5\5\0\113\5"+
    "\3\0\13\5\7\0\15\5\1\0\4\5\3\6\13\0\22\5\3\6"+
    "\13\0\22\5\2\6\14\0\15\5\1\0\3\5\1\0\2\6\14\0"+
    "\64\5\40\6\3\0\1\5\3\0\2\5\1\6\2\0\12\4\41\0"+
    "\4\6\1\0\12\4\6\0\131\5\7\0\5\5\2\6\42\5\1\6"+
    "\1\5\5\0\106\5\12\0\37\5\1\0\14\6\4\0\14\6\12\0"+
    "\12\4\36\5\2\0\5\5\13\0\54\5\4\0\32\5\6\0\12\4"+
    "\46\0\27\5\5\6\4\0\65\5\12\6\1\0\35\6\2\0\1\6"+
    "\12\4\6\0\12\4\15\0\1\5\10\0\16\6\1\0\2\6\77\0"+
    "\5\6\57\5\21\6\7\5\4\0\12\4\21\0\11\6\14\0\3\6"+
    "\36\5\15\6\2\5\12\4\54\5\16\6\14\0\44\5\24\6\10\0"+
    "\12\4\3\0\3\5\12\4\44\5\2\0\11\5\7\0\53\5\2\0"+
    "\3\5\20\0\3\6\1\0\25\6\4\5\1\6\6\5\1\6\2\5"+
    "\3\6\1\5\5\0\300\5\72\6\1\0\5\6\u0116\5\2\0\6\5"+
    "\2\0\46\5\2\0\6\5\2\0\10\5\1\0\1\5\1\0\1\5"+
    "\1\0\1\5\1\0\37\5\2\0\65\5\1\0\7\5\1\0\1\5"+
    "\3\0\3\5\1\0\7\5\3\0\4\5\2\0\6\5\4\0\15\5"+
    "\5\0\3\5\1\0\7\5\16\0\5\6\32\0\5\6\20\0\2\5"+
    "\23\0\1\5\13\0\5\6\1\0\12\6\1\0\1\5\15\0\1\5"+
    "\20\0\15\5\3\0\40\5\20\0\15\6\4\0\1\6\3\0\14\6"+
    "\21\0\1\5\4\0\1\5\2\0\12\5\1\0\1\5\3\0\5\5"+
    "\6\0\1\5\1\0\1\5\1\0\1\5\1\0\4\5\1\0\13\5"+
    "\2\0\4\5\5\0\5\5\4\0\1\5\21\0\51\5\u0a77\0\57\5"+
    "\1\0\57\5\1\0\205\5\6\0\4\5\3\6\2\5\14\0\46\5"+
    "\1\0\1\5\5\0\1\5\2\0\70\5\7\0\1\5\17\0\1\6"+
    "\27\5\11\0\7\5\1\0\7\5\1\0\7\5\1\0\7\5\1\0"+
    "\7\5\1\0\7\5\1\0\7\5\1\0\7\5\1\0\40\6\57\0"+
    "\1\5\u01d5\0\3\5\31\0\11\5\6\6\1\0\5\5\2\0\5\5"+
    "\4\0\126\5\2\0\2\6\2\0\3\5\1\0\132\5\1\0\4\5"+
    "\5\0\53\5\1\0\136\5\21\0\40\5\60\0\20\5\u0200\0\u19c0\5"+
    "\100\0\u51fd\5\3\0\u048d\5\103\0\56\5\2\0\u010d\5\3\0\20\5"+
    "\12\4\2\5\24\0\57\5\1\6\4\0\12\6\1\0\37\5\2\6"+
    "\120\5\2\6\45\0\11\5\2\0\147\5\2\0\65\5\2\0\11\5"+
    "\52\0\15\5\1\6\3\5\1\6\4\5\1\6\27\5\5\6\4\0"+
    "\1\6\13\0\1\5\7\0\64\5\14\0\2\6\62\5\22\6\12\0"+
    "\12\4\6\0\22\6\6\5\3\0\1\5\1\0\2\5\1\6\12\4"+
    "\34\5\10\6\2\0\27\5\15\6\14\0\35\5\3\0\4\6\57\5"+
    "\16\6\16\0\1\5\12\4\6\0\5\5\1\6\12\5\12\4\5\5"+
    "\1\0\51\5\16\6\11\0\3\5\1\6\10\5\2\6\2\0\12\4"+
    "\6\0\27\5\3\0\1\5\3\6\62\5\1\6\1\5\3\6\2\5"+
    "\2\6\5\5\2\6\1\5\1\6\1\5\30\0\3\5\2\0\13\5"+
    "\5\6\2\0\3\5\2\6\12\0\6\5\2\0\6\5\2\0\6\5"+
    "\11\0\7\5\1\0\7\5\1\0\53\5\1\0\16\5\6\0\163\5"+
    "\10\6\1\0\2\6\2\0\12\4\6\0\u2ba4\5\14\0\27\5\4\0"+
    "\61\5\u2104\0\u016e\5\2\0\152\5\46\0\7\5\14\0\5\5\5\0"+
    "\1\5\1\6\12\5\1\0\15\5\1\0\5\5\1\0\1\5\1\0"+
    "\2\5\1\0\2\5\1\0\154\5\41\0\u016b\5\22\0\100\5\2\0"+
    "\66\5\50\0\15\5\3\0\20\6\20\0\20\6\3\0\2\5\30\0"+
    "\3\5\31\0\1\5\6\0\5\5\1\0\207\5\2\0\1\6\4\0"+
    "\1\5\13\0\12\4\7\0\32\5\4\0\1\5\1\0\32\5\13\0"+
    "\131\5\3\0\6\5\2\0\6\5\2\0\6\5\2\0\3\5\3\0"+
    "\2\5\3\0\2\5\22\0\3\6\4\0";

  /** 
   * Translates characters to character classes
   */
  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);

  /** 
   * Translates DFA states to action switch labels.
   */
  private static final int [] ZZ_ACTION = zzUnpackAction();

  private static final String ZZ_ACTION_PACKED_0 =
    "\2\0\2\1\1\2\1\3\1\4\1\5\3\6\1\2"+
    "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16"+
    "\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26"+
    "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\2\36"+
    "\1\3\1\0\1\37\1\0\1\40\3\0\1\41\1\42"+
    "\1\3\1\0\1\1\1\43\1\0\1\44\1\45\1\0"+
    "\1\42\1\0\1\46\1\1\1\47\1\0\1\50\1\0"+
    "\1\42\2\0";

  private static int [] zzUnpackAction() {
    int [] result = new int[66];
    int offset = 0;
    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackAction(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }


  /** 
   * Translates a state to a row index in the transition table
   */
  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();

  private static final String ZZ_ROWMAP_PACKED_0 =
    "\0\0\0\47\0\116\0\165\0\234\0\303\0\352\0\u0111"+
    "\0\u0138\0\u015f\0\u0186\0\u01ad\0\u01d4\0\165\0\u01fb\0\u0222"+
    "\0\u0249\0\165\0\165\0\165\0\165\0\165\0\u0270\0\165"+
    "\0\165\0\165\0\165\0\165\0\165\0\165\0\165\0\165"+
    "\0\165\0\165\0\165\0\u0297\0\165\0\165\0\u0138\0\u02be"+
    "\0\u015f\0\u02e5\0\u030c\0\u0186\0\u0333\0\u035a\0\u0381\0\u03a8"+
    "\0\u03cf\0\u03f6\0\165\0\u041d\0\165\0\165\0\u0444\0\u046b"+
    "\0\u0492\0\165\0\u04b9\0\165\0\u04e0\0\u0507\0\u052e\0\u0492"+
    "\0\u0507\0\u0555";

  private static int [] zzUnpackRowMap() {
    int [] result = new int[66];
    int offset = 0;
    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackRowMap(String packed, int offset, int [] result) {
    int i = 0;  /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int high = packed.charAt(i++) << 16;
      result[j++] = high | packed.charAt(i++);
    }
    return j;
  }

  /** 
   * The transition table of the DFA
   */
  private static final int [] ZZ_TRANS = zzUnpackTrans();

  private static final String ZZ_TRANS_PACKED_0 =
    "\1\0\1\3\2\4\1\5\1\6\1\0\1\7\1\10"+
    "\1\11\1\12\1\0\1\13\1\14\1\15\1\6\1\16"+
    "\1\17\1\4\1\20\1\21\1\22\1\23\1\24\1\25"+
    "\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35"+
    "\1\36\1\37\1\40\1\41\1\42\1\43\1\0\1\44"+
    "\1\45\1\4\1\5\1\6\1\0\1\7\1\10\1\11"+
    "\1\12\1\0\1\13\1\14\1\15\1\6\1\16\1\17"+
    "\1\4\1\20\1\21\1\22\1\23\1\24\1\25\1\26"+
    "\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36"+
    "\1\37\1\40\1\41\1\42\1\43\2\0\1\4\117\0"+
    "\1\5\1\6\7\0\1\5\1\0\1\6\33\0\3\6"+
    "\6\0\1\6\1\0\1\6\36\0\1\46\47\0\1\46"+
    "\36\0\11\47\1\50\35\47\12\51\1\52\1\53\33\51"+
    "\13\54\1\55\1\56\32\54\4\0\1\5\1\6\7\0"+
    "\1\14\1\57\1\60\44\0\1\57\1\61\51\0\1\62"+
    "\3\0\1\63\45\0\1\64\45\0\1\65\66\0\1\66"+
    "\5\0\1\45\55\0\1\47\47\0\1\51\34\0\2\51"+
    "\1\0\44\51\2\54\1\0\44\54\14\0\1\54\47\0"+
    "\1\57\1\0\1\67\33\0\3\6\6\0\1\70\1\0"+
    "\1\6\2\71\43\0\1\72\30\0\1\73\1\3\1\4"+
    "\15\73\1\74\1\73\1\62\24\73\20\75\1\76\1\75"+
    "\1\64\1\75\1\77\22\75\15\0\1\100\2\0\2\71"+
    "\31\0\3\6\6\0\1\70\1\0\1\6\44\0\1\100"+
    "\31\0\1\73\1\3\1\4\44\73\24\75\1\77\22\75"+
    "\1\101\2\75\21\101\1\102\22\101\23\75\1\4\1\77"+
    "\22\75\1\101\2\75\20\101\1\0\1\102\22\101";

  private static int [] zzUnpackTrans() {
    int [] result = new int[1404];
    int offset = 0;
    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackTrans(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      value--;
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }


  /* error codes */
  private static final int ZZ_UNKNOWN_ERROR = 0;
  private static final int ZZ_NO_MATCH = 1;
  private static final int ZZ_PUSHBACK_2BIG = 2;

  /* error messages for the codes above */
  private static final String ZZ_ERROR_MSG[] = {
    "Unkown internal scanner error",
    "Error: could not match input",
    "Error: pushback value was too large"
  };

  /**
   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
   */
  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();

  private static final String ZZ_ATTRIBUTE_PACKED_0 =
    "\2\0\1\1\1\11\11\1\1\11\3\1\5\11\1\1"+
    "\14\11\1\1\2\11\1\0\1\1\1\0\1\1\3\0"+
    "\3\1\1\0\1\1\1\11\1\0\2\11\1\0\1\1"+
    "\1\0\1\11\1\1\1\11\1\0\1\1\1\0\1\1"+
    "\2\0";

  private static int [] zzUnpackAttribute() {
    int [] result = new int[66];
    int offset = 0;
    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
    return result;
  }

  private static int zzUnpackAttribute(String packed, int offset, int [] result) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      do result[j++] = value; while (--count > 0);
    }
    return j;
  }

  /** the input device */
  private java.io.Reader zzReader;

  /** the current state of the DFA */
  private int zzState;

  /** the current lexical state */
  private int zzLexicalState = YYINITIAL;

  /** this buffer contains the current text to be matched and is
      the source of the yytext() string */
  private char zzBuffer[] = new char[ZZ_BUFFERSIZE];

  /** the textposition at the last accepting state */
  private int zzMarkedPos;

  /** the current text position in the buffer */
  private int zzCurrentPos;

  /** startRead marks the beginning of the yytext() string in the buffer */
  private int zzStartRead;

  /** endRead marks the last character in the buffer, that has been read
      from input */
  private int zzEndRead;

  /** number of newlines encountered up to the start of the matched text */
  private int yyline;

  /** the number of characters up to the start of the matched text */
  private int yychar;

  /**
   * the number of characters from the last newline up to the start of the 
   * matched text
   */
  private int yycolumn;

  /** 
   * zzAtBOL == true <=> the scanner is currently at the beginning of a line
   */
  private boolean zzAtBOL = true;

  /** zzAtEOF == true <=> the scanner is at the EOF */
  private boolean zzAtEOF;

  /** denotes if the user-EOF-code has already been executed */
  private boolean zzEOFDone;

  /* user code: */
    // Help to judge a integer-literal is bigger than LARGEINT_MAX
    // NOTE: the 'longMin' is not '-2^63' here, to make sure the return value functions
    // like 'long abs(long)' is same with the type of arguments, which is valid.
    private static final BigInteger LONG_MAX = new BigInteger("9223372036854775807"); // 2^63 - 1

    private static final BigInteger LARGEINT_MAX_ABS = new BigInteger("170141183460469231731687303715884105728"); // 2^127

    // This param will affect the tokens returned by scanner.
    // For example:
    // In PIPES_AS_CONCAT_MODE(0x0002), scanner will return token with id as KW_PIPE instead of KW_OR when '||' is scanned.
    private long sql_mode;

    /**
       * Creates a new scanner to chain-call the generated constructor.
       * There is also a java.io.InputStream version of this constructor.
       * If you use this constructor, sql_mode will be set to 0 (default)
       *
       * @param   in  the java.io.Reader to read input from.
       */
    public SqlScanner(java.io.Reader in) {
      this(in, 0L);
    }

    /**
       * Creates a new scanner chain-call the generated constructor.
       * There is also java.io.Reader version of this constructor.
       * If you use this constructor, sql_mode will be set to 0 (default)
       *
       * @param   in  the java.io.Inputstream to read input from.
       */
    public SqlScanner(java.io.InputStream in) {
      this(in, 0L);
    }

    // map from keyword string to token id
    // we use a linked hash map because the insertion order is important.
    // for example, we want "and" to come after "&&" to make sure error reporting
    // uses "and" as a display name and not "&&"
    private static final Map<String, Integer> keywordMap = new LinkedHashMap<String, Integer>();
    static {
        keywordMap.put("&&", new Integer(SqlParserSymbols.KW_AND));
        keywordMap.put("||", new Integer(SqlParserSymbols.KW_PIPE));
        keywordMap.put("account_lock", new Integer(SqlParserSymbols.KW_ACCOUNT_LOCK));
        keywordMap.put("account_unlock", new Integer(SqlParserSymbols.KW_ACCOUNT_UNLOCK));
        keywordMap.put("add", new Integer(SqlParserSymbols.KW_ADD));
        keywordMap.put("admin", new Integer(SqlParserSymbols.KW_ADMIN));
        keywordMap.put("after", new Integer(SqlParserSymbols.KW_AFTER));
        keywordMap.put("aggregate", new Integer(SqlParserSymbols.KW_AGGREGATE));
        keywordMap.put("alias", new Integer(SqlParserSymbols.KW_ALIAS));
        keywordMap.put("all", new Integer(SqlParserSymbols.KW_ALL));
        keywordMap.put("alter", new Integer(SqlParserSymbols.KW_ALTER));
        keywordMap.put("always", new Integer(SqlParserSymbols.KW_ALWAYS));
        keywordMap.put("and", new Integer(SqlParserSymbols.KW_AND));
        keywordMap.put("analyze", new Integer(SqlParserSymbols.KW_ANALYZE));
        keywordMap.put("anti", new Integer(SqlParserSymbols.KW_ANTI));
        keywordMap.put("append", new Integer(SqlParserSymbols.KW_APPEND));
        keywordMap.put("array", new Integer(SqlParserSymbols.KW_ARRAY));
        keywordMap.put("auto_increment", new Integer(SqlParserSymbols.KW_AUTO_INCREMENT));
        keywordMap.put("as", new Integer(SqlParserSymbols.KW_AS));
        keywordMap.put("asc", new Integer(SqlParserSymbols.KW_ASC));
        keywordMap.put("at", new Integer(SqlParserSymbols.KW_AT));
        keywordMap.put("authors", new Integer(SqlParserSymbols.KW_AUTHORS));
        keywordMap.put("backend", new Integer(SqlParserSymbols.KW_BACKEND));
        keywordMap.put("backends", new Integer(SqlParserSymbols.KW_BACKENDS));
        keywordMap.put("backup", new Integer(SqlParserSymbols.KW_BACKUP));
        keywordMap.put("begin", new Integer(SqlParserSymbols.KW_BEGIN));
        keywordMap.put("belong", new Integer(SqlParserSymbols.KW_BELONG));
        keywordMap.put("between", new Integer(SqlParserSymbols.KW_BETWEEN));
        keywordMap.put("bigint", new Integer(SqlParserSymbols.KW_BIGINT));
        keywordMap.put("bin", new Integer(SqlParserSymbols.KW_BIN));
        keywordMap.put("binlog", new Integer(SqlParserSymbols.KW_BINLOG));
        keywordMap.put("bitmap", new Integer(SqlParserSymbols.KW_BITMAP));
        keywordMap.put("inverted", new Integer(SqlParserSymbols.KW_INVERTED));
        keywordMap.put("bitmap_empty", new Integer(SqlParserSymbols.KW_BITMAP_EMPTY));
        keywordMap.put("bitmap_union", new Integer(SqlParserSymbols.KW_BITMAP_UNION));
        keywordMap.put("ngram_bf", new Integer(SqlParserSymbols.KW_NGRAM_BF));
        keywordMap.put("blob", new Integer(SqlParserSymbols.KW_BLOB));
        keywordMap.put("boolean", new Integer(SqlParserSymbols.KW_BOOLEAN));
        keywordMap.put("brief", new Integer(SqlParserSymbols.KW_BRIEF));
        keywordMap.put("broker", new Integer(SqlParserSymbols.KW_BROKER));
        keywordMap.put("buckets", new Integer(SqlParserSymbols.KW_BUCKETS));
        keywordMap.put("build", new Integer(SqlParserSymbols.KW_BUILD));
        keywordMap.put("builtin", new Integer(SqlParserSymbols.KW_BUILTIN));
        keywordMap.put("by", new Integer(SqlParserSymbols.KW_BY));
        keywordMap.put("cached", new Integer(SqlParserSymbols.KW_CACHED));
        keywordMap.put("cancel", new Integer(SqlParserSymbols.KW_CANCEL));
        keywordMap.put("cache", new Integer(SqlParserSymbols.KW_CACHE));
        keywordMap.put("case", new Integer(SqlParserSymbols.KW_CASE));
        keywordMap.put("cast", new Integer(SqlParserSymbols.KW_CAST));
        keywordMap.put("catalog", new Integer(SqlParserSymbols.KW_CATALOG));
        keywordMap.put("catalogs", new Integer(SqlParserSymbols.KW_CATALOGS));
        keywordMap.put("chain", new Integer(SqlParserSymbols.KW_CHAIN));
        keywordMap.put("char", new Integer(SqlParserSymbols.KW_CHAR));
        keywordMap.put("character", new Integer(SqlParserSymbols.KW_CHAR));
        keywordMap.put("charset", new Integer(SqlParserSymbols.KW_CHARSET));
        keywordMap.put("check", new Integer(SqlParserSymbols.KW_CHECK));
        keywordMap.put("clean", new Integer(SqlParserSymbols.KW_CLEAN));
        keywordMap.put("cluster", new Integer(SqlParserSymbols.KW_CLUSTER));
        keywordMap.put("clusters", new Integer(SqlParserSymbols.KW_CLUSTERS));
        keywordMap.put("collate", new Integer(SqlParserSymbols.KW_COLLATE));
        keywordMap.put("collation", new Integer(SqlParserSymbols.KW_COLLATION));
        keywordMap.put("colocate", new Integer(SqlParserSymbols.KW_COLOCATE));
        keywordMap.put("column", new Integer(SqlParserSymbols.KW_COLUMN));
        keywordMap.put("columns", new Integer(SqlParserSymbols.KW_COLUMNS));
        keywordMap.put("comment", new Integer(SqlParserSymbols.KW_COMMENT));
        keywordMap.put("commit", new Integer(SqlParserSymbols.KW_COMMIT));
        keywordMap.put("committed", new Integer(SqlParserSymbols.KW_COMMITTED));
        keywordMap.put("compact", new Integer(SqlParserSymbols.KW_COMPACT));
        keywordMap.put("complete", new Integer(SqlParserSymbols.KW_COMPLETE));
        keywordMap.put("compute", new Integer(SqlParserSymbols.KW_COMPUTE));
        keywordMap.put("config", new Integer(SqlParserSymbols.KW_CONFIG));
        keywordMap.put("connection", new Integer(SqlParserSymbols.KW_CONNECTION));
        keywordMap.put("connection_id", new Integer(SqlParserSymbols.KW_CONNECTION_ID));
        keywordMap.put("consistent", new Integer(SqlParserSymbols.KW_CONSISTENT));
        keywordMap.put("convert", new Integer(SqlParserSymbols.KW_CONVERT));
        keywordMap.put("copy", new Integer(SqlParserSymbols.KW_COPY));
        keywordMap.put("count", new Integer(SqlParserSymbols.KW_COUNT));
        keywordMap.put("create", new Integer(SqlParserSymbols.KW_CREATE));
        keywordMap.put("creation", new Integer(SqlParserSymbols.KW_CREATION));
        keywordMap.put("cross", new Integer(SqlParserSymbols.KW_CROSS));
        keywordMap.put("cube", new Integer(SqlParserSymbols.KW_CUBE));
        keywordMap.put("current", new Integer(SqlParserSymbols.KW_CURRENT));
        keywordMap.put("current_catalog", new Integer(SqlParserSymbols.KW_CURRENT_CATALOG));
        keywordMap.put("current_timestamp", new Integer(SqlParserSymbols.KW_CURRENT_TIMESTAMP));
        keywordMap.put("current_user", new Integer(SqlParserSymbols.KW_CURRENT_USER));
        keywordMap.put("data", new Integer(SqlParserSymbols.KW_DATA));
        keywordMap.put("database", new Integer(SqlParserSymbols.KW_DATABASE));
        keywordMap.put("databases", new Integer(SqlParserSymbols.KW_DATABASES));
        keywordMap.put("date", new Integer(SqlParserSymbols.KW_DATE));
        keywordMap.put("datev1", new Integer(SqlParserSymbols.KW_DATEV1));
        keywordMap.put("datev2", new Integer(SqlParserSymbols.KW_DATEV2));
        keywordMap.put("datetime", new Integer(SqlParserSymbols.KW_DATETIME));
        keywordMap.put("datetimev1", new Integer(SqlParserSymbols.KW_DATETIMEV1));
        keywordMap.put("datetimev2", new Integer(SqlParserSymbols.KW_DATETIMEV2));
        keywordMap.put("time", new Integer(SqlParserSymbols.KW_TIME));
        keywordMap.put("day", new Integer(SqlParserSymbols.KW_DAY));
        keywordMap.put("decimal", new Integer(SqlParserSymbols.KW_DECIMAL));
        keywordMap.put("decimalv2", new Integer(SqlParserSymbols.KW_DECIMALV2));
        keywordMap.put("decimalv3", new Integer(SqlParserSymbols.KW_DECIMALV3));
        keywordMap.put("decommission", new Integer(SqlParserSymbols.KW_DECOMMISSION));
        keywordMap.put("default", new Integer(SqlParserSymbols.KW_DEFAULT));
        keywordMap.put("deferred", new Integer(SqlParserSymbols.KW_DEFERRED));
        keywordMap.put("delete", new Integer(SqlParserSymbols.KW_DELETE));
        keywordMap.put("demand", new Integer(SqlParserSymbols.KW_DEMAND));
        keywordMap.put("desc", new Integer(SqlParserSymbols.KW_DESC));
        keywordMap.put("describe", new Integer(SqlParserSymbols.KW_DESCRIBE));
        keywordMap.put("diagnose", new Integer(SqlParserSymbols.KW_DIAGNOSE));
        keywordMap.put("diagnosis", new Integer(SqlParserSymbols.KW_DIAGNOSIS));
        keywordMap.put("disk", new Integer(SqlParserSymbols.KW_DISK));
        keywordMap.put("distinct", new Integer(SqlParserSymbols.KW_DISTINCT));
        keywordMap.put("distinctpc", new Integer(SqlParserSymbols.KW_DISTINCTPC));
        keywordMap.put("distinctpcsa", new Integer(SqlParserSymbols.KW_DISTINCTPCSA));
        keywordMap.put("distributed", new Integer(SqlParserSymbols.KW_DISTRIBUTED));
        keywordMap.put("distribution", new Integer(SqlParserSymbols.KW_DISTRIBUTION));
        keywordMap.put("div", new Integer(SqlParserSymbols.KW_DIV));
        keywordMap.put("do", new Integer(SqlParserSymbols.KW_DO));
        keywordMap.put("doris_internal_table_id", new Integer(SqlParserSymbols.KW_DORIS_INTERNAL_TABLE_ID));
        keywordMap.put("double", new Integer(SqlParserSymbols.KW_DOUBLE));
        keywordMap.put("drop", new Integer(SqlParserSymbols.KW_DROP));
        keywordMap.put("dropp", new Integer(SqlParserSymbols.KW_DROPP));
        keywordMap.put("dual", new Integer(SqlParserSymbols.KW_DUAL));
        keywordMap.put("duplicate", new Integer(SqlParserSymbols.KW_DUPLICATE));
        keywordMap.put("dynamic", new Integer(SqlParserSymbols.KW_DYNAMIC));
        keywordMap.put("else", new Integer(SqlParserSymbols.KW_ELSE));
        keywordMap.put("enable", new Integer(SqlParserSymbols.KW_ENABLE));
        keywordMap.put("encryptkey", new Integer(SqlParserSymbols.KW_ENCRYPTKEY));
        keywordMap.put("encryptkeys", new Integer(SqlParserSymbols.KW_ENCRYPTKEYS));
        keywordMap.put("end", new Integer(SqlParserSymbols.KW_END));
        keywordMap.put("ends", new Integer(SqlParserSymbols.KW_ENDS));
        keywordMap.put("engine", new Integer(SqlParserSymbols.KW_ENGINE));
        keywordMap.put("engines", new Integer(SqlParserSymbols.KW_ENGINES));
        keywordMap.put("enter", new Integer(SqlParserSymbols.KW_ENTER));
        keywordMap.put("errors", new Integer(SqlParserSymbols.KW_ERRORS));
        keywordMap.put("events", new Integer(SqlParserSymbols.KW_EVENTS));
        keywordMap.put("every", new Integer(SqlParserSymbols.KW_EVERY));
        keywordMap.put("except", new Integer(SqlParserSymbols.KW_EXCEPT));
        keywordMap.put("exclude", new Integer(SqlParserSymbols.KW_EXCLUDE));
        keywordMap.put("exists", new Integer(SqlParserSymbols.KW_EXISTS));
        keywordMap.put("explain", new Integer(SqlParserSymbols.KW_DESCRIBE));
        keywordMap.put("export", new Integer(SqlParserSymbols.KW_EXPORT));
        keywordMap.put("extended", new Integer(SqlParserSymbols.KW_EXTENDED));
        keywordMap.put("external", new Integer(SqlParserSymbols.KW_EXTERNAL));
        keywordMap.put("extract", new Integer(SqlParserSymbols.KW_EXTRACT));
        keywordMap.put("false", new Integer(SqlParserSymbols.KW_FALSE));
        keywordMap.put("fast", new Integer(SqlParserSymbols.KW_FAST));
        keywordMap.put("failed_login_attempts", new Integer(SqlParserSymbols.KW_FAILED_LOGIN_ATTEMPTS));
        keywordMap.put("feature", new Integer(SqlParserSymbols.KW_FEATURE));
        keywordMap.put("fields", new Integer(SqlParserSymbols.KW_FIELDS));
        keywordMap.put("file", new Integer(SqlParserSymbols.KW_FILE));
        keywordMap.put("filter", new Integer(SqlParserSymbols.KW_FILTER));
        keywordMap.put("first", new Integer(SqlParserSymbols.KW_FIRST));
        keywordMap.put("float", new Integer(SqlParserSymbols.KW_FLOAT));
        keywordMap.put("follower", new Integer(SqlParserSymbols.KW_FOLLOWER));
        keywordMap.put("following", new Integer(SqlParserSymbols.KW_FOLLOWING));
        keywordMap.put("for", new Integer(SqlParserSymbols.KW_FOR));
        keywordMap.put("force", new Integer(SqlParserSymbols.KW_FORCE));
        keywordMap.put("format", new Integer(SqlParserSymbols.KW_FORMAT));
        keywordMap.put("compress_type", new Integer(SqlParserSymbols.KW_COMPRESS_TYPE));
        keywordMap.put("free", new Integer(SqlParserSymbols.KW_FREE));
        keywordMap.put("from", new Integer(SqlParserSymbols.KW_FROM));
        keywordMap.put("frontend", new Integer(SqlParserSymbols.KW_FRONTEND));
        keywordMap.put("frontends", new Integer(SqlParserSymbols.KW_FRONTENDS));
        keywordMap.put("full", new Integer(SqlParserSymbols.KW_FULL));
        keywordMap.put("function", new Integer(SqlParserSymbols.KW_FUNCTION));
        keywordMap.put("functions", new Integer(SqlParserSymbols.KW_FUNCTIONS));
        keywordMap.put("type_cast", new Integer(SqlParserSymbols.KW_TYPECAST));
        keywordMap.put("generated", new Integer(SqlParserSymbols.KW_GENERATED));
        keywordMap.put("generic", new Integer(SqlParserSymbols.KW_GENERIC));
        keywordMap.put("global", new Integer(SqlParserSymbols.KW_GLOBAL));
        keywordMap.put("grant", new Integer(SqlParserSymbols.KW_GRANT));
        keywordMap.put("grants", new Integer(SqlParserSymbols.KW_GRANTS));
        keywordMap.put("graph", new Integer(SqlParserSymbols.KW_GRAPH));
        keywordMap.put("group", new Integer(SqlParserSymbols.KW_GROUP));
        keywordMap.put("grouping", new Integer(SqlParserSymbols.KW_GROUPING));
        keywordMap.put("groups", new Integer(SqlParserSymbols.KW_GROUPS));
        keywordMap.put("hash", new Integer(SqlParserSymbols.KW_HASH));
        keywordMap.put("having", new Integer(SqlParserSymbols.KW_HAVING));
        keywordMap.put("hdfs", new Integer(SqlParserSymbols.KW_HDFS));
        keywordMap.put("help", new Integer(SqlParserSymbols.KW_HELP));
        keywordMap.put("hll", new Integer(SqlParserSymbols.KW_HLL));
        keywordMap.put("hll_union", new Integer(SqlParserSymbols.KW_HLL_UNION));
        keywordMap.put("hostname", new Integer(SqlParserSymbols.KW_HOSTNAME));
        keywordMap.put("hour", new Integer(SqlParserSymbols.KW_HOUR));
        keywordMap.put("hotspot", new Integer(SqlParserSymbols.KW_HOTSPOT));
        keywordMap.put("hub", new Integer(SqlParserSymbols.KW_HUB));
        keywordMap.put("identified", new Integer(SqlParserSymbols.KW_IDENTIFIED));
        keywordMap.put("if", new Integer(SqlParserSymbols.KW_IF));
        keywordMap.put("immediate", new Integer(SqlParserSymbols.KW_IMMEDIATE));
        keywordMap.put("in", new Integer(SqlParserSymbols.KW_IN));
        keywordMap.put("incremental", new Integer(SqlParserSymbols.KW_INCREMENTAL));
        keywordMap.put("index", new Integer(SqlParserSymbols.KW_INDEX));
        keywordMap.put("indexes", new Integer(SqlParserSymbols.KW_INDEXES));
        keywordMap.put("infile", new Integer(SqlParserSymbols.KW_INFILE));
        keywordMap.put("inner", new Integer(SqlParserSymbols.KW_INNER));
        keywordMap.put("insert", new Integer(SqlParserSymbols.KW_INSERT));
        keywordMap.put("install", new Integer(SqlParserSymbols.KW_INSTALL));
        keywordMap.put("int", new Integer(SqlParserSymbols.KW_INT));
        keywordMap.put("integer", new Integer(SqlParserSymbols.KW_INT));
        keywordMap.put("intermediate", new Integer(SqlParserSymbols.KW_INTERMEDIATE));
        keywordMap.put("intersect", new Integer(SqlParserSymbols.KW_INTERSECT));
        keywordMap.put("interval", new Integer(SqlParserSymbols.KW_INTERVAL));
        keywordMap.put("into", new Integer(SqlParserSymbols.KW_INTO));
        keywordMap.put("ipv4", new Integer(SqlParserSymbols.KW_IPV4));
        keywordMap.put("ipv6", new Integer(SqlParserSymbols.KW_IPV6));
        keywordMap.put("is", new Integer(SqlParserSymbols.KW_IS));
        keywordMap.put("isnull", new Integer(SqlParserSymbols.KW_ISNULL));
        keywordMap.put("isolation", new Integer(SqlParserSymbols.KW_ISOLATION));
        keywordMap.put("job", new Integer(SqlParserSymbols.KW_JOB));
        keywordMap.put("jobs", new Integer(SqlParserSymbols.KW_JOBS));        
        keywordMap.put("join", new Integer(SqlParserSymbols.KW_JOIN));
        keywordMap.put("json", new Integer(SqlParserSymbols.KW_JSON));
        keywordMap.put("jsonb", new Integer(SqlParserSymbols.KW_JSONB));
        keywordMap.put("variant", new Integer(SqlParserSymbols.KW_VARIANT));
        keywordMap.put("key", new Integer(SqlParserSymbols.KW_KEY));
        keywordMap.put("keys", new Integer(SqlParserSymbols.KW_KEYS));
        keywordMap.put("kill", new Integer(SqlParserSymbols.KW_KILL));
        keywordMap.put("label", new Integer(SqlParserSymbols.KW_LABEL));
        keywordMap.put("largeint", new Integer(SqlParserSymbols.KW_LARGEINT));
        keywordMap.put("last", new Integer(SqlParserSymbols.KW_LAST));
        keywordMap.put("lateral", new Integer(SqlParserSymbols.KW_LATERAL));
        keywordMap.put("ldap", new Integer(SqlParserSymbols.KW_LDAP));
        keywordMap.put("ldap_admin_password", new Integer(SqlParserSymbols.KW_LDAP_ADMIN_PASSWORD));
        keywordMap.put("left", new Integer(SqlParserSymbols.KW_LEFT));
        keywordMap.put("less", new Integer(SqlParserSymbols.KW_LESS));
        keywordMap.put("level", new Integer(SqlParserSymbols.KW_LEVEL));
        keywordMap.put("like", new Integer(SqlParserSymbols.KW_LIKE));
        keywordMap.put("limit", new Integer(SqlParserSymbols.KW_LIMIT));
        keywordMap.put("link", new Integer(SqlParserSymbols.KW_LINK));
        keywordMap.put("list", new Integer(SqlParserSymbols.KW_LIST));
        keywordMap.put("load", new Integer(SqlParserSymbols.KW_LOAD));
        keywordMap.put("local", new Integer(SqlParserSymbols.KW_LOCAL));
        keywordMap.put("location", new Integer(SqlParserSymbols.KW_LOCATION));
        keywordMap.put("lock", new Integer(SqlParserSymbols.KW_LOCK));
        keywordMap.put("low_priority", new Integer(SqlParserSymbols.KW_LOW_PRIORITY));
        keywordMap.put("map", new Integer(SqlParserSymbols.KW_MAP));
        keywordMap.put("match", new Integer(SqlParserSymbols.KW_MATCH));
        keywordMap.put("match_any", new Integer(SqlParserSymbols.KW_MATCH_ANY));
        keywordMap.put("match_all", new Integer(SqlParserSymbols.KW_MATCH_ALL));
        keywordMap.put("match_phrase", new Integer(SqlParserSymbols.KW_MATCH_PHRASE));
        keywordMap.put("match_phrase_prefix", new Integer(SqlParserSymbols.KW_MATCH_PHRASE_PREFIX));
        keywordMap.put("match_regexp", new Integer(SqlParserSymbols.KW_MATCH_REGEXP));
        keywordMap.put("match_phrase_edge", new Integer(SqlParserSymbols.KW_MATCH_PHRASE_EDGE));
        keywordMap.put("materialized", new Integer(SqlParserSymbols.KW_MATERIALIZED));
        keywordMap.put("max", new Integer(SqlParserSymbols.KW_MAX));
        keywordMap.put("maxvalue", new Integer(SqlParserSymbols.KW_MAX_VALUE));
        keywordMap.put("merge", new Integer(SqlParserSymbols.KW_MERGE));
        keywordMap.put("migrate", new Integer(SqlParserSymbols.KW_MIGRATE));
        keywordMap.put("migrations", new Integer(SqlParserSymbols.KW_MIGRATIONS));
        keywordMap.put("min", new Integer(SqlParserSymbols.KW_MIN));
        keywordMap.put("minus", new Integer(SqlParserSymbols.KW_MINUS));
        keywordMap.put("minute", new Integer(SqlParserSymbols.KW_MINUTE));
        keywordMap.put("modify", new Integer(SqlParserSymbols.KW_MODIFY));
        keywordMap.put("month", new Integer(SqlParserSymbols.KW_MONTH));
        keywordMap.put("name", new Integer(SqlParserSymbols.KW_NAME));
        keywordMap.put("names", new Integer(SqlParserSymbols.KW_NAMES));
        keywordMap.put("natural", new Integer(SqlParserSymbols.KW_NATURAL));
        keywordMap.put("negative", new Integer(SqlParserSymbols.KW_NEGATIVE));
        keywordMap.put("never", new Integer(SqlParserSymbols.KW_NEVER));
        keywordMap.put("next", new Integer(SqlParserSymbols.KW_NEXT));
        keywordMap.put("no", new Integer(SqlParserSymbols.KW_NO));
        keywordMap.put("not", new Integer(SqlParserSymbols.KW_NOT));
        keywordMap.put("null", new Integer(SqlParserSymbols.KW_NULL));
        keywordMap.put("nulls", new Integer(SqlParserSymbols.KW_NULLS));
        keywordMap.put("observer", new Integer(SqlParserSymbols.KW_OBSERVER));
        keywordMap.put("of", new Integer(SqlParserSymbols.KW_OF));
        keywordMap.put("offset", new Integer(SqlParserSymbols.KW_OFFSET));
        keywordMap.put("on", new Integer(SqlParserSymbols.KW_ON));
        keywordMap.put("only", new Integer(SqlParserSymbols.KW_ONLY));
        keywordMap.put("open", new Integer(SqlParserSymbols.KW_OPEN));
        keywordMap.put("or", new Integer(SqlParserSymbols.KW_OR));
        keywordMap.put("order", new Integer(SqlParserSymbols.KW_ORDER));
        keywordMap.put("outer", new Integer(SqlParserSymbols.KW_OUTER));
        keywordMap.put("outfile", new Integer(SqlParserSymbols.KW_OUTFILE));
        keywordMap.put("over", new Integer(SqlParserSymbols.KW_OVER));
        keywordMap.put("overwrite", new Integer(SqlParserSymbols.KW_OVERWRITE));
        keywordMap.put("parameter", new Integer(SqlParserSymbols.KW_PARAMETER));
        keywordMap.put("partition", new Integer(SqlParserSymbols.KW_PARTITION));
        keywordMap.put("partitions", new Integer(SqlParserSymbols.KW_PARTITIONS));
        keywordMap.put("password", new Integer(SqlParserSymbols.KW_PASSWORD));
        keywordMap.put("password_expire", new Integer(SqlParserSymbols.KW_PASSWORD_EXPIRE));
        keywordMap.put("password_history", new Integer(SqlParserSymbols.KW_PASSWORD_HISTORY));
        keywordMap.put("password_reuse", new Integer(SqlParserSymbols.KW_PASSWORD_REUSE));
        keywordMap.put("password_lock_time", new Integer(SqlParserSymbols.KW_PASSWORD_LOCK_TIME));
        keywordMap.put("path", new Integer(SqlParserSymbols.KW_PATH));
        keywordMap.put("pause", new Integer(SqlParserSymbols.KW_PAUSE));
        keywordMap.put("period", new Integer(SqlParserSymbols.KW_PERIOD));
        keywordMap.put("plugin", new Integer(SqlParserSymbols.KW_PLUGIN));
        keywordMap.put("plugins", new Integer(SqlParserSymbols.KW_PLUGINS));
        keywordMap.put("policy", new Integer(SqlParserSymbols.KW_POLICY));
        keywordMap.put("preceding", new Integer(SqlParserSymbols.KW_PRECEDING));
        keywordMap.put("percent", new Integer(SqlParserSymbols.KW_PERCENT));
        keywordMap.put("privileges", new Integer(SqlParserSymbols.KW_PRIVILEGES));
        keywordMap.put("proc", new Integer(SqlParserSymbols.KW_PROC));
        keywordMap.put("procedure", new Integer(SqlParserSymbols.KW_PROCEDURE));
        keywordMap.put("processlist", new Integer(SqlParserSymbols.KW_PROCESSLIST));
        keywordMap.put("profile", new Integer(SqlParserSymbols.KW_PROFILE));
        keywordMap.put("properties", new Integer(SqlParserSymbols.KW_PROPERTIES));
        keywordMap.put("conditions", new Integer(SqlParserSymbols.KW_CONDITIONS));
        keywordMap.put("actions", new Integer(SqlParserSymbols.KW_ACTIONS));
        keywordMap.put("set_session_variable", new Integer(SqlParserSymbols.KW_SET_SESSION_VAR));
        keywordMap.put("property", new Integer(SqlParserSymbols.KW_PROPERTY));
        keywordMap.put("quantile_state", new Integer(SqlParserSymbols.KW_QUANTILE_STATE));
        keywordMap.put("quantile_union", new Integer(SqlParserSymbols.KW_QUANTILE_UNION));
        keywordMap.put("agg_state", new Integer(SqlParserSymbols.KW_AGG_STATE));
        keywordMap.put("query", new Integer(SqlParserSymbols.KW_QUERY));
        keywordMap.put("quota", new Integer(SqlParserSymbols.KW_QUOTA));
        keywordMap.put("random", new Integer(SqlParserSymbols.KW_RANDOM));
        keywordMap.put("range", new Integer(SqlParserSymbols.KW_RANGE));
        keywordMap.put("read", new Integer(SqlParserSymbols.KW_READ));
        keywordMap.put("real", new Integer(SqlParserSymbols.KW_DOUBLE));
        keywordMap.put("rebalance", new Integer(SqlParserSymbols.KW_REBALANCE));
        keywordMap.put("recent", new Integer(SqlParserSymbols.KW_RECENT));
        keywordMap.put("recover", new Integer(SqlParserSymbols.KW_RECOVER));
        keywordMap.put("recycle", new Integer(SqlParserSymbols.KW_RECYCLE));
        keywordMap.put("refresh", new Integer(SqlParserSymbols.KW_REFRESH));
        keywordMap.put("regexp", new Integer(SqlParserSymbols.KW_REGEXP));
        keywordMap.put("release", new Integer(SqlParserSymbols.KW_RELEASE));
        keywordMap.put("rename", new Integer(SqlParserSymbols.KW_RENAME));
        keywordMap.put("repair", new Integer(SqlParserSymbols.KW_REPAIR));
        keywordMap.put("repeatable", new Integer(SqlParserSymbols.KW_REPEATABLE));
        keywordMap.put("replace", new Integer(SqlParserSymbols.KW_REPLACE));
        keywordMap.put("replace_if_not_null", new Integer(SqlParserSymbols.KW_REPLACE_IF_NOT_NULL));
        keywordMap.put("replica", new Integer(SqlParserSymbols.KW_REPLICA));
        keywordMap.put("repositories", new Integer(SqlParserSymbols.KW_REPOSITORIES));
        keywordMap.put("repository", new Integer(SqlParserSymbols.KW_REPOSITORY));
        keywordMap.put("resource", new Integer(SqlParserSymbols.KW_RESOURCE));
        keywordMap.put("resources", new Integer(SqlParserSymbols.KW_RESOURCES));
        keywordMap.put("restore", new Integer(SqlParserSymbols.KW_RESTORE));
        keywordMap.put("resume", new Integer(SqlParserSymbols.KW_RESUME));
        keywordMap.put("returns", new Integer(SqlParserSymbols.KW_RETURNS));
        keywordMap.put("revoke", new Integer(SqlParserSymbols.KW_REVOKE));
        keywordMap.put("right", new Integer(SqlParserSymbols.KW_RIGHT));
        keywordMap.put("rlike", new Integer(SqlParserSymbols.KW_REGEXP));
        keywordMap.put("role", new Integer(SqlParserSymbols.KW_ROLE));
        keywordMap.put("roles", new Integer(SqlParserSymbols.KW_ROLES));
        keywordMap.put("rollback", new Integer(SqlParserSymbols.KW_ROLLBACK));
        keywordMap.put("rollup", new Integer(SqlParserSymbols.KW_ROLLUP));
        keywordMap.put("routine", new Integer(SqlParserSymbols.KW_ROUTINE));
        keywordMap.put("row", new Integer(SqlParserSymbols.KW_ROW));
        keywordMap.put("rows", new Integer(SqlParserSymbols.KW_ROWS));
        keywordMap.put("s3", new Integer(SqlParserSymbols.KW_S3));
        keywordMap.put("schema", new Integer(SqlParserSymbols.KW_SCHEMA));
        keywordMap.put("schedule", new Integer(SqlParserSymbols.KW_SCHEDULE));
        keywordMap.put("schemas", new Integer(SqlParserSymbols.KW_SCHEMAS));
        keywordMap.put("second", new Integer(SqlParserSymbols.KW_SECOND));
        keywordMap.put("select", new Integer(SqlParserSymbols.KW_SELECT));
        keywordMap.put("semi", new Integer(SqlParserSymbols.KW_SEMI));
        keywordMap.put("serializable", new Integer(SqlParserSymbols.KW_SERIALIZABLE));
        keywordMap.put("session", new Integer(SqlParserSymbols.KW_SESSION));
        keywordMap.put("set", new Integer(SqlParserSymbols.KW_SET));
        keywordMap.put("sets", new Integer(SqlParserSymbols.KW_SETS));
        keywordMap.put("show", new Integer(SqlParserSymbols.KW_SHOW));
        keywordMap.put("signed", new Integer(SqlParserSymbols.KW_SIGNED));
        keywordMap.put("skew", new Integer(SqlParserSymbols.KW_SKEW));
        keywordMap.put("smallint", new Integer(SqlParserSymbols.KW_SMALLINT));
        keywordMap.put("snapshot", new Integer(SqlParserSymbols.KW_SNAPSHOT));
        keywordMap.put("soname", new Integer(SqlParserSymbols.KW_SONAME));
        keywordMap.put("split", new Integer(SqlParserSymbols.KW_SPLIT));
        keywordMap.put("sql", new Integer(SqlParserSymbols.KW_SQL));
        keywordMap.put("sql_block_rule", new Integer(SqlParserSymbols.KW_SQL_BLOCK_RULE));
        keywordMap.put("sample", new Integer(SqlParserSymbols.KW_SAMPLE));
        keywordMap.put("start", new Integer(SqlParserSymbols.KW_START));
        keywordMap.put("starts", new Integer(SqlParserSymbols.KW_STARTS));
        keywordMap.put("stats", new Integer(SqlParserSymbols.KW_STATS));
        keywordMap.put("status", new Integer(SqlParserSymbols.KW_STATUS));
        keywordMap.put("stop", new Integer(SqlParserSymbols.KW_STOP));
        keywordMap.put("storage", new Integer(SqlParserSymbols.KW_STORAGE));
        keywordMap.put("vault", new Integer(SqlParserSymbols.KW_VAULT));
        keywordMap.put("vaults", new Integer(SqlParserSymbols.KW_VAULTS));
        keywordMap.put("stream", new Integer(SqlParserSymbols.KW_STREAM));
        keywordMap.put("streaming", new Integer(SqlParserSymbols.KW_STREAMING));
        keywordMap.put("string", new Integer(SqlParserSymbols.KW_STRING));
        keywordMap.put("struct", new Integer(SqlParserSymbols.KW_STRUCT));
        keywordMap.put("sum", new Integer(SqlParserSymbols.KW_SUM));
        keywordMap.put("superuser", new Integer(SqlParserSymbols.KW_SUPERUSER));
        keywordMap.put("switch", new Integer(SqlParserSymbols.KW_SWITCH));
        keywordMap.put("sync", new Integer(SqlParserSymbols.KW_SYNC));
        keywordMap.put("system", new Integer(SqlParserSymbols.KW_SYSTEM));
        keywordMap.put("table", new Integer(SqlParserSymbols.KW_TABLE));
        keywordMap.put("tables", new Integer(SqlParserSymbols.KW_TABLES));
        keywordMap.put("tablesample", new Integer(SqlParserSymbols.KW_TABLESAMPLE));
        keywordMap.put("tablet", new Integer(SqlParserSymbols.KW_TABLET));
        keywordMap.put("tablets", new Integer(SqlParserSymbols.KW_TABLETS));
        keywordMap.put("task", new Integer(SqlParserSymbols.KW_TASK));
        keywordMap.put("tasks", new Integer(SqlParserSymbols.KW_TASKS));        
        keywordMap.put("temporary", new Integer(SqlParserSymbols.KW_TEMPORARY));
        keywordMap.put("terminated", new Integer(SqlParserSymbols.KW_TERMINATED));
        keywordMap.put("text", new Integer(SqlParserSymbols.KW_TEXT));
        keywordMap.put("than", new Integer(SqlParserSymbols.KW_THAN));
        keywordMap.put("then", new Integer(SqlParserSymbols.KW_THEN));
        keywordMap.put("timestamp", new Integer(SqlParserSymbols.KW_TIMESTAMP));
        keywordMap.put("tinyint", new Integer(SqlParserSymbols.KW_TINYINT));
        keywordMap.put("to", new Integer(SqlParserSymbols.KW_TO));
        keywordMap.put("transaction", new Integer(SqlParserSymbols.KW_TRANSACTION));
        keywordMap.put("trash", new Integer(SqlParserSymbols.KW_TRASH));
        keywordMap.put("triggers", new Integer(SqlParserSymbols.KW_TRIGGERS));
        keywordMap.put("trim", new Integer(SqlParserSymbols.KW_TRIM));
        keywordMap.put("true", new Integer(SqlParserSymbols.KW_TRUE));
        keywordMap.put("truncate", new Integer(SqlParserSymbols.KW_TRUNCATE));
        keywordMap.put("type", new Integer(SqlParserSymbols.KW_TYPE));
        keywordMap.put("types", new Integer(SqlParserSymbols.KW_TYPES));
        keywordMap.put("unbounded", new Integer(SqlParserSymbols.KW_UNBOUNDED));
        keywordMap.put("uncommitted", new Integer(SqlParserSymbols.KW_UNCOMMITTED));
        keywordMap.put("uninstall", new Integer(SqlParserSymbols.KW_UNINSTALL));
        keywordMap.put("union", new Integer(SqlParserSymbols.KW_UNION));
        keywordMap.put("unique", new Integer(SqlParserSymbols.KW_UNIQUE));
        keywordMap.put("unlock", new Integer(SqlParserSymbols.KW_UNLOCK));
        keywordMap.put("unsigned", new Integer(SqlParserSymbols.KW_UNSIGNED));
        keywordMap.put("update", new Integer(SqlParserSymbols.KW_UPDATE));
        keywordMap.put("use", new Integer(SqlParserSymbols.KW_USE));
        keywordMap.put("user", new Integer(SqlParserSymbols.KW_USER));
        keywordMap.put("using", new Integer(SqlParserSymbols.KW_USING));
        keywordMap.put("value", new Integer(SqlParserSymbols.KW_VALUE));
        keywordMap.put("values", new Integer(SqlParserSymbols.KW_VALUES));
        keywordMap.put("varchar", new Integer(SqlParserSymbols.KW_VARCHAR));
        keywordMap.put("variables", new Integer(SqlParserSymbols.KW_VARIABLES));
        keywordMap.put("verbose", new Integer(SqlParserSymbols.KW_VERBOSE));
        keywordMap.put("version", new Integer(SqlParserSymbols.KW_VERSION));
        keywordMap.put("view", new Integer(SqlParserSymbols.KW_VIEW));
        keywordMap.put("views", new Integer(SqlParserSymbols.KW_VIEWS));
        keywordMap.put("warnings", new Integer(SqlParserSymbols.KW_WARNINGS));
        keywordMap.put("week", new Integer(SqlParserSymbols.KW_WEEK));
        keywordMap.put("when", new Integer(SqlParserSymbols.KW_WHEN));
        keywordMap.put("where", new Integer(SqlParserSymbols.KW_WHERE));
        keywordMap.put("whitelist", new Integer(SqlParserSymbols.KW_WHITELIST));
        keywordMap.put("with", new Integer(SqlParserSymbols.KW_WITH));
        keywordMap.put("work", new Integer(SqlParserSymbols.KW_WORK));
        keywordMap.put("workload", new Integer(SqlParserSymbols.KW_WORKLOAD));
        keywordMap.put("write", new Integer(SqlParserSymbols.KW_WRITE));
        keywordMap.put("year", new Integer(SqlParserSymbols.KW_YEAR));
        keywordMap.put("stage", new Integer(SqlParserSymbols.KW_STAGE));
        keywordMap.put("stages", new Integer(SqlParserSymbols.KW_STAGES));
        keywordMap.put("mtmv", new Integer(SqlParserSymbols.KW_MTMV));
        keywordMap.put("histogram", new Integer(SqlParserSymbols.KW_HISTOGRAM));
        keywordMap.put("auto", new Integer(SqlParserSymbols.KW_AUTO));
        keywordMap.put("prepare", new Integer(SqlParserSymbols.KW_PREPARE));
        keywordMap.put("execute", new Integer(SqlParserSymbols.KW_EXECUTE));
        keywordMap.put("warm", new Integer(SqlParserSymbols.KW_WARM));
        keywordMap.put("up", new Integer(SqlParserSymbols.KW_UP));
        keywordMap.put("lines", new Integer(SqlParserSymbols.KW_LINES));
        keywordMap.put("ignore", new Integer(SqlParserSymbols.KW_IGNORE));
        keywordMap.put("expired", new Integer(SqlParserSymbols.KW_EXPIRED));
        keywordMap.put("cron", new Integer(SqlParserSymbols.KW_CRON));
        keywordMap.put("convert_light_schema_change_process", new Integer(SqlParserSymbols.KW_CONVERT_LSC));
        keywordMap.put("unset", new Integer(SqlParserSymbols.KW_UNSET));
        keywordMap.put("variable", new Integer(SqlParserSymbols.KW_VARIABLE));
   }
    
  // map from token id to token description
  public static final Map<Integer, String> tokenIdMap =
      new HashMap<Integer, String>();
  static {
    Iterator<Map.Entry<String, Integer>> it = keywordMap.entrySet().iterator();
    while (it.hasNext()) {
      Map.Entry<String, Integer> pairs = (Map.Entry<String, Integer>) it.next();
      tokenIdMap.put(pairs.getValue(), pairs.getKey().toUpperCase());
    }

    // add non-keyword tokens
    tokenIdMap.put(new Integer(SqlParserSymbols.IDENT), "IDENTIFIER");
    tokenIdMap.put(new Integer(SqlParserSymbols.COMMA), "COMMA");
    tokenIdMap.put(new Integer(SqlParserSymbols.ARROW), "->");
    tokenIdMap.put(new Integer(SqlParserSymbols.BITNOT), "~");
    tokenIdMap.put(new Integer(SqlParserSymbols.LPAREN), "(");
    tokenIdMap.put(new Integer(SqlParserSymbols.RPAREN), ")");
    tokenIdMap.put(new Integer(SqlParserSymbols.LBRACKET), "[");
    tokenIdMap.put(new Integer(SqlParserSymbols.RBRACKET), "]");
    tokenIdMap.put(new Integer(SqlParserSymbols.LBRACE), "{");
    tokenIdMap.put(new Integer(SqlParserSymbols.RBRACE), "}");
    tokenIdMap.put(new Integer(SqlParserSymbols.COLON), ":");
    tokenIdMap.put(new Integer(SqlParserSymbols.SEMICOLON), ";");
    tokenIdMap.put(new Integer(SqlParserSymbols.FLOATINGPOINT_LITERAL),
        "FLOATING POINT LITERAL");
    tokenIdMap.put(new Integer(SqlParserSymbols.INTEGER_LITERAL), "INTEGER LITERAL");
    tokenIdMap.put(new Integer(SqlParserSymbols.LARGE_INTEGER_LITERAL), "INTEGER LITERAL");
    tokenIdMap.put(new Integer(SqlParserSymbols.DECIMAL_LITERAL), "DECIMAL LITERAL");
    tokenIdMap.put(new Integer(SqlParserSymbols.NOT), "!");
    tokenIdMap.put(new Integer(SqlParserSymbols.LESSTHAN), "<");
    tokenIdMap.put(new Integer(SqlParserSymbols.GREATERTHAN), ">");
    tokenIdMap.put(new Integer(SqlParserSymbols.UNMATCHED_STRING_LITERAL),
        "UNMATCHED STRING LITERAL");
    tokenIdMap.put(new Integer(SqlParserSymbols.MOD), "%");
    tokenIdMap.put(new Integer(SqlParserSymbols.ADD), "+");
    tokenIdMap.put(new Integer(SqlParserSymbols.DIVIDE), "/");
    tokenIdMap.put(new Integer(SqlParserSymbols.EQUAL), "=");
    tokenIdMap.put(new Integer(SqlParserSymbols.STAR), "*");
    tokenIdMap.put(new Integer(SqlParserSymbols.AT), "@");
    tokenIdMap.put(new Integer(SqlParserSymbols.BITOR), "|");
    tokenIdMap.put(new Integer(SqlParserSymbols.DOTDOTDOT), "...");
    tokenIdMap.put(new Integer(SqlParserSymbols.DOT), ".");
    tokenIdMap.put(new Integer(SqlParserSymbols.STRING_LITERAL), "STRING LITERAL");
    tokenIdMap.put(new Integer(SqlParserSymbols.EOF), "EOF");
    tokenIdMap.put(new Integer(SqlParserSymbols.SUBTRACT), "-");
    tokenIdMap.put(new Integer(SqlParserSymbols.BITAND), "&");
    tokenIdMap.put(new Integer(SqlParserSymbols.error), "ERROR");
    tokenIdMap.put(new Integer(SqlParserSymbols.BITXOR), "^");
    tokenIdMap.put(new Integer(SqlParserSymbols.NUMERIC_OVERFLOW), "NUMERIC OVERFLOW");
    tokenIdMap.put(new Integer(SqlParserSymbols.PLACEHOLDER), "?");
  }

  public static boolean isKeyword(Integer tokenId) {
    String token = tokenIdMap.get(tokenId);
    return keywordMap.containsKey(token);
    /* return keywordMap.containsKey(token.toLowerCase()); */
  }

  public static boolean isKeyword(String str) {
        if (str == null) {
            return false;
        }
	    return keywordMap.containsKey(str.toLowerCase());
  }

  private Symbol newToken(int id, Object value) {
    return new Symbol(id, yyline+1, yycolumn+1, value);
  }

  private static String escapeBackSlash(String str) {
      StringWriter writer = new StringWriter();
      int strLen = str.length();
      for (int i = 0; i < strLen; ++i) {
          char c = str.charAt(i);
          if (c == '\\' && (i + 1) < strLen) {
              switch (str.charAt(i + 1)) {
              case 'n':
                  writer.append('\n');
                  break;
              case 't':
                  writer.append('\t');
                  break;
              case 'r':
                  writer.append('\r');
                  break;
              case 'b':
                  writer.append('\b');
                  break;
              case '0':
                  writer.append('\0'); // Ascii null
                  break;
              case 'Z': // ^Z must be escaped on Win32
                  writer.append('\032');
                  break;
              case '_':
              case '%':
                  writer.append('\\'); // remember prefix for wildcard
                  /* Fall through */
              default:
                  writer.append(str.charAt(i + 1));
                  break;
              }
              i++;
          } else {
              writer.append(c);
          }
      }

      return writer.toString();
  }


  /**
   * Creates a new scanner
   * There is also a java.io.InputStream version of this constructor.
   *
   * @param   in  the java.io.Reader to read input from.
   */
  public SqlScanner(java.io.Reader in, Long sql_mode) {
      this.sql_mode = sql_mode;
    this.zzReader = in;
  }

  /**
   * Creates a new scanner.
   * There is also java.io.Reader version of this constructor.
   *
   * @param   in  the java.io.Inputstream to read input from.
   */
  public SqlScanner(java.io.InputStream in, Long sql_mode) {
    this(new java.io.InputStreamReader(in), sql_mode);
  }

  /** 
   * Unpacks the compressed character translation table.
   *
   * @param packed   the packed character translation table
   * @return         the unpacked character translation table
   */
  private static char [] zzUnpackCMap(String packed) {
    char [] map = new char[0x10000];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 2252) {
      int  count = packed.charAt(i++);
      char value = packed.charAt(i++);
      do map[j++] = value; while (--count > 0);
    }
    return map;
  }


  /**
   * Refills the input buffer.
   *
   * @return      <code>false</code>, iff there was new input.
   * 
   * @exception   java.io.IOException  if any I/O-Error occurs
   */
  private boolean zzRefill() throws java.io.IOException {

    /* first: make room (if you can) */
    if (zzStartRead > 0) {
      System.arraycopy(zzBuffer, zzStartRead,
                       zzBuffer, 0,
                       zzEndRead-zzStartRead);

      /* translate stored positions */
      zzEndRead-= zzStartRead;
      zzCurrentPos-= zzStartRead;
      zzMarkedPos-= zzStartRead;
      zzStartRead = 0;
    }

    /* is the buffer big enough? */
    if (zzCurrentPos >= zzBuffer.length) {
      /* if not: blow it up */
      char newBuffer[] = new char[zzCurrentPos*2];
      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
      zzBuffer = newBuffer;
    }

    /* finally: fill the buffer with new input */
    int numRead = zzReader.read(zzBuffer, zzEndRead,
                                            zzBuffer.length-zzEndRead);

    if (numRead > 0) {
      zzEndRead+= numRead;
      return false;
    }
    // unlikely but not impossible: read 0 characters, but not at end of stream    
    if (numRead == 0) {
      int c = zzReader.read();
      if (c == -1) {
        return true;
      } else {
        zzBuffer[zzEndRead++] = (char) c;
        return false;
      }     
    }

	// numRead < 0
    return true;
  }

    
  /**
   * Closes the input stream.
   */
  public final void yyclose() throws java.io.IOException {
    zzAtEOF = true;            /* indicate end of file */
    zzEndRead = zzStartRead;  /* invalidate buffer    */

    if (zzReader != null)
      zzReader.close();
  }


  /**
   * Resets the scanner to read from a new input stream.
   * Does not close the old reader.
   *
   * All internal variables are reset, the old input stream 
   * <b>cannot</b> be reused (internal buffer is discarded and lost).
   * Lexical state is set to <tt>ZZ_INITIAL</tt>.
   *
   * @param reader   the new input stream 
   */
  public final void yyreset(java.io.Reader reader) {
    zzReader = reader;
    zzAtBOL  = true;
    zzAtEOF  = false;
    zzEOFDone = false;
    zzEndRead = zzStartRead = 0;
    zzCurrentPos = zzMarkedPos = 0;
    yyline = yychar = yycolumn = 0;
    zzLexicalState = YYINITIAL;
  }


  /**
   * Returns the current lexical state.
   */
  public final int yystate() {
    return zzLexicalState;
  }


  /**
   * Enters a new lexical state
   *
   * @param newState the new lexical state
   */
  public final void yybegin(int newState) {
    zzLexicalState = newState;
  }


  /**
   * Returns the text matched by the current regular expression.
   */
  public final String yytext() {
    return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
  }


  /**
   * Returns the character at position <tt>pos</tt> from the 
   * matched text. 
   * 
   * It is equivalent to yytext().charAt(pos), but faster
   *
   * @param pos the position of the character to fetch. 
   *            A value from 0 to yylength()-1.
   *
   * @return the character at position pos
   */
  public final char yycharat(int pos) {
    return zzBuffer[zzStartRead+pos];
  }


  /**
   * Returns the length of the matched text region.
   */
  public final int yylength() {
    return zzMarkedPos-zzStartRead;
  }


  /**
   * Reports an error that occured while scanning.
   *
   * In a wellformed scanner (no or only correct usage of 
   * yypushback(int) and a match-all fallback rule) this method 
   * will only be called with things that "Can't Possibly Happen".
   * If this method is called, something is seriously wrong
   * (e.g. a JFlex bug producing a faulty scanner etc.).
   *
   * Usual syntax/scanner level error handling should be done
   * in error fallback rules.
   *
   * @param   errorCode  the code of the errormessage to display
   */
  private void zzScanError(int errorCode) {
    String message;
    try {
      message = ZZ_ERROR_MSG[errorCode];
    }
    catch (ArrayIndexOutOfBoundsException e) {
      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
    }

    throw new Error(message);
  } 


  /**
   * Pushes the specified amount of characters back into the input stream.
   *
   * They will be read again by then next call of the scanning method
   *
   * @param number  the number of characters to be read again.
   *                This number must not be greater than yylength()!
   */
  public void yypushback(int number)  {
    if ( number > yylength() )
      zzScanError(ZZ_PUSHBACK_2BIG);

    zzMarkedPos -= number;
  }


  /**
   * Contains user EOF-code, which will be executed exactly once,
   * when the end of file is reached
   */
  private void zzDoEOF() throws java.io.IOException {
    if (!zzEOFDone) {
      zzEOFDone = true;
      yyclose();
    }
  }


  /**
   * Resumes scanning until the next regular expression is matched,
   * the end of input is encountered or an I/O-Error occurs.
   *
   * @return      the next token
   * @exception   java.io.IOException  if any I/O-Error occurs
   */
  public java_cup.runtime.Symbol next_token() throws java.io.IOException {
    int zzInput;
    int zzAction;

    // cached fields:
    int zzCurrentPosL;
    int zzMarkedPosL;
    int zzEndReadL = zzEndRead;
    char [] zzBufferL = zzBuffer;
    char [] zzCMapL = ZZ_CMAP;

    int [] zzTransL = ZZ_TRANS;
    int [] zzRowMapL = ZZ_ROWMAP;
    int [] zzAttrL = ZZ_ATTRIBUTE;

    while (true) {
      zzMarkedPosL = zzMarkedPos;

      boolean zzR = false;
      for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL;
                                                             zzCurrentPosL++) {
        switch (zzBufferL[zzCurrentPosL]) {
        case '\u000B':
        case '\u000C':
        case '\u0085':
        case '\u2028':
        case '\u2029':
          yyline++;
          yycolumn = 0;
          zzR = false;
          break;
        case '\r':
          yyline++;
          yycolumn = 0;
          zzR = true;
          break;
        case '\n':
          if (zzR)
            zzR = false;
          else {
            yyline++;
            yycolumn = 0;
          }
          break;
        default:
          zzR = false;
          yycolumn++;
        }
      }

      if (zzR) {
        // peek one character ahead if it is \n (if we have counted one line too much)
        boolean zzPeek;
        if (zzMarkedPosL < zzEndReadL)
          zzPeek = zzBufferL[zzMarkedPosL] == '\n';
        else if (zzAtEOF)
          zzPeek = false;
        else {
          boolean eof = zzRefill();
          zzEndReadL = zzEndRead;
          zzMarkedPosL = zzMarkedPos;
          zzBufferL = zzBuffer;
          if (eof) 
            zzPeek = false;
          else 
            zzPeek = zzBufferL[zzMarkedPosL] == '\n';
        }
        if (zzPeek) yyline--;
      }
      zzAction = -1;

      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
  
      zzState = ZZ_LEXSTATE[zzLexicalState];


      zzForAction: {
        while (true) {
    
          if (zzCurrentPosL < zzEndReadL)
            zzInput = zzBufferL[zzCurrentPosL++];
          else if (zzAtEOF) {
            zzInput = YYEOF;
            break zzForAction;
          }
          else {
            // store back cached positions
            zzCurrentPos  = zzCurrentPosL;
            zzMarkedPos   = zzMarkedPosL;
            boolean eof = zzRefill();
            // get translated positions and possibly new buffer
            zzCurrentPosL  = zzCurrentPos;
            zzMarkedPosL   = zzMarkedPos;
            zzBufferL      = zzBuffer;
            zzEndReadL     = zzEndRead;
            if (eof) {
              zzInput = YYEOF;
              break zzForAction;
            }
            else {
              zzInput = zzBufferL[zzCurrentPosL++];
            }
          }
          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
          if (zzNext == -1) break zzForAction;
          zzState = zzNext;

          int zzAttributes = zzAttrL[zzState];
          if ( (zzAttributes & 1) == 1 ) {
            zzAction = zzState;
            zzMarkedPosL = zzCurrentPosL;
            if ( (zzAttributes & 8) == 8 ) break zzForAction;
          }

        }
      }

      // store back cached position
      zzMarkedPos = zzMarkedPosL;

      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
        case 1: 
          { /* ignore */
          }
        case 41: break;
        case 30: 
          { yybegin(YYINITIAL);
  return newToken(SqlParserSymbols.COMMENTED_PLAN_HINT_END, null);
          }
        case 42: break;
        case 7: 
          { return newToken(SqlParserSymbols.DOT, null);
          }
        case 43: break;
        case 9: 
          { return newToken(SqlParserSymbols.SUBTRACT, null);
          }
        case 44: break;
        case 37: 
          { return newToken(SqlParserSymbols.SET_VAR, null);
          }
        case 45: break;
        case 10: 
          { return newToken(SqlParserSymbols.DIVIDE, null);
          }
        case 46: break;
        case 11: 
          { return newToken(SqlParserSymbols.STAR, null);
          }
        case 47: break;
        case 13: 
          { return newToken(SqlParserSymbols.COMMA, null);
          }
        case 48: break;
        case 21: 
          { return newToken(SqlParserSymbols.LBRACE, null);
          }
        case 49: break;
        case 14: 
          { return newToken(SqlParserSymbols.AT, null);
          }
        case 50: break;
        case 23: 
          { return newToken(SqlParserSymbols.MOD, null);
          }
        case 51: break;
        case 40: 
          { return newToken(SqlParserSymbols.COMMENTED_PLAN_HINT_START, null);
          }
        case 52: break;
        case 6: 
          { return newToken(SqlParserSymbols.UNMATCHED_STRING_LITERAL, null);
          }
        case 53: break;
        case 29: 
          { return newToken(SqlParserSymbols.PLACEHOLDER, null);
          }
        case 54: break;
        case 26: 
          { return newToken(SqlParserSymbols.EQUAL, null);
          }
        case 55: break;
        case 35: 
          { return newToken(SqlParserSymbols.ARROW, null);
          }
        case 56: break;
        case 39: 
          { yybegin(EOLHINT);
  return newToken(SqlParserSymbols.COMMENTED_PLAN_HINT_START, null);
          }
        case 57: break;
        case 25: 
          { return newToken(SqlParserSymbols.BITNOT, null);
          }
        case 58: break;
        case 28: 
          { return newToken(SqlParserSymbols.LESSTHAN, null);
          }
        case 59: break;
        case 27: 
          { return newToken(SqlParserSymbols.NOT, null);
          }
        case 60: break;
        case 15: 
          { return newToken(SqlParserSymbols.LPAREN, null);
          }
        case 61: break;
        case 22: 
          { return newToken(SqlParserSymbols.RBRACE, null);
          }
        case 62: break;
        case 20: 
          { return newToken(SqlParserSymbols.RBRACKET, null);
          }
        case 63: break;
        case 38: 
          { return newToken(SqlParserSymbols.DOTDOTDOT, null);
          }
        case 64: break;
        case 12: 
          { return newToken(SqlParserSymbols.GREATERTHAN, null);
          }
        case 65: break;
        case 8: 
          { return newToken(SqlParserSymbols.ADD, null);
          }
        case 66: break;
        case 17: 
          { return newToken(SqlParserSymbols.COLON, null);
          }
        case 67: break;
        case 32: 
          { return newToken(SqlParserSymbols.STRING_LITERAL,
      escapeBackSlash(yytext().substring(1, yytext().length()-1)).replaceAll("''", "'"));
          }
        case 68: break;
        case 4: 
          { return newToken(SqlParserSymbols.BITAND, null);
          }
        case 69: break;
        case 34: 
          { BigDecimal decimal_val;
  try {
    decimal_val = new BigDecimal(yytext());
  } catch (NumberFormatException e) {
    return newToken(SqlParserSymbols.NUMERIC_OVERFLOW, yytext());
  }

  return newToken(SqlParserSymbols.DECIMAL_LITERAL, decimal_val);
          }
        case 70: break;
        case 19: 
          { return newToken(SqlParserSymbols.LBRACKET, null);
          }
        case 71: break;
        case 36: 
          { return newToken(SqlParserSymbols.COMMENTED_PLAN_HINT_END, null);
          }
        case 72: break;
        case 2: 
          { BigInteger val = null;
    try {
        val = new BigInteger(yytext());
    } catch (NumberFormatException e) {
        return newToken(SqlParserSymbols.NUMERIC_OVERFLOW, yytext());
    }

    // Note: val is positive, because we do not recognize minus charactor in 'IntegerLiteral'
    // -2^63 will be recognize as largeint(__int128)
    if (val.compareTo(LONG_MAX) <= 0) {
        return newToken(SqlParserSymbols.INTEGER_LITERAL, val.longValue());
    }
    if (val.compareTo(LARGEINT_MAX_ABS) <= 0) {
        return newToken(SqlParserSymbols.LARGE_INTEGER_LITERAL, val.toString());
    }
    return newToken(SqlParserSymbols.NUMERIC_OVERFLOW, yytext());
          }
        case 73: break;
        case 31: 
          { // Remove the quotes
    String trimmedIdent = yytext().substring(1, yytext().length() - 1);
    return newToken(SqlParserSymbols.IDENT, SqlUtils.escapeUnquote(trimmedIdent));
          }
        case 74: break;
        case 16: 
          { return newToken(SqlParserSymbols.RPAREN, null);
          }
        case 75: break;
        case 5: 
          { return newToken(SqlParserSymbols.BITOR, null);
          }
        case 76: break;
        case 24: 
          { return newToken(SqlParserSymbols.BITXOR, null);
          }
        case 77: break;
        case 33: 
          { return newToken(SqlParserSymbols.STRING_LITERAL,
      escapeBackSlash(yytext().substring(1, yytext().length()-1)).replaceAll("\"\"", "\""));
          }
        case 78: break;
        case 18: 
          { return newToken(SqlParserSymbols.SEMICOLON, null);
          }
        case 79: break;
        case 3: 
          { String text = yytext();
  Integer kw_id = keywordMap.get(text.toLowerCase());
  /* Integer kw_id = keywordMap.get(text); */
  if (kw_id != null) {
    // if MODE_PIPES_AS_CONCAT is not active, treat '||' symbol as same as 'or' symbol
    if ((kw_id == SqlParserSymbols.KW_PIPE) &&
      ((this.sql_mode & SqlModeHelper.MODE_PIPES_AS_CONCAT) == 0)) {
      return newToken(SqlParserSymbols.KW_OR, text);
    }
    return newToken(kw_id.intValue(), text);
  } else {
    return newToken(SqlParserSymbols.IDENT, text);
  }
          }
        case 80: break;
        default: 
          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
            zzAtEOF = true;
            zzDoEOF();
              {     return newToken(SqlParserSymbols.EOF, null);
 }
          } 
          else {
            zzScanError(ZZ_NO_MATCH);
          }
      }
    }
  }


}