/// <summary> /// Parses ALTER TABLE statement. /// </summary> public static void Parse(PgDatabase database, string statement, bool outputIgnoredStatements) { var parser = new Parser(statement); parser.Expect("ALTER", "TABLE"); parser.ExpectOptional("ONLY"); var tableName = parser.ParseIdentifier(); var schemaName = ParserUtils.GetSchemaName(tableName, database); if (database.SchemaIsIgnored(schemaName)) { return; } PgSchema schema = database.GetSchema(schemaName); if (schema == null) { throw new TeamworkParserException($"CannotFindSchema {schemaName} from {statement}"); } var objectName = ParserUtils.GetObjectName(tableName); PgTable table = schema.GetTable(objectName); if (table == null) { PgView view = schema.GetView(objectName); if (view != null) { ParseView(parser, view, outputIgnoredStatements, tableName, database); return; } PgSequence sequence = schema.GetSequence(objectName); if (sequence != null) { ParseSequence(parser, sequence, outputIgnoredStatements, tableName, database); return; } throw new TeamworkParserException($"CannotFindObject in {tableName} from {statement}"); } while (!parser.ExpectOptional(";")) { if (parser.ExpectOptional("ALTER")) { ParseAlterColumn(parser, table); } else if (parser.ExpectOptional("CLUSTER", "ON")) { table.ClusterIndexName = ParserUtils.GetObjectName(parser.ParseIdentifier()); } else if (parser.ExpectOptional("OWNER", "TO")) { // we do not parse this one so we just consume the identifier if (outputIgnoredStatements) { database.AddIgnoredStatement("ALTER TABLE " + tableName + " OWNER TO " + parser.ParseIdentifier() + ';'); } else { parser.ParseIdentifier(); } } else if (parser.ExpectOptional("ADD")) { if (parser.ExpectOptional("FOREIGN", "KEY")) { ParseAddForeignKey(parser, table); } else if (parser.ExpectOptional("CONSTRAINT")) { ParseAddConstraint(parser, table, schema); } else { throw new TeamworkParserException("CannotParseStringUnsupportedCommand"); } } else if (parser.ExpectOptional("ENABLE")) { ParseEnable(parser, outputIgnoredStatements, tableName, database); } else if (parser.ExpectOptional("DISABLE")) { ParseDisable(parser, outputIgnoredStatements, tableName, database); } else if (parser.ExpectOptional("REPLICA IDENTITY")) { parser.Expect("NOTHING"); } else { throw new TeamworkParserException("CannotParseStringUnsupportedCommand"); } if (parser.ExpectOptional(";")) { break; } else { parser.Expect(","); } } }
/// <summary> /// Outputs statement for modified sequences. /// </summary> public static void Alter(StreamWriter writer, [NullGuard.AllowNull] PgSchema oldSchema, PgSchema newSchema, SearchPathHelper searchPathHelper, bool ignoreStartWith) { if (oldSchema == null) { return; } var alterSequenceSql = new StringBuilder(100); foreach (PgSequence newSequence in newSchema.Sequences) { PgSequence oldSequence = oldSchema.GetSequence(newSequence.Name); if (oldSequence == null) { continue; } alterSequenceSql.Length = 0; var oldIncrement = oldSequence.Increment; var newIncrement = newSequence.Increment; if (newIncrement != null && !newIncrement.Equals(oldIncrement)) { alterSequenceSql.Append("\n\tINCREMENT BY "); alterSequenceSql.Append(newIncrement); } var oldMinValue = oldSequence.MinValue; var newMinValue = newSequence.MinValue; if (newMinValue == null && oldMinValue != null) { alterSequenceSql.Append("\n\tNO MINVALUE"); } else if (newMinValue != null && !newMinValue.Equals(oldMinValue)) { alterSequenceSql.Append("\n\tMINVALUE "); alterSequenceSql.Append(newMinValue); } var oldMaxValue = oldSequence.MaxValue; var newMaxValue = newSequence.MaxValue; if (newMaxValue == null && oldMaxValue != null) { alterSequenceSql.Append("\n\tNO MAXVALUE"); } else if (newMaxValue != null && !newMaxValue.Equals(oldMaxValue)) { alterSequenceSql.Append("\n\tMAXVALUE "); alterSequenceSql.Append(newMaxValue); } if (!ignoreStartWith) { var oldStart = oldSequence.StartWith; var newStart = newSequence.StartWith; if (newStart != null && !newStart.Equals(oldStart)) { alterSequenceSql.Append("\n\tRESTART WITH "); alterSequenceSql.Append(newStart); } } var oldCache = oldSequence.Cache; var newCache = newSequence.Cache; if (newCache != null && !newCache.Equals(oldCache)) { alterSequenceSql.Append("\n\tCACHE "); alterSequenceSql.Append(newCache); } var oldCycle = oldSequence.Cycle; var newCycle = newSequence.Cycle; if (oldCycle && !newCycle) { alterSequenceSql.Append("\n\tNO CYCLE"); } else if (!oldCycle && newCycle) { alterSequenceSql.Append("\n\tCYCLE"); } var oldOwnedBy = oldSequence.Owner; var newOwnedBy = newSequence.Owner; if (newOwnedBy != null && !newOwnedBy.Equals(oldOwnedBy)) { alterSequenceSql.Append("\n\tOWNED BY "); alterSequenceSql.Append(newOwnedBy); } if (alterSequenceSql.Length > 0) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("ALTER SEQUENCE " + PgDiffStringExtension.QuoteName(newSequence.Name)); writer.Write(alterSequenceSql.ToString()); writer.WriteLine(';'); } if ((oldSequence.Comment == null && newSequence.Comment != null) || (oldSequence.Comment != null && newSequence.Comment != null && !oldSequence.Comment.Equals(newSequence.Comment))) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("COMMENT ON SEQUENCE "); writer.Write(PgDiffStringExtension.QuoteName(newSequence.Name)); writer.Write(" IS "); writer.Write(newSequence.Comment); writer.WriteLine(';'); } else if (oldSequence.Comment != null && newSequence.Comment == null) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("COMMENT ON SEQUENCE "); writer.Write(newSequence.Name); writer.WriteLine(" IS NULL;"); } } }
public static void AlterSequences(TextWriter writer, PgDiffArguments arguments, PgSchema oldSchema, PgSchema newSchema, SearchPathHelper searchPathHelper) { if (oldSchema == null) { return; } var sbSql = new StringBuilder(100); foreach (var newSequence in newSchema.GetSequences()) { var oldSequence = oldSchema.GetSequence(newSequence.Name); if (oldSequence == null) { continue; } sbSql.Length = 0; var oldIncrement = oldSequence.Increment; var newIncrement = newSequence.Increment; if (newIncrement != null && !newIncrement.Equals(oldIncrement)) { sbSql.Append("\n\tINCREMENT BY "); sbSql.Append(newIncrement); } var oldMinValue = oldSequence.MinValue; var newMinValue = newSequence.MinValue; if (newMinValue == null && oldMinValue != null) { sbSql.Append("\n\tNO MINVALUE"); } else if (newMinValue != null && !newMinValue.Equals(oldMinValue)) { sbSql.Append("\n\tMINVALUE "); sbSql.Append(newMinValue); } var oldMaxValue = oldSequence.MaxValue; var newMaxValue = newSequence.MaxValue; if (newMaxValue == null && oldMaxValue != null) { sbSql.Append("\n\tNO MAXVALUE"); } else if (newMaxValue != null && !newMaxValue.Equals(oldMaxValue)) { sbSql.Append("\n\tMAXVALUE "); sbSql.Append(newMaxValue); } if (!arguments.IgnoreStartWith) { var oldStart = oldSequence.StartWith; var newStart = newSequence.StartWith; if (newStart != null && !newStart.Equals(oldStart)) { sbSql.Append("\n\tRESTART WITH "); sbSql.Append(newStart); } } var oldCache = oldSequence.Cache; var newCache = newSequence.Cache; if (newCache != null && !newCache.Equals(oldCache)) { sbSql.Append("\n\tCACHE "); sbSql.Append(newCache); } var oldCycle = oldSequence.Cycle; var newCycle = newSequence.Cycle; if (oldCycle && !newCycle) { sbSql.Append("\n\tNO CYCLE"); } else if (!oldCycle && newCycle) { sbSql.Append("\n\tCYCLE"); } var oldOwnedBy = oldSequence.OwnedBy; var newOwnedBy = newSequence.OwnedBy; if (newOwnedBy != null && !newOwnedBy.Equals(oldOwnedBy)) { sbSql.Append("\n\tOWNED BY "); sbSql.Append(newOwnedBy); } if (sbSql.Length > 0) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("ALTER SEQUENCE " + PgDiffUtils.GetQuotedName(newSequence.Name)); writer.Write(sbSql.ToString()); writer.WriteLine(';'); } if (oldSequence.Comment == null && newSequence.Comment != null || oldSequence.Comment != null && newSequence.Comment != null && !oldSequence.Comment.Equals( newSequence.Comment)) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("COMMENT ON SEQUENCE "); writer.Write(PgDiffUtils.GetQuotedName(newSequence.Name)); writer.Write(" IS "); writer.Write(newSequence.Comment); writer.WriteLine(';'); } else if (oldSequence.Comment != null && newSequence.Comment == null) { searchPathHelper.OutputSearchPath(writer); writer.WriteLine(); writer.Write("COMMENT ON SEQUENCE "); writer.Write(newSequence.Name); writer.WriteLine(" IS NULL;"); } } }