in go/adbc/validation/validation.go [719:806]
func (s *StatementTests) TestSqlIngestErrors() {
if !s.Quirks.SupportsBulkIngest() {
s.T().SkipNow()
}
stmt, err := s.Cnxn.NewStatement()
s.Require().NoError(err)
defer stmt.Close()
s.Run("ingest without bind", func() {
var e adbc.Error
s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestTargetTable, "bulk_ingest"))
_, _, err := stmt.ExecuteQuery(s.ctx)
s.ErrorAs(err, &e)
s.Equal(adbc.StatusInvalidState, e.Code)
})
s.Run("append to nonexistent table", func() {
s.Require().NoError(s.Quirks.DropTable(s.Cnxn, "bulk_ingest"))
schema := arrow.NewSchema([]arrow.Field{{
Name: "int64s", Type: arrow.PrimitiveTypes.Int64, Nullable: true}}, nil)
batchbldr := array.NewRecordBuilder(s.Quirks.Alloc(), schema)
defer batchbldr.Release()
bldr := batchbldr.Field(0).(*array.Int64Builder)
bldr.AppendValues([]int64{42, -42, 0}, []bool{true, true, false})
batch := batchbldr.NewRecord()
defer batch.Release()
s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestTargetTable, "bulk_ingest"))
s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestMode, adbc.OptionValueIngestModeAppend))
s.Require().NoError(stmt.Bind(s.ctx, batch))
var e adbc.Error
_, _, err := stmt.ExecuteQuery(s.ctx)
s.ErrorAs(err, &e)
s.NotEqual(adbc.StatusOK, e.Code)
// SQLSTATE 42S02 == table or view not found
s.Equal([5]byte{'4', '2', 'S', '0', '2'}, e.SqlState)
})
s.Run("overwrite and incompatible schema", func() {
s.Require().NoError(s.Quirks.DropTable(s.Cnxn, "bulk_ingest"))
schema := arrow.NewSchema([]arrow.Field{{
Name: "int64s", Type: arrow.PrimitiveTypes.Int64, Nullable: true}}, nil)
batchbldr := array.NewRecordBuilder(s.Quirks.Alloc(), schema)
defer batchbldr.Release()
bldr := batchbldr.Field(0).(*array.Int64Builder)
bldr.AppendValues([]int64{42, -42, 0}, []bool{true, true, false})
batch := batchbldr.NewRecord()
defer batch.Release()
s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestTargetTable, "bulk_ingest"))
s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestMode, adbc.OptionValueIngestModeCreate))
s.Require().NoError(stmt.Bind(s.ctx, batch))
// create it
_, err := stmt.ExecuteUpdate(s.ctx)
s.Require().NoError(err)
// error if we try to create again
s.Require().NoError(stmt.Bind(s.ctx, batch))
var e adbc.Error
_, err = stmt.ExecuteUpdate(s.ctx)
s.ErrorAs(err, &e)
s.Equal(adbc.StatusInternal, e.Code)
// try to append an incompatible schema
schema, _ = schema.AddField(1, arrow.Field{Name: "coltwo", Type: arrow.PrimitiveTypes.Int64, Nullable: true})
batchbldr = array.NewRecordBuilder(s.Quirks.Alloc(), schema)
defer batchbldr.Release()
batchbldr.Field(0).AppendNull()
batchbldr.Field(1).AppendNull()
batch = batchbldr.NewRecord()
defer batch.Release()
s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestTargetTable, "bulk_ingest"))
s.Require().NoError(stmt.SetOption(adbc.OptionKeyIngestMode, adbc.OptionValueIngestModeAppend))
s.Require().NoError(stmt.Bind(s.ctx, batch))
_, err = stmt.ExecuteUpdate(s.ctx)
s.ErrorAs(err, &e)
s.NotEqual(adbc.StatusOK, e.Code)
})
}