/* * Copyright 1999-2017 Alibaba Group Holding Ltd. * * Licensed 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. */ package com.alibaba.druid.sql.dialect.postgresql.parser; import static com.alibaba.druid.sql.parser.Token.LITERAL_CHARS; import java.util.HashMap; import java.util.Map; import com.alibaba.druid.sql.parser.Keywords; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.Token; import com.alibaba.druid.util.JdbcConstants; public class PGLexer extends Lexer { public final static Keywords DEFAULT_PG_KEYWORDS; static { Map<String, Token> map = new HashMap<String, Token>(); map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords()); map.put("CASCADE", Token.CASCADE); map.put("CONTINUE", Token.CONTINUE); map.put("CURRENT", Token.CURRENT); map.put("FETCH", Token.FETCH); map.put("FIRST", Token.FIRST); map.put("IDENTITY", Token.IDENTITY); map.put("LIMIT", Token.LIMIT); map.put("NEXT", Token.NEXT); map.put("NOWAIT", Token.NOWAIT); map.put("OF", Token.OF); map.put("OFFSET", Token.OFFSET); map.put("ONLY", Token.ONLY); map.put("RECURSIVE", Token.RECURSIVE); map.put("RESTART", Token.RESTART); map.put("RESTRICT", Token.RESTRICT); map.put("RETURNING", Token.RETURNING); map.put("ROW", Token.ROW); map.put("ROWS", Token.ROWS); map.put("SHARE", Token.SHARE); map.put("SHOW", Token.SHOW); map.put("USING", Token.USING); map.put("WINDOW", Token.WINDOW); map.put("TRUE", Token.TRUE); map.put("FALSE", Token.FALSE); map.put("ARRAY", Token.ARRAY); map.put("IF", Token.IF); map.put("TYPE", Token.TYPE); map.put("ILIKE", Token.ILIKE); DEFAULT_PG_KEYWORDS = new Keywords(map); } public PGLexer(String input){ super(input); super.keywods = DEFAULT_PG_KEYWORDS; super.dbType = JdbcConstants.POSTGRESQL; } protected void scanString() { mark = pos; boolean hasSpecial = false; for (;;) { if (isEOF()) { lexError("unclosed.str.lit"); return; } ch = charAt(++pos); if (ch == '\\') { scanChar(); if (!hasSpecial) { initBuff(bufPos); arraycopy(mark + 1, buf, 0, bufPos); hasSpecial = true; } putChar('\\'); switch (ch) { case '\0': putChar('\0'); break; case '\'': putChar('\''); break; case '"': putChar('"'); break; case 'b': putChar('\b'); break; case 'n': putChar('\n'); break; case 'r': putChar('\r'); break; case 't': putChar('\t'); break; case '\\': putChar('\\'); break; case 'Z': putChar((char) 0x1A); // ctrl + Z break; default: putChar(ch); break; } scanChar(); } if (ch == '\'') { scanChar(); if (ch != '\'') { token = LITERAL_CHARS; break; } else { initBuff(bufPos); arraycopy(mark + 1, buf, 0, bufPos); hasSpecial = true; putChar('\''); putChar('\''); continue; } } if (!hasSpecial) { bufPos++; continue; } if (bufPos == buf.length) { putChar(ch); } else { buf[bufPos++] = ch; } } if (!hasSpecial) { stringVal = subString(mark + 1, bufPos); } else { stringVal = new String(buf, 0, bufPos); } } public void scanSharp() { scanChar(); if (ch == '>') { scanChar(); if (ch == '>') { scanChar(); token = Token.POUNDGTGT; } else { token = Token.POUNDGT; } } else { token = Token.POUND; } } }