11import { param , timers } from "jquery" ;
22import { Error , QuickFix , ErrorLevel } from "../lexer/Lexer.js" ;
33import { TextPosition , Token , TokenList , TokenType , TokenTypeReadable } from "../lexer/Token.js" ;
4- import { ASTNode , BracketsNode , SelectNode , TermNode , TableOrSubqueryNode , TableNode , SubqueryNode , GroupByNode , OrderByNode , LimitNode , IdentifierNode , DotNode , ListNode , ColumnNode , InsertNode , ConstantNode , UnaryOpNode , CreateTableNode , CreateTableColumnNode , ForeignKeyInfo , UpdateNode , DeleteNode , DropTableNode , AlterTableNode , AlterTableKind , OmittedStatementNode } from "./AST.js" ;
4+ import { ASTNode , BracketsNode , SelectNode , TermNode , TableOrSubqueryNode , TableNode , SubqueryNode , GroupByNode , OrderByNode , LimitNode , IdentifierNode , DotNode , ListNode , ColumnNode , InsertNode , ConstantNode , UnaryOpNode , CreateTableNode , CreateTableColumnNode , ForeignKeyInfo , UpdateNode , DeleteNode , DropTableNode , AlterTableNode , AlterTableKind , OmittedStatementNode , CreateViewNode } from "./AST.js" ;
55import { Module } from "./Module.js" ;
66import { Column } from "./SQLTable.js" ;
77import { SQLBaseType } from "./SQLTypes.js" ;
@@ -435,13 +435,13 @@ export class Parser {
435435 case TokenType . keywordInsert :
436436 return this . parseInsert ( ) ;
437437 case TokenType . keywordCreate :
438- return this . parseCreateTableOrDatabase ( ) ;
438+ return this . parseCreateTableOrDatabaseOrView ( ) ;
439439 case TokenType . keywordUpdate :
440440 return this . parseUpdate ( ) ;
441441 case TokenType . keywordDelete :
442442 return this . parseDelete ( ) ;
443443 case TokenType . keywordDrop :
444- return this . parseDropTable ( ) ;
444+ return this . parseDropTableOrView ( ) ;
445445 case TokenType . keywordAlter :
446446 return this . parseAlterTable ( ) ;
447447 case TokenType . keywordCommit :
@@ -859,10 +859,10 @@ export class Parser {
859859 node . columnDef = this . parseColumnDefinition ( false ) ;
860860 }
861861
862- parseDropTable ( ) : DropTableNode {
862+ parseDropTableOrView ( ) : DropTableNode {
863863
864864 let startPosition = this . getCurrentPosition ( ) ;
865- this . nextToken ( ) ; // skip "Delete "
865+ this . nextToken ( ) ; // skip "Drop "
866866
867867 let node : DropTableNode = {
868868 type : TokenType . keywordDrop ,
@@ -874,8 +874,8 @@ export class Parser {
874874 ifExists : false
875875 }
876876
877- if ( ! this . expect ( TokenType . keywordTable , true ) ) {
878- this . addCompletionHintHere ( false , false , [ "table" ] , 1 ) ;
877+ if ( ! this . expect ( [ TokenType . keywordTable , TokenType . keywordView ] , true ) ) {
878+ this . addCompletionHintHere ( false , false , [ "table" , "view" ] , 1 ) ;
879879 }
880880
881881 if ( this . comesToken ( TokenType . keywordIf , true ) ) {
@@ -1015,12 +1015,14 @@ export class Parser {
10151015
10161016 }
10171017
1018- parseCreateTableOrDatabase ( ) : CreateTableNode | OmittedStatementNode {
1018+ parseCreateTableOrDatabaseOrView ( ) : CreateTableNode | OmittedStatementNode | CreateViewNode {
10191019 switch ( this . ct [ 1 ] . tt ) {
10201020 case TokenType . keywordDatabase :
10211021 return this . parseCreateDatabase ( ) ;
10221022 case TokenType . keywordTable :
10231023 return this . parseCreateTable ( ) ;
1024+ case TokenType . keywordView :
1025+ return this . parseCreateView ( ) ;
10241026 default :
10251027 this . nextToken ( ) ;
10261028 this . pushError ( "Nach 'create' wird 'table' erwartet." ) ;
@@ -1047,6 +1049,65 @@ export class Parser {
10471049 return node ;
10481050 }
10491051
1052+ parseCreateView ( ) : CreateViewNode {
1053+ let startPosition = this . getCurrentPosition ( ) ;
1054+ this . nextToken ( ) ; // skip "create"
1055+ this . nextToken ( ) ; // skip "view"
1056+
1057+ let ifNotExists : boolean = false ;
1058+ if ( this . comesToken ( TokenType . keywordIf ) ) {
1059+ this . nextToken ( ) ;
1060+ this . expect ( TokenType . keywordNot , true ) ;
1061+ this . expect ( TokenType . keywordExists , true ) ;
1062+ ifNotExists = true ;
1063+ }
1064+
1065+ let identifier = "" ;
1066+ if ( ! this . expect ( TokenType . identifier , false ) ) {
1067+ return null ;
1068+ }
1069+
1070+ identifier = < string > this . cct . value ;
1071+ this . nextToken ( ) ;
1072+
1073+ let columnIdentifiers : string [ ] = [ ] ;
1074+
1075+ if ( this . comesToken ( TokenType . leftBracket , true ) ) {
1076+
1077+ do {
1078+ if ( this . expect ( TokenType . identifier , false ) ) {
1079+ columnIdentifiers . push ( < string > this . cct . value )
1080+ }
1081+ this . nextToken ( ) ;
1082+ } while ( this . comesToken ( TokenType . comma , true ) )
1083+
1084+ this . expect ( TokenType . rightBracket , true ) ;
1085+ }
1086+
1087+ if ( ! this . expect ( TokenType . keywordAs , true ) ) {
1088+ return null ;
1089+ }
1090+
1091+ if ( ! this . expect ( TokenType . keywordSelect , false ) ) {
1092+ return null ;
1093+ }
1094+
1095+ let selectStatement = this . parseSelect ( ) ;
1096+
1097+ let node : CreateViewNode = {
1098+ type : TokenType . keywordView ,
1099+ identifier : identifier ,
1100+ position : startPosition ,
1101+ endPosition : this . getCurrentPosition ( ) ,
1102+ symbolTable : null ,
1103+ ifNotExists : ifNotExists ,
1104+ columnIdentifierList : columnIdentifiers ,
1105+ selectStatement : selectStatement
1106+ }
1107+
1108+ return node ;
1109+ }
1110+
10501111 parseCreateTable ( ) : CreateTableNode {
10511112
10521113 let startPosition = this . getCurrentPosition ( ) ;
0 commit comments