public void TestCreateIndexUNIQUEAndMoreComplex() { const string createIndexStmt = "CREATE UNIQUE INDEX test1 ON test_table (column1 ASC, column2 COLLATE i, column3);"; var nodes = SQLiteParseVisitor.ParseString <CreateIndexNode>(createIndexStmt); var expected = new CreateIndexNode { IndexName = "test1", TableName = "test_table", IsUnique = true, IndexedColumnNodes = new[] { new IndexedColumnNode { Id = "column1", Order = SortOrder.Asc }, new IndexedColumnNode { Id = "column2", CollationId = "i" }, new IndexedColumnNode { Id = "column3" } } }.ToExpectedObject().AddTreeNode(); expected.ShouldMatch(nodes); var treeStringBuilder = new TreeStringOutputVisitor(); var result = nodes.Accept(treeStringBuilder); Assert.Equal(createIndexStmt, result.ToString()); }
private void IncorporateAlterationsInIndexNodes(IList <CreateIndexNode> indexes, string fullTableName, IEnumerable <TableCommand> commands, IEnumerable <string> finalColumnNames) { //let's handle the commands first foreach (TableCommand command in commands) { if (command is DropIndexCommand) { var drop = command as DropIndexCommand; CreateIndexNode node = indexes.FirstOrDefault(i => i.IndexName == drop.IndexName); if (node == null) { throw new InvalidIndexException(string.Format("The index '{0}' on table '{1}' does not exist and cannot be dropped.", drop.IndexName, drop.TableName), drop); } indexes.Remove(node); } else if (command is AddIndexCommand) { var add = command as AddIndexCommand; indexes.Add(CreateIndexNodeFromAddColumnCommand(add, fullTableName)); } } //we need to remove all indexes that have columns that aren't in finalColumnNames //hashset to speed this up a little var finalColumnHash = new HashSet <string>(finalColumnNames); RemoveAll(indexes, node => !node.IndexedColumnNodes.All(i => finalColumnHash.Contains(i.Id))); }
public StringBuilder Visit(CreateIndexNode createIndexNode) { var sb = new StringBuilder(); sb.Append("CREATE "); if (createIndexNode.IsUnique) { sb.Append("UNIQUE "); } sb.Append("INDEX "); if (createIndexNode.DatabaseName != null) { sb.Append(createIndexNode.DatabaseName).Append("."); } sb.Append(createIndexNode.IndexName); sb.Append(" ON "); sb.Append(createIndexNode.TableName); sb.Append(" ("); sb.Append(string.Join(", ", createIndexNode.IndexedColumnNodes.Select(i => i.Accept(this)))); sb.Append(")"); if (createIndexNode.WhereExpr != null) { sb.Append(" WHERE "); sb.Append(createIndexNode.WhereExpr); } sb.Append(";"); return(sb); }
private CreateIndexNode CreateIndexNodeFromAddColumnCommand(AddIndexCommand command, string fullTableName) { var ret = new CreateIndexNode { TableName = fullTableName, IndexName = command.IndexName, IndexedColumnNodes = command.ColumnNames.Select(i => new IndexedColumnNode { Id = i }) }; return(ret); }
public override SQLiteParseTreeNode VisitCreate_index_stmt(SQLiteParserSimpleParser.Create_index_stmtContext context) { var ret = new CreateIndexNode(context) { TableName = context.table_name().GetText(), IndexName = context.index_name().GetText(), IsUnique = context.UNIQUE() != null, IfNotExists = context.EXISTS() != null, DatabaseName = context.database_name() != null?context.database_name().GetText() : null, WhereExpr = context.expr() != null?context.expr().GetText() : null, IndexedColumnNodes = context.indexed_column().Select(CreateIndexedColumnNode).ToArray() }; return(ret); }