 	var distinct: Bool = false
 }
 
+struct SQLInsert {
+	var orReplace: Bool = false
+	var into: SQLTable
+	var columns: [SQLColumn] = []
+	var values: [[SQLExpression]] = []
+}
+
 enum SQLStatement {
 	case create(table: SQLTable, schema: SQLSchema)
 	case delete(from: SQLTable, where: SQLExpression?)
 	case drop(table: SQLTable)
-	case insert(into: SQLTable, columns: [SQLColumn], values: [[SQLExpression]])
+	case insert(SQLInsert)
 	case select(SQLSelect)
 	case update
 


	var isMutating: Bool {
		switch self {
		case .create, .drop, .delete, .update, .insert(into:_, columns:_, values:_):
			return true

		case .select(_):

		add_named_rule("ex", rule: ^"ex-equality")

		// Types
		add_named_rule("type-text", rule: Parser.matchLiteralInsensitive("TEXT") => { self.stack.append(.type(SQLType.text)) })
		add_named_rule("type-int", rule: Parser.matchLiteralInsensitive("INT") => { self.stack.append(.type(SQLType.int)) })
		add_named_rule("type", rule: ^"type-text" | ^"type-int")

		// Column definition
