/********************************************************************  
//
// @@@ START COPYRIGHT @@@
//
// 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.
//
// @@@ END COPYRIGHT @@@
********************************************************************/

%a 60000
%o 30000
%p 30000
%e 30000
%n 30000
%{
/* -*-C++-*-
 *****************************************************************************
 *
 * File:          sqlci_lex.l

 * Description:  
 *               
 *               
 * Created:      4/15/95

 * Language:     C++
 * Status:       $State: Exp $
 *
 *
 *
 *
 *****************************************************************************
 */


#include "ComGuardianFileNameParts.h"
#include "Platform.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "SqlciCmd.h"
#include "str.h"
#include "Sqlci.h"
#define yylval sqlcilval
#define yyerror sqlcierror
#include "sqlci_yacc.h"
#include "SqlciParseGlobals.h"

static int token_to_return;

#define return_IDENT_or_TOKEN(token_id, set_ident)  \
{\
 if (SqlciParse_IdentifierExpected)\
   {\
     if (yylval.stringval_type)\
       delete [] yylval.stringval_type;\
     yylval.stringval_type = new char[strlen(yytext)+1];\
     strcpy(yylval.stringval_type, yytext);\
     token_to_return = IDENTIFIER; \
   }\
 else token_to_return = token_id; \
 if (SqlciParse_SyntaxErrorCleanup) \
   SqlciParse_IdentifierExpected = -1; \
 else \
   SqlciParse_IdentifierExpected = set_ident;\
/*  cout << "token = " << token_id << endl;*/  \
 return (token_to_return);\
}
#ifndef NA_LINUX
#ifdef	NA_WINNT
extern "C" int isatty(int);
#else
extern "C" { int yylex(void); }
#endif
#else
extern "C" { int yylex(void); }
#endif

# undef YY_INPUT
#define YY_INPUT(buffer,result,maxsize)\
{\
    buffer[0] = SqlciParse_InputStr[SqlciParse_InputPos++];\
    if ( !buffer[0] )\
        result = YY_NULL;\
    else\
        result=1;\
}

#undef unput
#define unput(c) SqlciUnput(c)

#define yylval sqlcilval
#define yyerror sqlcierror

// put back a previously read input character that wasn't needed
void SqlciUnput(char c)
{
 SqlciParse_InputPos--;
}

// handle EOF in the input stream and let lex continue
// with the next input file
extern "C"   
  int yywrap(void)
    {
      return 0;
    }

%}

D			[0-9]
A			[a-zA-Z]
G                       ({A}({A}|{D})*)

%x FNAME
%s LOGFNAME
B			[ \t\n]+
%%

{B} ;
<FNAME>{B} ;
<LOGFNAME>{B} ;
[Nn][Oo][Ss][Qq][Ll]		      return_IDENT_or_TOKEN(NOSQL, 0);
[Cc][Oo][Nn][Tt][Aa][Ii][Nn][Ss][Qq][Ll]  return_IDENT_or_TOKEN(CONTAINSQL, 0);
[Rr][Ee][Aa][Dd][Ss][Qq][Ll]	      return_IDENT_or_TOKEN(READSQL, 0);
[Mm][Oo][Dd][Ii][Ff][Yy][Ss][Qq][Ll]  return_IDENT_or_TOKEN(MODIFYSQL, 0);
[Rr][Ee][Ss][Ee][Tt][Vv][Ii][Oo][Ll][Aa][Tt][Ii][Oo][Nn]  return_IDENT_or_TOKEN(RESETVIOLATION, 0);
[Cc][Hh][Ee][Cc][Kk][Vv][Ii][Oo][Ll][Aa][Tt][Ii][Oo][Nn]  return_IDENT_or_TOKEN(CHECKVIOLATION, 0);
[Nn][Oo][Aa][Uu][Tt][Oo][Xx][Aa][Cc][Tt]		return_IDENT_or_TOKEN(NoAutoXact, 0);
[Dd][Ee][Ss][Cc][Rr][Ii][Bb][Ee]			return_IDENT_or_TOKEN(DESCRIBEToken, 0);
[Cc][Rr][Ee][Aa][Tt][Ee][Cc][Oo][Nn][Tt][Ee][Xx][Tt]	return_IDENT_or_TOKEN(CREATECONTEXT, 0);
[Cc][Uu][Rr][Rr][Ee][Nn][Tt][Cc][Oo][Nn][Tt][Ee][Xx][Tt] return_IDENT_or_TOKEN(CURRENTCONTEXT, 0);
[Ss][Ww][Ii][Tt][Cc][Hh][Cc][Oo][Nn][Tt][Ee][Xx][Tt]	return_IDENT_or_TOKEN(SWITCHCONTEXT, 0);
[Dd][Ee][Ll][Ee][Tt][Ee][Cc][Oo][Nn][Tt][Ee][Xx][Tt]    return_IDENT_or_TOKEN(DELETECONTEXT, 0);
[Rr][Ee][Ss][Ee][Tt][Cc][[Oo][Nn][Tt][Ee][Xx][Tt]	return_IDENT_or_TOKEN(RESETCONTEXT, 0);
[Aa][Dd][Dd]                           return_IDENT_or_TOKEN( ADDtoken, 0);
[Aa][Ll][Ll]                           return_IDENT_or_TOKEN(ALLtoken, 0);
[Bb][Ee][Gg][Ii][Nn]                   return_IDENT_or_TOKEN(TOK_BEGIN, 0);
[Bb][Rr][Ii][Ee][Ff]                   return_IDENT_or_TOKEN(BRIEF, 0);
[Bb][Tt]                               return_IDENT_or_TOKEN(TOK_BEGIN, 0);
[Dd][Ee][Tt][Aa][Ii][Ll]               return_IDENT_or_TOKEN(DETAIL, 0);
[Cc][Aa][Ll][Ll]		       return_IDENT_or_TOKEN (CALLToken, 0);
[Cc][Ll][Ee][Aa][Nn][Uu][Pp]           return_IDENT_or_TOKEN(CLEANUP, 0);
[Cc][Ll][Aa][Ss][Ss]                   return_IDENT_or_TOKEN(CLASStoken, 0);
[Cc][Ll][Oo][Ss][Ee]                   return_IDENT_or_TOKEN(CLOSEtoken, 0);
[Cc][Oo][Mm][Mm][Aa][Nn][Dd]           return_IDENT_or_TOKEN(COMMANDStoken,0);
[Cc][Oo][Mm][Mm][Aa][Nn][Dd][Ss]       return_IDENT_or_TOKEN(COMMANDStoken,0);
[Cc][Oo][Mm][Mm][Ii][Tt]               return_IDENT_or_TOKEN(COMMIT, 0);
[Cc][Oo][Mm][Mm][Ee][Nn][Tt]       return_IDENT_or_TOKEN(COMMENTtoken, 0);
[Cc][Oo][Nn][Tt][Rr][Oo][Ll]	       return_IDENT_or_TOKEN(CONTROL, 0);
[Cc][Oo][Nn][Tt][Rr][Oo][Ll][Ss]       return_IDENT_or_TOKEN(CONTROL, 0);
[Cc][Qq][Dd]	                       return_IDENT_or_TOKEN(CONTROL, 0);
[Oo][Ss][Ii][Mm]                       return_IDENT_or_TOKEN(OSIM, 0);
[Cc][Uu][Rr][Ss][Oo][Rr]               return_IDENT_or_TOKEN(CURSORtoken, 0);
[Cc][Uu][Rr][Ss][Oo][Rr][ ]+[Ww][Ii][Tt][Hh] return_IDENT_or_TOKEN(CURSORWITH, 0);
[Dd][Ee][Ff][Aa][Uu][Ll][Tt]           return_IDENT_or_TOKEN(DEFAULTtoken, 0);
[Dd][Ee][Aa][Ll][Ll][Oo][Cc]           return_IDENT_or_TOKEN(DEALLOCtoken, 0);
[Dd][Ee][Cc][Ll][Aa][Rr][Ee]           return_IDENT_or_TOKEN(DECLAREtoken, 0);
[Dd][Ee][Ff][Ii][Nn][Ee]               return_IDENT_or_TOKEN(DEFINEtoken, 0);
[Dd][Ii][Ss][Pp][Ll][Aa][Yy]           return_IDENT_or_TOKEN(DISPLAY, 0);
[Dd][Ii][Ss][Pp][Ll][Aa][Yy]{B}[Ss][Tt][Aa][Tt][Ii][Ss][Tt][Ii][Cc][Ss]           return_IDENT_or_TOKEN(DISPLAY_STATISTICS, 0);
[Dd][Ii][Ss][Pp][Ll][Aa][Yy]{B}[Qq][Ii][Dd]   return_IDENT_or_TOKEN(DISPLAY_QUERYID,0);
[Dd][Ii][Ss][Pp][Ll][Aa][Yy]_[Ee][Xx][Pp][Ll][Aa][Ii][Nn]          return_IDENT_or_TOKEN(DISPLAY_EXPLAIN, 0);
[Dd][Ii][Ss][Pp][Ll][Aa][Yy]_[Qq][Cc]  return_IDENT_or_TOKEN(DISPLAY_QC,0);
[Dd][Ii][Ss][Pp][Ll][Aa][Yy]_[Qq][Cc]_[Ee][Nn][Tt][Rr][Ii][Ee][Ss] return_IDENT_or_TOKEN(DISPLAY_QC_ENTRIES,0);
[Dd][Ii][Ss][Pp][Ll][Aa][Yy]_[Qq][Cc]_[Ee][Nn][Tt][Rr][Ii][Ee][Ss]_[Nn][Oo][Tt][Ii][Mm][Ee] return_IDENT_or_TOKEN(DISPLAY_QC_ENTRIES_NOTIME,0);
[Dd][Ii][Ss][Pp][Ll][Aa][Yy]{B}[Uu][Ss][Ee]{B}[Oo][Ff]          return_IDENT_or_TOKEN(DISPLAY_USE_OF, 0);
[Ee][Nn][Vv]  			       return_IDENT_or_TOKEN(MXCI_TOK_ENV, 0);
[Ee][Nn][Vv][Vv][Aa][Rr]  	       return_IDENT_or_TOKEN(ENVVARtoken, 0);
[Ee][Tt]                               return_IDENT_or_TOKEN(COMMIT, 0);
[Ee][Xx][Pp][Ll][Aa][Ii][Nn]           return_IDENT_or_TOKEN(EXPLAIN, 0);
[Ee][Xx][Tt][Rr][Aa][Cc][Tt] 	       return_IDENT_or_TOKEN(EXTRACTtoken, 0);
[Ff][Ee][Tt][Cc][Hh]                   return_IDENT_or_TOKEN(FETCHtoken, 0);
[Ff][Ii][Ll][Ee]                       { 
                                         BEGIN(FNAME);
                     //SqlciParse_IdentifierExpected = 0;
                                         return_IDENT_or_TOKEN(FILEtoken, 0);
                                       }
[Gg][Ee][Nn][Ee][Rr][Aa][Tt][Ee]       return_IDENT_or_TOKEN(GENERATEtoken, 0);
[Gg][Ee][Tt]                           return_IDENT_or_TOKEN(GETtoken, 0);
[Gg][Ee][Tt]{B}[Ss][Tt][Aa][Tt][Ii][Ss][Tt][Ii][Cc][Ss]    return_IDENT_or_TOKEN(GETSTATISTICStoken, 0);
[Hh][Ii][Vv][Ee]                       return_IDENT_or_TOKEN (HIVEtoken, 0); 
[Ii][Nn]                       return_IDENT_or_TOKEN (INtoken, 0); 
[Ii][Nn][Ff][Oo]                       return_IDENT_or_TOKEN (INFOtoken, 0); 
[Ii][Nn][Ff][Ii][Ll][Ee]               {
                     BEGIN FNAME; 
                     return_IDENT_or_TOKEN (INFILE, 0); 
                       }
[Ll][Oo][Aa][Dd] 		       return_IDENT_or_TOKEN(LOADtoken, 0);
[Mm][Ee][Rr][Gg][Ee]                   return_IDENT_or_TOKEN(MERGEtoken, 0);
[Mm][Ee][Tt][Aa][Dd][Aa][Tt][Aa]                   return_IDENT_or_TOKEN(METADATAtoken, 0);
[Mm][Aa][Pp]                           return_IDENT_or_TOKEN(MAPtoken, 0);
[Mm][Oo][Dd][Ii][Ff][Yy]               return_IDENT_or_TOKEN(MODIFY, 0);
[Oo][Bb][Ee][Yy]  		       { 
                     BEGIN FNAME; 
                                         return_IDENT_or_TOKEN (OBEY, 0); 
                                       }
[Oo][Bb][Jj][Ee][Cc][Tt]               return_IDENT_or_TOKEN(OBJECTtoken, 0);
[Oo][Nn]                               return_IDENT_or_TOKEN(ON, 0);
[Oo][Ff]                               return_IDENT_or_TOKEN(OFtoken, 0);
[Oo][Ff][Ff]                           return_IDENT_or_TOKEN(OFF, 0);
[Oo][Uu][Tt][Ff][Ii][Ll][Ee]           {
                     BEGIN FNAME; 
                     return_IDENT_or_TOKEN (OUTFILE, 0); 
                       }
[Oo][Pp][Ee][Nn]                       return_IDENT_or_TOKEN(OPENtoken, 0);
[Oo][Pp][Tt][Ii][Oo][Nn][Ss]           return_IDENT_or_TOKEN(OPTIONStoken, 0);
[Pp][Rr][Ee][Pp][Aa][Rr][Ee][Dd]       return_IDENT_or_TOKEN(PREPARED, 0);
[Pp][Rr][Oo][Cc][Ee][Ss][Ss]           return_IDENT_or_TOKEN(PROCESStoken, 0);
[Ee][Rr][Rr][Oo][Rr]                   return_IDENT_or_TOKEN(ERRORtoken, 0);
[Ee][Xx][Ii][Tt] 		       return_IDENT_or_TOKEN(EXIT, 0);
[Ff][Cc]   		               return_IDENT_or_TOKEN(FC, -1);
[Ff][Oo][Rr]   		               return_IDENT_or_TOKEN(FORtoken, 0);
[Rr][Ee][Pp][Ll][Ii][Cc][Aa][Tt][Ee]    return_IDENT_or_TOKEN(REPLICATEtoken, 0);
[[Cc][Pp][Uu]                           return_IDENT_or_TOKEN(CPU, 0);
[Pp][Ii][Dd]                           return_IDENT_or_TOKEN(PID, 0);
[Qq][Ii][Dd]			       return_IDENT_or_TOKEN(QID, 0);
[Rr][Ee][Pp][Ee][Aa][Tt]               return_IDENT_or_TOKEN(REPEAT, -1);
[Ss][Hh][Oo][Ww][Ss][Tt][Aa][Tt][Ss]   return_IDENT_or_TOKEN(SHOWSTATS, 0);
[Ss][Hh][Oo][Ww][Tt][Rr][Aa][Nn][Ss][Aa][Cc][Tt][Ii][Oo][Nn]   return_IDENT_or_TOKEN(SHOWSTATS, 0);
[Ii][Nn][Vv][Oo][Kk][Ee]               return_IDENT_or_TOKEN(INVOKE, 0);
[Ll][Oo][Gg]            	       {
                                         BEGIN LOGFNAME;
                                         return_IDENT_or_TOKEN(LOG, 0);
                                       }
                                      
[Hh][Ii][Ss][Tt][Oo][Rr][Yy]	       return_IDENT_or_TOKEN(HISTORY, 0);
[Rr][Ee][Ss][Ee][Tt]                   return_IDENT_or_TOKEN(RESET, 0);
[Ss][Ee][Tt]{B}[Tt][Aa][Bb][Ll][Ee] return_IDENT_or_TOKEN(SET_TABLEtoken, 0);
[Ss][Ee][Tt]{B}[Tt][Rr][Aa][Nn][Ss][Aa][Cc][Tt][Ii][Oo][Nn] return_IDENT_or_TOKEN(SET_TRANSACTIONtoken, 0);
[Ss][Ee][Tt]                           return_IDENT_or_TOKEN(SETtoken, 0);
[Ss][Ee][Tt][Ee][Nn][Vv]               return_IDENT_or_TOKEN(SETENV, 0);
[Ll][Ii][Ss][Tt]_[Cc][Oo][Uu][Nn][Tt]  return_IDENT_or_TOKEN(LISTCOUNT, 0);
[Ff][Ii][Rr][Ss][Tt]                   return_IDENT_or_TOKEN(FIRST, 0);
[Nn][Ee][Xx][Tt]                       return_IDENT_or_TOKEN(NEXT, 0);
[Rr][Ee][Pp][Oo][Rr][Tt]               return_IDENT_or_TOKEN(REPORT, 0);
[Ss][Qq][Ll]                           return_IDENT_or_TOKEN(SQL, 0);
[Cc][Aa][Nn][Cc][Ee][ll]               return_IDENT_or_TOKEN(CANCEL, 0);
[Mm][Oo][Dd][Ee]                       return_IDENT_or_TOKEN(MODE,0);
[Ww][Aa][Rr][Nn][Ii][Nn][Gg][Ss]       return_IDENT_or_TOKEN(VERBOSE, 0);
[Pp][Aa][Rr][Aa][Mm]                   return_IDENT_or_TOKEN(PARAM, 0);
[Pp][Aa][Rr][Aa][Mm][Ss]               return_IDENT_or_TOKEN(PARAM, 0);
[Pp][Aa][Tt][Tt][Ee][Rr][Nn]           return_IDENT_or_TOKEN(SQ_LINUX_PATTERN, 0);
[Pp][Aa][Tt][Tt][Ee][Rr][Nn]_[Aa][Ss]_[Ii][Ss]  return_IDENT_or_TOKEN(PATTERN_AS_IS, 0);
[Pp][Rr][Oo][Cc][Ee][Dd][Uu][Rr][Ee]   return_IDENT_or_TOKEN(PROCEDUREtoken, 0);
[Pp][Uu][Rr][Gg][Ee][Dd][Aa][Tt][Aa]   return_IDENT_or_TOKEN(PURGEDATA, 0);
[Pp][Oo][Pp][Uu][Ll][Aa][Tt][Ee]       return_IDENT_or_TOKEN(POPULATE, 0);
[Vv][Aa][Ll][Ii][Dd][Aa][Tt][Ee]       return_IDENT_or_TOKEN(VALIDATEtoken, 0);
[Rr][Ee][Ff][Rr][Ee][Ss][Hh]		   return_IDENT_or_TOKEN(REFRESH, 0);	/* MV - REFRESH utility */
[Rr][Ee][Pp][Oo][Ss][Ii][Tt][Oo][Rr][Yy]    return_IDENT_or_TOKEN(REPOSITORYtoken, 0);
[Rr][Oo][Ww][Ss][Ee][Tt]               return_IDENT_or_TOKEN(ROWSETtoken, 0);
[Tt][Rr][Aa][Nn][Ss][Ff][Oo][Rr][Mm]   return_IDENT_or_TOKEN(TRANSFORM, 0);
[Cc][Ll][Ee][Aa][Rr]                   return_IDENT_or_TOKEN(CLEAR, 0);
[Ss][Hh]                               return_IDENT_or_TOKEN(SHELL, 0);
[Ss][Hh][Ee][Ll][Ll]                   return_IDENT_or_TOKEN(SHELL, 0);
[Ss][Hh][Oo][Ww]                       return_IDENT_or_TOKEN(SHOW, 0);
[Ss][Hh][Oo][Ww][Cc][Oo][Nn][Tt][Rr][Oo][Ll]           return_IDENT_or_TOKEN(SHOWCONTROL, 0);
[Ss][Hh][Oo][Ww][Dd][Dd][Ll]           return_IDENT_or_TOKEN(SHOWDDL, 0);
[Ss][Hh][Oo][Ww][Pp][Ll][Aa][Nn]       return_IDENT_or_TOKEN(SHOWPLAN, 0);
[Ss][Hh][Oo][Ww][Ss][Hh][Aa][Pp][Ee]   return_IDENT_or_TOKEN(SHOWSHAPE, 0);
[Ss][Hh][Oo][Ww][Ss][Ee][Tt]           return_IDENT_or_TOKEN(SHOWSET, 0);
[Ss][Ee][Ss][Ss][Ii][Oo][Nn]           return_IDENT_or_TOKEN(SESSIONtoken, 0);
[Ss][Tt][Oo][Rr][Ee]                   return_IDENT_or_TOKEN(STOREtoken, 0);
[Ss][Yy][Nn][Tt][Aa][Xx]               return_IDENT_or_TOKEN(SYNTAX, 0);
[Ss][Yy][Ss][Tt][Ee][Mm]               return_IDENT_or_TOKEN(SYSTEMtoken, 0);
[Ww][Aa][Ii][Tt]                       return_IDENT_or_TOKEN(WAITtoken, 0);
[Ee][Xx][Aa][Mm][Pp][Ll][Ee]           return_IDENT_or_TOKEN(EXAMPLE, 0);
[Ss][Ee][Ll]	                       return_IDENT_or_TOKEN(SELECTtoken, 0);
[Ss][Ee][Ll][Ee][Cc][Tt]	       return_IDENT_or_TOKEN(SELECTtoken, 0);
[Uu][Pp][Dd][Aa][Tt][Ee]	       return_IDENT_or_TOKEN(UPDATEtoken, 0);
[Dd][Ee][Ll][Ee][Tt][Ee] 	       return_IDENT_or_TOKEN(DELETEtoken, 0);
[Ii][Nn][Ss]	                       return_IDENT_or_TOKEN(INSERTtoken, 0);
[Ii][Nn][Ss][Ee][Rr][Tt]	       return_IDENT_or_TOKEN(INSERTtoken, 0);
[Uu][Pp][Ss][Ee][Rr][Tt]	       return_IDENT_or_TOKEN(UPSERTtoken, 0);
[Tt][Aa][Bb][Ll][Ee] 		       return_IDENT_or_TOKEN(TABLE, 0);
[Vv][Aa][Ll][Uu][Ee][Ss]	       return_IDENT_or_TOKEN(VALUES, 0);
[Vv][Ee][Rr][Ss][Ii][Oo][Nn]           return_IDENT_or_TOKEN(VERSIONtoken, 0);
[Cc][Rr][Ee][Aa][Tt][Ee]	       return_IDENT_or_TOKEN(CREATE, 0);
[Aa][Ll][Tt][Ee][Rr]		       return_IDENT_or_TOKEN(ALTER, 0);
[Dd][Rr][Oo][Pp] 		       return_IDENT_or_TOKEN(DROP, 0);
[Ll][Oo][Cc][Kk]                       return_IDENT_or_TOKEN(LOCK, 0);
[Ll][Oo][Cc][Kk][Ii][Nn][Gg]           return_IDENT_or_TOKEN(LOCKINGtoken, 0);
[Uu][Nn][Ll][Oo][Cc][Kk]               return_IDENT_or_TOKEN(UNLOCK, 0);
[Pp][Rr][Ee][Pp][Aa][Rr][Ee]	       return_IDENT_or_TOKEN(PREPAREtoken, 0);
[Ee][Xx][Ee][Cc][Uu][Tt][Ee]	       return_IDENT_or_TOKEN(EXECUTEtoken, 0);
[Uu][Ss][Ii][Nn][Gg]                   return_IDENT_or_TOKEN(USING, 0);
[Ff][Rr][Oo][Mm]		       return_IDENT_or_TOKEN(FROM, 0);
[Ee][Dd][Ii][Tt] 		       return_IDENT_or_TOKEN(EDIT, 0);
[Ll][Ss]	        	       return_IDENT_or_TOKEN(LS, 0);
[Cc][Dd]   		               return_IDENT_or_TOKEN(CD, 0);
[Rr][Oo][Ll][Ll][Bb][Aa][Cc][Kk]       return_IDENT_or_TOKEN(ROLLBACK, 0);
[Ss][Tt][Aa][Tt][Ii][Ss][Tt][Ii][Cc][Ss]	return_IDENT_or_TOKEN(STATISTICS, 0);
[Ww][Oo][Rr][Kk]                       return_IDENT_or_TOKEN(WORK, 0);
[Uu][Pp][Dd][Aa][Tt][Ee]{B}[Ss][Tt][Aa][Tt][Ii][Ss][Tt][Ii][Cc][Ss]	return_IDENT_or_TOKEN(UPD_STATS, 0);
[Uu][Pp][Dd][Aa][Tt][Ee]{B}[Hh][Ii][Ss][Tt][Oo][Gg][Rr][Aa][Mm]{B}[Ss][Tt][Aa][Tt][Ii][Ss][Tt][Ii][Cc][Ss]	return_IDENT_or_TOKEN(UPD_HIST_STATS, 0);
[Ii][Nn][Ii][Tt][Ii][Aa][Ll][Ii][Zz][Ee] return_IDENT_or_TOKEN(INITIALIZE, 0);
[Rr][Ee][Ii][Nn][Ii][Tt][Ii][Aa][Ll][Ii][Zz][Ee] return_IDENT_or_TOKEN(REINITIALIZE, 0);
[Gg][Rr][Aa][Nn][Tt]                   return_IDENT_or_TOKEN(GIVE, 0);
[Gg][Ii][Vv][Ee]                       return_IDENT_or_TOKEN(GRANTtoken, 0);
[Rr][Ee][Vv][Oo][Kk][Ee]               return_IDENT_or_TOKEN(REVOKEtoken, 0);
[Nn][Aa][Mm][Ee][Tt][Yy][Pp][Ee]       return_IDENT_or_TOKEN(NAMETYPE, 0);
[Mm][Pp][Ll][Oo][Cc]                   return_IDENT_or_TOKEN(MPLOC, 0);
[Cc][Aa][Tt][Aa][Ll][Oo][Gg]	       return_IDENT_or_TOKEN(CATALOG, 0);
[Rr][Ee][Gg][Ii][Ss][Tt][Ee][Rr]       return_IDENT_or_TOKEN(REGISTER, 0);
[Uu][Nn][Rr][Ee][Gg][Ii][Ss][Tt][Ee][Rr] return_IDENT_or_TOKEN(UNREGISTER, 0);
[Ss][Cc][Hh][Ee][Mm][Aa]	       return_IDENT_or_TOKEN(SCHEMA, 0);
[Ss][Tt][Aa][Tt][Ee][Mm][Ee][Nn][Tt]   return_IDENT_or_TOKEN(STATEMENTtoken, 0);
[Ii][Ff]                               return_IDENT_or_TOKEN(IF, 0);
[Uu][Ii][Dd]                           return_IDENT_or_TOKEN(UIDtoken, 0);
[Ww][Hh][Ii][Ll][Ee]                   return_IDENT_or_TOKEN(WHILE, 0);
[Ss][Ii][Gg][Nn][Aa][Ll]	       return_IDENT_or_TOKEN(SIGNAL, 0);
[Ww][Ii][Tt][Hh][Oo][Uu][Tt]           return_IDENT_or_TOKEN(WITHOUT, 0);
[Ww][Ii][Tt][Hh]                       return_IDENT_or_TOKEN(WITH, 0);
[Hh][Oo][Ll][Dd]                       return_IDENT_or_TOKEN(HOLD, 0);
[Pp][Aa][Rr][Ss][Ee][Rr][Ff][Ll][Aa][Gg][Ss] return_IDENT_or_TOKEN(PARSERFLAGS, 0);
[Tt][Ee][Rr][Mm][Ii][Nn][Aa][Ll]_[Cc][Hh][Aa][Rr][Ss][Ee][Tt] return_IDENT_or_TOKEN(TERMINAL_CHARSET, 0);
[Ii][Ss][Oo]_[Mm][Aa][Pp][Pp][Ii][Nn][Gg] return_IDENT_or_TOKEN(ISO_MAPPING, 0);
[Dd][Ee][Ff][Aa][Uu][Ll][Tt]_[Cc][Hh][Aa][Rr][Ss][Ee][Tt] return_IDENT_or_TOKEN(DEFAULT_CHARSETtoken, 0);
[Ii][Nn][Ff][Ee][Rr]_[Cc][Hh][Aa][Rr][Ss][Ee][Tt] return_IDENT_or_TOKEN(INFER_CHARSET, 0);
[Rr][Ee][Ss][Uu][Ll][Tt]               return_IDENT_or_TOKEN(RESULT, 0);
[Qq][Uu][Ii][Ee][Ss][Cc][Ee]           return_IDENT_or_TOKEN(QUIESCE, 0);
[Aa][Cc][Tt][Ii][Vv][Ee]               return_IDENT_or_TOKEN(ACTIVEtoken, 0);
[Aa][Cc][Cc][Uu][Mm][Uu][Ll][Aa][Tt][Ee][Dd] return_IDENT_or_TOKEN(ACCUMULATEDtoken, 0);
[Pp][Ee][Rr][Tt][Aa][Bb][Ll][Ee]       return_IDENT_or_TOKEN(PERTABLEtoken, 0);
[Pp][Rr][Oo][Gg][Rr][Ee][Ss][Ss]       return_IDENT_or_TOKEN(PROGRESStoken, 0);
[;]             {
                  SqlciParse_IdentifierExpected = 0; 
          return_IDENT_or_TOKEN(0, 0);
                };
[Ii][Nn][Tt][Ee][Rr][Nn][Aa][Ll]	return_IDENT_or_TOKEN(INTERNAL, 0);  /* MV OZ_REFRESH */
[Mm][Vv][Ll][Oo][Gg]				return_IDENT_or_TOKEN(MVLOG, 0);
[Uu][Nn][Ll][Oo][Aa][Dd]                return_IDENT_or_TOKEN(UNLOAD, 0); 
[Tt][Rr][Uu][Nn][Cc][Aa][Tt][Ee]        return_IDENT_or_TOKEN(TRUNCATE, 0);
[Cc][Hh][Aa][Nn][Gg][Ee][Uu][Ss][Ee][Rr] return_IDENT_or_TOKEN(USERtoken, 0);

[\*]		{SqlciParse_IdentifierExpected = 0; return(ALLtoken);};
[(]		{SqlciParse_IdentifierExpected = 0; return(LPAREN);};
[)]		{SqlciParse_IdentifierExpected = 0; return(RPAREN);};
[,]             {
                 SqlciParse_IdentifierExpected = 0; 
                 return_IDENT_or_TOKEN(COMMA, 0);
                };
[-]             {SqlciParse_IdentifierExpected = 0; return(HYPHEN);};

<LOGFNAME>[^ \t;()]+          {
                                if (yylval.stringval_type)
				  delete [] yylval.stringval_type;
                                yylval.stringval_type = new char[strlen(yytext)+1];
				strcpy(yylval.stringval_type, yytext);
                                BEGIN 0;
                                SqlciParse_IdentifierExpected = 0;
                                return_IDENT_or_TOKEN(FILENAME, 0);
			   }

[0-9]*		           {  
                                if (yylval.stringval_type)
                  delete [] yylval.stringval_type; 
                yylval.stringval_type = new char[strlen(yytext)+1];
                strcpy(yylval.stringval_type, yytext);
                SqlciParse_IdentifierExpected = 0;
                //		       return(NUMBER);
                return_IDENT_or_TOKEN(NUMBER, 0);
                           }

[?][A-Za-z_][A-Za-z0-9_]*  {
                                if (yylval.stringval_type)
                  delete [] yylval.stringval_type;
                yylval.stringval_type = new char[strlen(yytext)];
                strcpy(yylval.stringval_type, &yytext[1]);
                                SqlciParse_IdentifierExpected = 0;
                return(PARAM_NAME);
               }

[$][$][A-Za-z_][A-Za-z0-9_.]*[$][$] {
                                if (yylval.stringval_type)
                  delete [] yylval.stringval_type;
                yylval.stringval_type = new char[strlen(yytext)];
                strncpy(yylval.stringval_type, &yytext[2], strlen(&yytext[2])-2);
                yylval.stringval_type[strlen(&yytext[2])-2]  = '\0';
                                SqlciParse_IdentifierExpected = 0;
                return(PATTERN_NAME);
                 }

['][A-Za-z0-9_\-.\\$\*^\"/: %]*['] {
                                if (yylval.stringval_type)
                  delete [] yylval.stringval_type;
                yylval.stringval_type = new char[strlen(yytext)];
                strncpy(yylval.stringval_type, &yytext[1], strlen(yytext)-2);
                yylval.stringval_type[strlen(yytext)-2]  = '\0';
                
                                SqlciParse_IdentifierExpected = 0;
                return_IDENT_or_TOKEN(QUOTED_STRING, 0);
                 }
                 
["][A-Za-z0-9_\-.\\$\*^\"/: %]*["] {
                if (yylval.stringval_type)
                   delete [] yylval.stringval_type;
                yylval.stringval_type = new char[strlen(yytext+1)];
                strcpy(yylval.stringval_type, yytext);
                yylval.stringval_type[strlen(yytext)]  = '\0';
                
                SqlciParse_IdentifierExpected = 0;
                return_IDENT_or_TOKEN(DQUOTED_STRING, 0);
                 }

[A-Za-z_][A-Za-z0-9_.]*    {
                yylval.stringval_type = new char[strlen(yytext)+1];
                strcpy(yylval.stringval_type, yytext);
                if (SqlciParse_SyntaxErrorCleanup) 
                  { 
                    SqlciParse_IdentifierExpected = -1;
                    SqlciParse_SyntaxErrorCleanup=0; 
                  }
                else          
                  SqlciParse_IdentifierExpected = 0;
                //cout << "token = " << IDENTIFIER << endl;
                return(IDENTIFIER);
               }

                           
<FNAME>[^ \t;()]+          {
                                if (yylval.stringval_type)
                  delete [] yylval.stringval_type;
                                yylval.stringval_type = new char[strlen(yytext)+1];
                strcpy(yylval.stringval_type, yytext);
                                BEGIN 0;
                                SqlciParse_IdentifierExpected = 0;
                return_IDENT_or_TOKEN(FILENAME, 0);
                        }
\\{G}\.[0-9]*\,[0-9]*      {
                                if (yylval.stringval_type)
	                              delete [] yylval.stringval_type;
                                yylval.stringval_type = new char[strlen(yytext)+1];
				strcpy(yylval.stringval_type, yytext);
                                return(PID_VALUE);
                           }

\\{G}\.[0-9]*              {
                                if (yylval.stringval_type)
	                              delete [] yylval.stringval_type;
                                yylval.stringval_type = new char[strlen(yytext)+1];
				strcpy(yylval.stringval_type, yytext);
                                return(CPU_VALUE);
                           }

\-\-.*$                    {
                /* no action (comment) */
                           }

[!]             {SqlciParse_IdentifierExpected = -1; return(REPEAT);};

. 		{SqlciParse_IdentifierExpected = 0; return(ERROR_STMT);};

%%

void SqlciLexReinit()
{
    sqlcirestart(0);
}
