flinkStreamSQL icon indicating copy to clipboard operation
flinkStreamSQL copied to clipboard

create view中语法问题

Open zhouxinhai opened this issue 5 years ago • 3 comments

CREATE VIEW viewName [ (columnName[ , columnName]*) ]; INSERT INTO viewName queryStatement;

的语法使用临时表,会报错。

我的sql用例如下:

CREATE TABLE MyTable(
    name varchar,
    channel varchar,
    pv INT,
    xctime bigint,
    CHARACTER_LENGTH(channel) AS timeLeng
 )WITH(
    type ='kafka10',
    bootstrapServers ='hw-bd-01:9092',
    zookeeperQuorum ='hw-bd-01:2181/kafka',
    offsetReset ='earliest',
    topic ='zxh_test',
    parallelism ='1',
    topicIsPattern='false'
 );

create view MyView1 (
	name varchar,
	pv INT,
    channel varchar
);

insert into MyView1 select name,pv+100 as pv,channel from MyTable;



CREATE TABLE MyResult(
    name VARCHAR,
	channel varchar,
    cnt INT
 )WITH(
    type ='console',
    parallelism ='1'
 );


insert
into
    MyResult
    select
        name,
		channel,
        pv+2000 as cnt
    from
        MyView1 where name='zhou';

报错的内容为:

Exception in thread "main" java.lang.RuntimeException:   create view MyView1 (  name varchar,  pv INT,     channel varchar ):Syntax does not support,the format of SQL like insert into tb1 select * from tb2.
	at com.dtstack.flink.sql.parser.SqlParser.parseSql(SqlParser.java:95)
	at com.dtstack.flink.sql.exec.ExecuteProcessHelper.getStreamExecution(ExecuteProcessHelper.java:153)
	at com.dtstack.flink.sql.Main.main(Main.java:42)
	at com.dtstack.flink.sql.launcher.LauncherMain.main(LauncherMain.java:138)

修改方法: 将CreateTmpTableParser类中的 private static final String EMPTY_STR = "(?i)^\\screate\\s+view\\s+(\\S+)\\s*\\((.+)\\)$"; 改为 private static final String EMPTY_STR = "(?i)^\\s*create\\s+view\\s+(\\S+)\\s*\\((.+)\\)$"; 即可

zhouxinhai avatar Apr 20 '20 06:04 zhouxinhai

@zhouxinhai 创建视图的语法是, create view MyView1 as select a, b from Mysource;

todd5167 avatar Apr 20 '20 09:04 todd5167

在createView.md的文档中有说明是可以支持

CREATE VIEW viewName [ (columnName[ , columnName]*) ]; INSERT INTO viewName queryStatement;

语法的

并且只要将 CreateTmpTableParser类中的 private static final String EMPTY_STR = "(?i)^\\screate\\s+view\\s+(\\S+)\\s*\\((.+)\\)$"; 改为 private static final String EMPTY_STR = "(?i)^\\s*create\\s+view\\s+(\\S+)\\s*\\((.+)\\)$"; 就可以支持

CREATE VIEW viewName [ (columnName[ , columnName]*) ]; INSERT INTO viewName queryStatement;

语法了

zhouxinhai avatar Apr 20 '20 15:04 zhouxinhai

这个我们以后在1.10分支里考虑升级下

a49a avatar Jul 17 '20 04:07 a49a