GetIndexes implements sql.IndexAddressableTable. This is only used for show index in SHOW INDEX and SHOW CREATE TABLE.
(ctx *sql.Context)
| 645 | strings.Join(columns, ", "))) |
| 646 | |
| 647 | // DuckDB does not retain the logical MySQL prefix length, so keep it in |
| 648 | // managed metadata alongside the user-visible index comment. |
| 649 | if indexDef.Comment != "" || hasPrefix { |
| 650 | meta := IndexMeta{} |
| 651 | if hasPrefix { |
| 652 | meta.PrefixLengths = prefixLengths |
| 653 | } |
| 654 | comment := NewCommentWithMeta(indexDef.Comment, meta) |
| 655 | b.WriteString(fmt.Sprintf("; COMMENT ON INDEX %s IS '%s'", |
| 656 | FullIndexName(t.db.catalog, t.db.name, EncodeIndexName(t.name, indexDef.Name)), |
| 657 | comment.Encode())) |
| 658 | } |
| 659 | |
| 660 | // Execute the SQL statement to create the index |
| 661 | _, err := adapter.Exec(ctx, b.String()) |
| 662 | if err != nil { |
| 663 | if IsDuckDBIndexAlreadyExistsError(err) { |
| 664 | return sql.ErrDuplicateKey.New(indexDef.Name) |
| 665 | } |
| 666 | if IsDuckDBUniqueConstraintViolationError(err) { |
| 667 | return sql.ErrUniqueKeyViolation.New() |
| 668 | } |
| 669 | |
| 670 | return ErrDuckDB.New(err) |
| 671 | } |
| 672 | |
| 673 | return nil |
| 674 | } |
| 675 | |
| 676 | // DropIndex implements sql.IndexAlterableTable. |
| 677 | func (t *Table) DropIndex(ctx *sql.Context, indexName string) error { |
| 678 | t.mu.Lock() |
| 679 | defer t.mu.Unlock() |
| 680 | |
| 681 | // Construct the SQL statement for dropping the index |
| 682 | // DuckDB requires switching context to the schema by USE statement |
| 683 | sql := fmt.Sprintf(`USE %s; DROP INDEX "%s"`, |
| 684 | FullSchemaName(t.db.catalog, t.db.name), |
| 685 | EncodeIndexName(t.name, indexName)) |
| 686 | |
| 687 | // Execute the SQL statement to drop the index |
| 688 | _, err := adapter.Exec(ctx, sql) |
| 689 | if err != nil { |
| 690 | return ErrDuckDB.New(err) |
| 691 | } |
| 692 | |
| 693 | return nil |
| 694 | } |
| 695 | |
| 696 | // RenameIndex implements sql.IndexAlterableTable. |
| 697 | func (t *Table) RenameIndex(ctx *sql.Context, fromIndexName string, toIndexName string) error { |
| 698 | return sql.ErrUnsupportedFeature.New("RenameIndex is not supported") |
| 699 | } |
| 700 | |
| 701 | // GetIndexes implements sql.IndexAddressableTable. |
| 702 | // This is only used for show index in SHOW INDEX and SHOW CREATE TABLE. |
| 703 | func (t *Table) GetIndexes(ctx *sql.Context) ([]sql.Index, error) { |
| 704 | t.mu.RLock() |