func()

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)
	})
}