content: -- Copyright (c) 2017 Uber Technologies, Inc.
  --
  -- Permission is hereby granted, free of charge, to any person obtaining a copy
  -- of this software and associated documentation files (the "Software"), to deal
  -- in the Software without restriction, including without limitation the rights
  -- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  -- copies of the Software, and to permit persons to whom the Software is
  -- furnished to do so, subject to the following conditions:
  --
  -- The above copyright notice and this permission notice shall be included in
  -- all copies or substantial portions of the Software.
  --
  -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  -- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  -- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  -- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  -- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  -- THE SOFTWARE.
  
  module Database.Sql.Vertica.Token where
  
  import           Data.Text.Lazy (Text)
  import           Data.ByteString.Lazy (ByteString)
  import qualified Data.Map as M
  
  data Token = TokWord !Bool !Text
             | TokString !ByteString
             | TokNumber !Text
             | TokSymbol !Text
             | TokError !String
               deriving (Show, Eq)
  
  
  data WordInfo = WordInfo
                { wordCanBeSchemaName :: !Bool
                , wordCanBeTableName :: !Bool
                , wordCanBeColumnName :: !Bool
                , wordCanBeFunctionName :: !Bool
                }
  
  
  wordInfo :: Text -> WordInfo
  wordInfo word = maybe (WordInfo True True True True) id $ M.lookup word $ M.fromList
      [ ("all",                  WordInfo False False False True)
      , ("and",                  WordInfo False False True  False)
      , ("asc",                  WordInfo False False False False)
      , ("as",                   WordInfo False False False False)
      , ("at",                   WordInfo False True  True  False)
      , ("between",              WordInfo False False False False)
      , ("by",                   WordInfo False False False False)
      , ("case",                 WordInfo False False False False)
      , ("comma",                WordInfo False False False False)
      , ("cross",                WordInfo False False False False)
      , ("current_database",     WordInfo False False False True)
      , ("current_date",         WordInfo False False False True)
      , ("current_schema",       WordInfo False False False True)
      , ("current_timestamp",    WordInfo False False False False)
      , ("current_time",         WordInfo False False False False)
      , ("current_user",         WordInfo False False False True)
      , ("desc",                 WordInfo False False False False)
      , ("distinct",             WordInfo False False False False)
      , ("else",                 WordInfo False False False False)
      , ("end",                  WordInfo False False False False)
      , ("except",               WordInfo False False False False)
      , ("false",                WordInfo False False False False)
      , ("from",                 WordInfo False False False False)
      , ("full",                 WordInfo False False False False)
      , ("group",                WordInfo False False True  False)
      , ("having",               WordInfo False False False False)
      , ("ilike",                WordInfo False False False False)
      , ("ilikeb",               WordInfo False False False False)
      , ("inner",                WordInfo False False False False)
      , ("intersect",            WordInfo False False False False)
      , ("interval",             WordInfo False False True  False)
      , ("in",                   WordInfo False False False False)
      , ("is",                   WordInfo False False False False)
      , ("isnull",               WordInfo False False False True)
      , ("join",                 WordInfo False False False False)
      , ("left",                 WordInfo False False False True)
      , ("likeb",                WordInfo False False False False)
      , ("limit",                WordInfo False False False False)
      , ("localtimestamp",       WordInfo False False False False)
      , ("localtime",            WordInfo False False True  False)
      , ("natural",              WordInfo False False False False)
      , ("not",                  WordInfo False False False False)
      , ("notnull",              WordInfo False False False True)
      , ("null",                 WordInfo False False False False)
      , ("on",                   WordInfo False False False False)
      , ("order",                WordInfo False False True  False)
      , ("or",                   WordInfo False False True  False)
      , ("outer",                WordInfo False False False False)
      , ("overlaps",             WordInfo False False False False)
      , ("right",                WordInfo False False False True)
      , ("segmented",            WordInfo False False False False)
      , ("select",               WordInfo False False False False)
      , ("semi",                 WordInfo False False False False)
      , ("session_user",         WordInfo False False False True)
      , ("sysdate",              WordInfo False False False True)
      , ("then",                 WordInfo False False False False)
      , ("time",                 WordInfo False False True  False)
      , ("timezone",             WordInfo False False True  False)
      , ("true",                 WordInfo False False False False)
      , ("union",                WordInfo False False False False)
      , ("unknown",              WordInfo False False False False)
      , ("user",                 WordInfo False False True  True)
      , ("using",                WordInfo False False False False)
      , ("when",                 WordInfo False False False False)
      , ("where",                WordInfo False False False False)
      , ("window",               WordInfo False False False False)
      , ("with",                 WordInfo False False False False)
      , ("zone",                 WordInfo False False True  False)
      ]
  