@@ -585,3 +585,136 @@ statement ok
585585DROP TABLE t_aost;
586586
587587subtest end
588+
589+ subtest inspect_non_key_encodable_types
590+
591+ statement ok
592+ CREATE TABLE tsvector_tbl (
593+ id INT PRIMARY KEY,
594+ a INT,
595+ tsv TSVECTOR NOT NULL,
596+ INDEX idx_a_tsv (a) STORING (tsv)
597+ );
598+
599+ statement ok
600+ INSERT INTO tsvector_tbl VALUES
601+ (1, 10, 'hello world'::TSVECTOR),
602+ (2, 20, 'foo bar'::TSVECTOR);
603+
604+ # First verify that datums_to_bytes does not support TSVECTOR
605+ statement error pq: illegal argument 0 of type tsvector
606+ SELECT crdb_internal.datums_to_bytes(tsv) FROM tsvector_tbl LIMIT 1;
607+
608+ # TSVECTOR cannot be key-encoded, so the hash precheck will be skipped.
609+ # The JOIN-based check should work fine.
610+ statement ok
611+ INSPECT TABLE tsvector_tbl WITH OPTIONS INDEX (idx_a_tsv);
612+
613+ query TI
614+ SELECT * FROM last_inspect_job;
615+ ----
616+ succeeded 1
617+
618+ statement ok
619+ CREATE TABLE tsquery_tbl (
620+ id INT PRIMARY KEY,
621+ a INT,
622+ tsq TSQUERY NOT NULL,
623+ INDEX idx_a_tsq (a) STORING (tsq)
624+ );
625+
626+ statement ok
627+ INSERT INTO tsquery_tbl VALUES
628+ (1, 10, 'search & term'::TSQUERY),
629+ (2, 20, 'another | query'::TSQUERY);
630+
631+ # First verify that datums_to_bytes does not support TSQUERY
632+ statement error pq: illegal argument 0 of type tsquery
633+ SELECT crdb_internal.datums_to_bytes(tsq) FROM tsquery_tbl LIMIT 1;
634+
635+ # TSQUERY cannot be key-encoded, so the hash precheck will be skipped.
636+ # The JOIN-based check should work fine.
637+ statement ok
638+ INSPECT TABLE tsquery_tbl WITH OPTIONS INDEX (idx_a_tsq);
639+
640+ query TI
641+ SELECT * FROM last_inspect_job;
642+ ----
643+ succeeded 1
644+
645+ statement ok
646+ CREATE TABLE pgvector_tbl (
647+ id INT PRIMARY KEY,
648+ a INT,
649+ vec VECTOR(3) NOT NULL,
650+ INDEX idx_a_vec (a) STORING (vec)
651+ );
652+
653+ statement ok
654+ INSERT INTO pgvector_tbl VALUES
655+ (1, 10, '[1.0, 2.0, 3.0]'::VECTOR(3)),
656+ (2, 20, '[4.0, 5.0, 6.0]'::VECTOR(3));
657+
658+ # First verify that datums_to_bytes does not support VECTOR
659+ statement error pq: illegal argument 0 of type vector
660+ SELECT crdb_internal.datums_to_bytes(vec) FROM pgvector_tbl LIMIT 1;
661+
662+ # VECTOR cannot be key-encoded, so the hash precheck will be skipped.
663+ # The JOIN-based check should work fine.
664+ statement ok
665+ INSPECT TABLE pgvector_tbl WITH OPTIONS INDEX (idx_a_vec);
666+
667+ query TI
668+ SELECT * FROM last_inspect_job;
669+ ----
670+ succeeded 1
671+
672+ # Test with multiple problematic types in the same index.
673+ statement ok
674+ CREATE TABLE multi_type_tbl (
675+ id INT PRIMARY KEY,
676+ a INT,
677+ tsv TSVECTOR,
678+ tsq TSQUERY NOT NULL,
679+ vec VECTOR(2),
680+ INDEX idx_a_multi (a) STORING (tsv, tsq, vec)
681+ );
682+
683+ statement ok
684+ INSERT INTO multi_type_tbl VALUES
685+ (1, 10, 'word1 word2'::TSVECTOR, 'search'::TSQUERY, '[1.0, 2.0]'::VECTOR(2)),
686+ (2, 20, NULL, 'query'::TSQUERY, NULL);
687+
688+ # Verify that datums_to_bytes fails on each type individually.
689+ statement error pq: illegal argument 0 of type tsvector
690+ SELECT crdb_internal.datums_to_bytes('word1 word2'::TSVECTOR);
691+
692+ statement error pq: illegal argument 0 of type tsquery
693+ SELECT crdb_internal.datums_to_bytes('search'::TSQUERY);
694+
695+ statement error pq: illegal argument 0 of type vector
696+ SELECT crdb_internal.datums_to_bytes('[1.0, 2.0]'::VECTOR(2));
697+
698+ # Multiple non-key-encodable types: hash precheck will be skipped.
699+ # The JOIN-based check should work fine.
700+ statement ok
701+ INSPECT TABLE multi_type_tbl WITH OPTIONS INDEX (idx_a_multi);
702+
703+ query TI
704+ SELECT * FROM last_inspect_job;
705+ ----
706+ succeeded 1
707+
708+ statement ok
709+ DROP TABLE tsvector_tbl;
710+
711+ statement ok
712+ DROP TABLE tsquery_tbl;
713+
714+ statement ok
715+ DROP TABLE pgvector_tbl;
716+
717+ statement ok
718+ DROP TABLE multi_type_tbl;
719+
720+ subtest end
0 commit comments