improved sql parser, support apache phoenix.

This commit is contained in:
wenshao
2016-09-14 15:05:12 +08:00
parent 49d7884c96
commit 77ee426082
33 changed files with 717 additions and 359 deletions
@@ -0,0 +1,27 @@
/*
* Copyright 1999-2101 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.phoenix.ast;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2ASTVisitor;
import com.alibaba.druid.sql.dialect.phoenix.visitor.PhoenixASTVisitor;
/**
* Created by wenshao on 16/9/14.
*/
public interface PhoenixObject extends SQLObject {
void accept0(PhoenixASTVisitor visitor);
}
@@ -0,0 +1,46 @@
/*
* Copyright 1999-2101 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.phoenix.ast;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.dialect.db2.ast.DB2Object;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2ASTVisitor;
import com.alibaba.druid.sql.dialect.phoenix.visitor.PhoenixASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
/**
* Created by wenshao on 16/9/14.
*/
public abstract class PhoenixStatementImpl extends SQLStatementImpl implements PhoenixObject {
public PhoenixStatementImpl() {
super(JdbcConstants.PHOENIX);
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor instanceof PhoenixASTVisitor) {
accept0((PhoenixASTVisitor) visitor);
return;
}
super.accept0(visitor);
}
@Override
public abstract void accept0(PhoenixASTVisitor visitor);
}
@@ -0,0 +1,29 @@
/*
* Copyright 1999-2101 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.phoenix.ast;
import com.alibaba.druid.sql.dialect.phoenix.visitor.PhoenixASTVisitor;
/**
* Created by wenshao on 16/9/14.
*/
public class PhoenixUpsertStatement extends PhoenixStatementImpl {
@Override
public void accept0(PhoenixASTVisitor visitor) {
}
}
@@ -0,0 +1,34 @@
/*
* Copyright 1999-2101 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.phoenix.parser;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.SQLExprParser;
/**
* Created by wenshao on 16/9/13.
*/
public class PhoenixExprParser extends SQLExprParser {
public PhoenixExprParser(String sql){
this(new PhoenixLexer(sql));
this.lexer.nextToken();
}
public PhoenixExprParser(Lexer lexer){
super(lexer);
}
}
@@ -0,0 +1,56 @@
/*
* Copyright 1999-2101 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.phoenix.parser;
import com.alibaba.druid.sql.parser.Keywords;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.Token;
import java.util.HashMap;
import java.util.Map;
/**
* Created by wenshao on 16/9/13.
*/
public class PhoenixLexer extends Lexer {
public final static Keywords DEFAULT_PHOENIX_KEYWORDS;
static {
Map<String, Token> map = new HashMap<String, Token>();
map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords());
map.put("FETCH", Token.FETCH);
map.put("FIRST", Token.FIRST);
map.put("ONLY", Token.ONLY);
map.put("OPTIMIZE", Token.OPTIMIZE);
map.put("OF", Token.OF);
map.put("CONCAT", Token.CONCAT);
map.put("CONTINUE", Token.CONTINUE);
map.put("IDENTITY", Token.IDENTITY);
map.put("MERGE", Token.MERGE);
map.put("USING", Token.USING);
map.put("MATCHED", Token.MATCHED);
map.put("UPSERT", Token.UPSERT);
DEFAULT_PHOENIX_KEYWORDS = new Keywords(map);
}
public PhoenixLexer(String input){
super(input);
super.keywods = DEFAULT_PHOENIX_KEYWORDS;
}
}
@@ -0,0 +1,36 @@
/*
* Copyright 1999-2101 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.phoenix.parser;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.parser.Lexer;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.parser.Token;
/**
* Created by wenshao on 16/9/13.
*/
public class PhoenixStatementParser extends SQLStatementParser {
public PhoenixStatementParser(String sql) {
super (new PhoenixExprParser(sql));
}
public PhoenixStatementParser(Lexer lexer){
super(new PhoenixExprParser(lexer));
}
}
@@ -0,0 +1,24 @@
/*
* Copyright 1999-2101 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.phoenix.visitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
/**
* Created by wenshao on 16/9/13.
*/
public interface PhoenixASTVisitor extends SQLASTVisitor {
}
@@ -0,0 +1,27 @@
/*
* Copyright 1999-2101 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.phoenix.visitor;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
/**
* Created by wenshao on 16/9/13.
*/
public class PhoenixOutputVisitor extends SQLASTOutputVisitor implements PhoenixASTVisitor {
public PhoenixOutputVisitor(Appendable appender){
super(appender);
}
}
@@ -0,0 +1,41 @@
/*
* Copyright 1999-2101 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.phoenix.visitor;
import com.alibaba.druid.sql.visitor.ParameterizedVisitor;
/**
* Created by wenshao on 16/9/13.
*/
public class PhoenixParameterizedOutputVisitor extends PhoenixOutputVisitor implements ParameterizedVisitor {
private int replaceCount;
public PhoenixParameterizedOutputVisitor(){
this(new StringBuilder());
}
public PhoenixParameterizedOutputVisitor(Appendable appender){
super(appender);
}
public int getReplaceCount() {
return this.replaceCount;
}
public void incrementReplaceCunt() {
replaceCount++;
}
}
@@ -0,0 +1,25 @@
/*
* Copyright 1999-2101 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.phoenix.visitor;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2ASTVisitor;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
/**
* Created by wenshao on 16/9/13.
*/
public class PhoenixSchemaStatVisitor extends SchemaStatVisitor implements PhoenixASTVisitor {
}