# This patch file was generated by NetBeans IDE # Following Index: paths are relative to: /home/matthias/NetBeansProjects/core-main # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: db.sql.editor/src/org/netbeans/modules/db/sql/analyzer/CreateStatement.java --- db.sql.editor/src/org/netbeans/modules/db/sql/analyzer/CreateStatement.java +++ db.sql.editor/src/org/netbeans/modules/db/sql/analyzer/CreateStatement.java @@ -41,19 +41,20 @@ */ package org.netbeans.modules.db.sql.analyzer; +import java.util.List; import java.util.SortedMap; /** * * @author Jiri Skrivanek */ -public class CreateStatement extends SQLStatement { +public class CreateStatement extends SelectStatement { private int bodyStartOffset; private int bodyEndOffset; - CreateStatement(int startOffset, int endOffset, SortedMap offset2Context, int bodyStartOffset, int bodyEndOffset) { - super(startOffset, endOffset, offset2Context); + CreateStatement(int startOffset, int endOffset, SortedMap offset2Context, int bodyStartOffset, int bodyEndOffset, TablesClause tablesClause, List subqueries) { + super(startOffset, endOffset, null, tablesClause, subqueries, offset2Context); this.bodyStartOffset = bodyStartOffset; this.bodyEndOffset = bodyEndOffset; this.kind = SQLStatementKind.CREATE; Index: db.sql.editor/src/org/netbeans/modules/db/sql/analyzer/CreateStatementAnalyzer.java --- db.sql.editor/src/org/netbeans/modules/db/sql/analyzer/CreateStatementAnalyzer.java +++ db.sql.editor/src/org/netbeans/modules/db/sql/analyzer/CreateStatementAnalyzer.java @@ -41,6 +41,8 @@ */ package org.netbeans.modules.db.sql.analyzer; +import java.util.Collections; +import java.util.List; import org.netbeans.api.db.sql.support.SQLIdentifiers.Quoter; import org.netbeans.api.lexer.TokenSequence; import org.netbeans.modules.db.sql.analyzer.SQLStatement.Context; @@ -70,7 +72,7 @@ } CreateStatementAnalyzer sa = new CreateStatementAnalyzer(seq, quoter); sa.parse(); - return new CreateStatement(sa.startOffset, seq.offset() + seq.token().length(), sa.offset2Context, sa.bodyStartOffset, sa.bodyEndOffset); + return new CreateStatement(sa.startOffset, seq.offset() + seq.token().length(), sa.offset2Context, sa.bodyStartOffset, sa.bodyEndOffset, null, Collections.unmodifiableList(sa.subqueries)); } private CreateStatementAnalyzer(TokenSequence seq, Quoter quoter) { @@ -91,6 +93,16 @@ moveToContext(Context.CREATE_PROCEDURE); } else if (SQLStatementAnalyzer.isKeyword("FUNCTION", seq)) { // NOI18N moveToContext(Context.CREATE_FUNCTION); + } else if (SQLStatementAnalyzer.isKeyword("TABLE", seq)) { + moveToContext(Context.CREATE_TABLE); + } else if (SQLStatementAnalyzer.isKeyword("TEMPORARY", seq)) { + moveToContext(Context.CREATE_TEMPORARY_TABLE); + } else if (SQLStatementAnalyzer.isKeyword("DATABASE", seq)) { + moveToContext(Context.CREATE_DATABASE); + } else if (SQLStatementAnalyzer.isKeyword("SCHEMA", seq)) { + moveToContext(Context.CREATE_SCHEMA); + } else if (SQLStatementAnalyzer.isKeyword("VIEW", seq)) { + moveToContext(Context.CREATE_VIEW); } break; case CREATE_PROCEDURE: @@ -106,6 +118,21 @@ bodyEndOffset = seq.offset(); } break; + case CREATE_TEMPORARY_TABLE: + if (SQLStatementAnalyzer.isKeyword("TABLE", seq)) { + moveToContext(Context.CREATE_TABLE); + } + break; + case CREATE_VIEW: + if(SQLStatementAnalyzer.isKeyword("AS", seq)) { + moveToContext(Context.CREATE_VIEW_AS); + } + break; + case CREATE_VIEW_AS: + if(SQLStatementAnalyzer.isKeyword("SELECT", seq)) { + moveToContext(Context.SELECT); + } + break; default: // skip anything else } Index: db.sql.editor/src/org/netbeans/modules/db/sql/analyzer/SQLStatement.java --- db.sql.editor/src/org/netbeans/modules/db/sql/analyzer/SQLStatement.java +++ db.sql.editor/src/org/netbeans/modules/db/sql/analyzer/SQLStatement.java @@ -147,7 +147,13 @@ CREATE_PROCEDURE(710), CREATE_FUNCTION(720), BEGIN(730), - END(740); + END(740), + CREATE_TABLE(750), + CREATE_TEMPORARY_TABLE(760), + CREATE_DATABASE(770), + CREATE_SCHEMA(780), + CREATE_VIEW(790), + CREATE_VIEW_AS(800); private final int order; Index: db.sql.editor/src/org/netbeans/modules/db/sql/editor/completion/SQLCompletionQuery.java --- db.sql.editor/src/org/netbeans/modules/db/sql/editor/completion/SQLCompletionQuery.java +++ db.sql.editor/src/org/netbeans/modules/db/sql/editor/completion/SQLCompletionQuery.java @@ -175,12 +175,12 @@ substitutionOffset = 0; items = new SQLCompletionItems(quoter, env.getSubstitutionHandler()); if (env.getTokenSequence().isEmpty()) { - completeKeyword("SELECT", "INSERT", "DELETE", "DROP", "UPDATE"); //NOI18N + completeKeyword("SELECT", "INSERT", "DELETE", "DROP", "UPDATE", "CREATE"); //NOI18N return items; } statement = SQLStatementAnalyzer.analyze(env.getTokenSequence(), quoter); if (statement == null) { - completeKeyword("SELECT", "INSERT", "DELETE", "DROP", "UPDATE"); //NOI18N + completeKeyword("SELECT", "INSERT", "DELETE", "DROP", "UPDATE", "CREATE"); //NOI18N return items; } if (statement.getKind() == SQLStatementKind.CREATE && ((CreateStatement) statement).hasBody()) { @@ -189,7 +189,7 @@ } context = statement.getContextAtOffset(env.getCaretOffset()); if (context == null) { - completeKeyword("SELECT", "INSERT", "DELETE", "DROP", "UPDATE"); //NOI18N + completeKeyword("SELECT", "INSERT", "DELETE", "DROP", "UPDATE", "CREATE"); //NOI18N return items; } ident = findIdentifier(); @@ -216,10 +216,33 @@ case DELETE: completeDelete(); break; + case CREATE: + completeCreate(); + break; } return items; } + private void completeCreate() { + CreateStatement createStatement = (CreateStatement) statement; + tablesClause = createStatement.getTablesInEffect(env.getCaretOffset()); + switch(context) { + case CREATE: + case CREATE_DATABASE: + case CREATE_FUNCTION: + case CREATE_PROCEDURE: + case CREATE_SCHEMA: + case CREATE_TABLE: + case CREATE_TEMPORARY_TABLE: + case CREATE_VIEW: + case CREATE_VIEW_AS: + completeKeyword(context); + break; + default: + completeSelect(); + } + } + private void completeSelect() { SelectStatement selectStatement = (SelectStatement) statement; tablesClause = selectStatement.getTablesInEffect(env.getCaretOffset()); @@ -400,6 +423,18 @@ case VALUES: // nothing to complete break; + case CREATE: + completeKeyword("PROCEDURE", "FUNCTION", "TABLE", "DATABASE", "SCHEMA", "TEMPORARY", "VIEW"); //NOI18N + break; + case CREATE_TEMPORARY_TABLE: + completeKeyword("TABLE"); //NOI18N + break; + case CREATE_VIEW: + completeKeyword("AS"); + break; + case CREATE_VIEW_AS: + completeKeyword("SELECT"); + break; } } @@ -458,11 +493,10 @@ /** Adds columns, tuples, schemas and catalogs according to given identifier. */ private void completeColumnSimpleIdent(String typedPrefix, boolean quoted) { - if (tablesClause != null) { + if (tablesClause != null && !(tablesClause.getUnaliasedTableNames().isEmpty() && tablesClause.getAliasedTableNames().isEmpty())) { completeSimpleIdentBasedOnFromClause(typedPrefix, quoted); } else { - Schema defaultSchema = metadata.getDefaultSchema(); - if (defaultSchema != null) { + Schema defaultSchema = metadata.getDefaultSchema(); if (defaultSchema != null) { // All columns in default schema, but only if a prefix has been typed, otherwise there // would be too many columns. if (typedPrefix != null) { @@ -542,7 +576,7 @@ /** Adds columns, tuples, schemas and catalogs according to given identifier. */ private void completeColumnQualIdent(QualIdent fullyTypedIdent, String lastPrefix, boolean quoted) { - if (tablesClause != null) { + if (tablesClause != null && !(tablesClause.getUnaliasedTableNames().isEmpty() && tablesClause.getAliasedTableNames().isEmpty())) { completeQualIdentBasedOnFromClause(fullyTypedIdent, lastPrefix, quoted); } else { // Assume fullyTypedIdent is a tuple. Index: db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/editor/completion/CreateCompletionQueryTest.java --- db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/editor/completion/CreateCompletionQueryTest.java +++ db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/editor/completion/CreateCompletionQueryTest.java @@ -56,7 +56,7 @@ "CREATE PROCEDURE p1()\n" + "BEGIN\n" + "|"; - assertItems(doQuery(sql), "DELETE", "DROP", "INSERT", "SELECT", "UPDATE"); + assertItems(doQuery(sql), "CREATE", "DELETE", "DROP", "INSERT", "SELECT", "UPDATE"); sql = "CREATE PROCEDURE p1()\n" + "BEGIN\n" + @@ -77,7 +77,7 @@ "BEGIN\n" + " SELECT * FROM tab_customer;\n" + "|"; - assertItems(doQuery(sql), "DELETE", "DROP", "INSERT", "SELECT", "UPDATE"); + assertItems(doQuery(sql), "CREATE", "DELETE", "DROP", "INSERT", "SELECT", "UPDATE"); sql = "CREATE PROCEDURE p1()\n" + "BEGIN\n" + @@ -91,5 +91,21 @@ " SELECT | FROM tab_customer;\n" + "END"; assertItems(doQuery(sql), "col_customer_id", "tab_customer"); + sql = "C|"; + assertItems(doQuery(sql), "CREATE"); + sql = "CREATE |"; + assertItems(doQuery(sql), "DATABASE", "FUNCTION", "PROCEDURE", + "SCHEMA", "TABLE", "TEMPORARY", "VIEW"); + sql = "CREATE TEMPORARY |"; + assertItems(doQuery(sql), "TABLE"); + sql = "CREATE VIEW |"; + assertItems(doQuery(sql), "AS"); + sql = "CREATE VIEW xy AS |"; + assertItems(doQuery(sql), "SELECT"); + // This is a basic to verify "normal" select behaviour, based on + // structure from CompletionQueryTestCase.java + sql = "CREATE VIEW xy AS SELECT |"; + assertItems(doQuery(sql), "tab_customer", "sch_accounting", "sch_customer", + "catalog_1", "catalog_2"); } } Index: db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/editor/completion/KeywordCompletionQueryTest.java --- db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/editor/completion/KeywordCompletionQueryTest.java +++ db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/editor/completion/KeywordCompletionQueryTest.java @@ -53,9 +53,9 @@ public void testEmptyStatement() { String sql = "|"; - assertItems(doQuery(sql), "DELETE", "DROP", "INSERT", "SELECT", "UPDATE"); + assertItems(doQuery(sql), "CREATE", "DELETE", "DROP", "INSERT", "SELECT", "UPDATE"); sql = " |"; - assertItems(doQuery(sql), "DELETE", "DROP", "INSERT", "SELECT", "UPDATE"); + assertItems(doQuery(sql), "CREATE", "DELETE", "DROP", "INSERT", "SELECT", "UPDATE"); sql = "D|"; assertItems(doQuery(sql), "DELETE", "DROP"); } Index: db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/editor/completion/selectAllWhenFromClauseEmpty.pass --- db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/editor/completion/selectAllWhenFromClauseEmpty.pass +++ db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/editor/completion/selectAllWhenFromClauseEmpty.pass @@ -0,0 +1,4 @@ +Table customer +View asummary +Schema accounting +Schema customers \ No newline at end of file