/
fts$install.sql
1321 lines (1134 loc) · 42.3 KB
/
fts$install.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/**
* IBSurgeon Full Text Search UDR library installation script for databases in 3 SQL dialect.
*
* The original code was created by Simonov Denis
* for the open source project "IBSurgeon Full Text Search UDR".
*
* Copyright (c) 2022 Simonov Denis <sim-mail@list.ru>
* and all contributors signed below.
*
* All Rights Reserved.
* Contributor(s): ______________________________________.
**/
CREATE EXCEPTION FTS$EXCEPTION 'Custom FTS error';
CREATE DOMAIN FTS$D_INDEX_STATUS
CHAR(1) CHARACTER SET UTF8
CHECK (VALUE IN ('I', 'N', 'C', 'U'));
COMMENT ON DOMAIN FTS$D_INDEX_STATUS IS
'Full-text index status. I - Inactive, N - New index (need rebuild), C - complete and active, U - updated metadata (need rebuild).';
CREATE DOMAIN FTS$D_CHANGE_TYPE
CHAR(1) CHARACTER SET UTF8
CHECK (VALUE IN ('I', 'U', 'D'));
COMMENT ON DOMAIN FTS$D_CHANGE_TYPE IS
'Type of record change. I - INSERT, U - UPDATE, D - DELETE.';
CREATE TABLE FTS$INDICES(
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 DEFAULT 'STANDARD' NOT NULL,
FTS$DESCRIPTION BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$INDEX_STATUS FTS$D_INDEX_STATUS DEFAULT 'N' NOT NULL,
CONSTRAINT PK_FTS$INDEX_NAME PRIMARY KEY(FTS$INDEX_NAME)
);
CREATE INDEX IDX_FTS$INDICES_RELATION
ON FTS$INDICES (FTS$RELATION_NAME);
CREATE INDEX IDX_FTS$INDICES_ANALYZER
ON FTS$INDICES (FTS$ANALYZER);
COMMENT ON TABLE FTS$INDICES IS
'Indexes for full-text search.';
COMMENT ON COLUMN FTS$INDICES.FTS$INDEX_NAME IS
'Full-text index name.';
COMMENT ON COLUMN FTS$INDICES.FTS$RELATION_NAME IS
'Name of the indexed table.';
COMMENT ON COLUMN FTS$INDICES.FTS$ANALYZER IS
'The analyzer. If not specified, it uses STANDARD (StandardAnalyzer) by default.';
COMMENT ON COLUMN FTS$INDICES.FTS$DESCRIPTION IS
'Description of the full-text index.';
COMMENT ON COLUMN FTS$INDICES.FTS$INDEX_STATUS IS
'Full-text index status.';
CREATE TABLE FTS$INDEX_SEGMENTS(
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$BOOST DOUBLE PRECISION,
FTS$KEY BOOLEAN DEFAULT FALSE NOT NULL,
CONSTRAINT UK_FTS$INDEX_SEGMENTS UNIQUE(FTS$INDEX_NAME, FTS$FIELD_NAME),
CONSTRAINT FK_FTS$INDEX_SEGMENTS FOREIGN KEY(FTS$INDEX_NAME) REFERENCES FTS$INDICES(FTS$INDEX_NAME) ON DELETE CASCADE
);
COMMENT ON TABLE FTS$INDEX_SEGMENTS IS
'Segments of the full-text index.';
COMMENT ON COLUMN FTS$INDEX_SEGMENTS.FTS$INDEX_NAME IS
'Full-text index name.';
COMMENT ON COLUMN FTS$INDEX_SEGMENTS.FTS$FIELD_NAME IS
'Name of the indexed field.';
COMMENT ON COLUMN FTS$INDEX_SEGMENTS.FTS$BOOST IS
'Boost significance';
COMMENT ON COLUMN FTS$INDEX_SEGMENTS.FTS$KEY IS
'Is the field a key';
CREATE TABLE FTS$ANALYZERS (
FTS$ANALYZER_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$BASE_ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$DESCRIPTION BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
CONSTRAINT PK_FTS$ANALYZER PRIMARY KEY(FTS$ANALYZER_NAME)
);
COMMENT ON TABLE FTS$ANALYZERS IS
'Custom full-text search analyzers';
COMMENT ON COLUMN FTS$ANALYZERS.FTS$ANALYZER_NAME IS
'Analyzer name';
COMMENT ON COLUMN FTS$ANALYZERS.FTS$ANALYZER_NAME IS
'Base Analyzer name';
COMMENT ON COLUMN FTS$ANALYZERS.FTS$ANALYZER_NAME IS
'Description of analyzer';
CREATE TABLE FTS$STOP_WORDS (
FTS$ANALYZER_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$WORD VARCHAR(63) CHARACTER SET UTF8 NOT NULL COLLATE UNICODE_CI,
CONSTRAINT UNQ_FTS$ANALYZER_STOPWORDS UNIQUE(FTS$ANALYZER_NAME, FTS$WORD)
);
ALTER TABLE FTS$STOP_WORDS
ADD CONSTRAINT FK_FTS$STOP_WORDS_ANALYZER
FOREIGN KEY (FTS$ANALYZER_NAME) REFERENCES FTS$ANALYZERS(FTS$ANALYZER_NAME)
ON DELETE CASCADE;
COMMENT ON TABLE FTS$STOP_WORDS IS
'Stop words for a custom analyzer';
COMMENT ON COLUMN FTS$STOP_WORDS.FTS$ANALYZER_NAME IS
'Analyzer name';
COMMENT ON COLUMN FTS$STOP_WORDS.FTS$WORD IS
'Stop word';
CREATE TABLE FTS$LOG (
FTS$LOG_ID BIGINT GENERATED BY DEFAULT AS IDENTITY,
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$DB_KEY CHAR(8) CHARACTER SET OCTETS,
FTS$REC_UUID CHAR(16) CHARACTER SET OCTETS,
FTS$REC_ID BIGINT,
FTS$CHANGE_TYPE FTS$D_CHANGE_TYPE NOT NULL,
CONSTRAINT PK_FTS$LOG_ID PRIMARY KEY(FTS$LOG_ID)
);
COMMENT ON TABLE FTS$LOG IS
'Changelog for maintaining full-text indexes.';
COMMENT ON COLUMN FTS$LOG.FTS$LOG_ID IS
'Identifier.';
COMMENT ON COLUMN FTS$LOG.FTS$RELATION_NAME IS
'Name of the indexed table.';
COMMENT ON COLUMN FTS$LOG.FTS$DB_KEY IS
'Record ID by RDB$DB_KEY';
COMMENT ON COLUMN FTS$LOG.FTS$REC_UUID IS
'Record ID by UUID (GUID)';
COMMENT ON COLUMN FTS$LOG.FTS$REC_ID IS
'Record ID by Integer ID';
COMMENT ON COLUMN FTS$LOG.FTS$CHANGE_TYPE IS
'Type of record change.';
SET TERM ^ ;
CREATE OR ALTER PACKAGE FTS$MANAGEMENT
AS
BEGIN
/**
* Returns the directory where the files and folders
* of the full-text index for the current database are located.
**/
FUNCTION FTS$GET_DIRECTORY ()
RETURNS VARCHAR(255) CHARACTER SET UTF8
DETERMINISTIC;
/**
* Returns a list of available analyzers.
*
* Output parameters:
* FTS$ANALYZER - analyzer name;
* FTS$BASE_ANALYZER - name of base analyzer;
* FTS$STOP_WORDS_SUPPORTED - stop words supported;
* FTS$SYSTEM_FLAG - is system analyzer.
**/
PROCEDURE FTS$ANALYZERS
RETURNS (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8,
FTS$BASE_ANALYZER VARCHAR(63) CHARACTER SET UTF8,
FTS$STOP_WORDS_SUPPORTED BOOLEAN,
FTS$SYSTEM_FLAG BOOLEAN);
/**
* Create custom analyzer.
*
* Input parameters:
* FTS$ANALYZER - analyzer name;
* FTS$BASE_ANALYZER - name of base analyzer;
* FTS$DESCRIPTION - description of the analyzer.
**/
PROCEDURE FTS$CREATE_ANALYZER (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$BASE_ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$DESCRIPTION BLOB SUB_TYPE TEXT CHARACTER SET UTF8 DEFAULT NULL);
/**
* Drop custom analyzer.
*
* Input parameters:
* FTS$ANALYZER - analyzer name.
**/
PROCEDURE FTS$DROP_ANALYZER (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL);
/**
* Returns a list of stop words by analyzer.
*
* Input parameters:
* FTS$ANALYZER - analyzer name.
*
* Output parameters:
* FTS$WORD - stop word.
**/
PROCEDURE FTS$ANALYZER_STOP_WORDS (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
RETURNS (
FTS$WORD VARCHAR(63) CHARACTER SET UTF8);
/**
* Add stop word to custom analyzer.
*
* Input parameters:
* FTS$ANALYZER - analyzer name;
* FTS$WORD - stop word.
**/
PROCEDURE FTS$ADD_STOP_WORD (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$WORD VARCHAR(63) CHARACTER SET UTF8 NOT NULL);
/**
* Delete stop word from custom analyzer.
*
* Input parameters:
* FTS$ANALYZER - analyzer name;
* FTS$WORD - stop word.
**/
PROCEDURE FTS$DROP_STOP_WORD (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$WORD VARCHAR(63) CHARACTER SET UTF8 NOT NULL);
/**
* Create a new full-text index.
*
* Input parameters:
* FTS$INDEX_NAME - name of the index;
* FTS$RELATION_NAME - name of the table to be indexed;
* FTS$ANALYZER - analyzer name;
* FTS$KEY_FIELD_NAME - key field name;
* FTS$DESCRIPTION - description of the index.
**/
PROCEDURE FTS$CREATE_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 DEFAULT 'STANDARD',
FTS$KEY_FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 DEFAULT NULL,
FTS$DESCRIPTION BLOB SUB_TYPE TEXT CHARACTER SET UTF8 DEFAULT NULL);
/**
* Delete the full-text index.
*
* Input parameters:
* FTS$INDEX_NAME - name of the index.
**/
PROCEDURE FTS$DROP_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL);
/**
* Allows to make the index active or inactive.
*
* Input parameters:
* FTS$INDEX_NAME - name of the index;
* FTS$INDEX_ACTIVE - activity flag.
**/
PROCEDURE FTS$SET_INDEX_ACTIVE (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$INDEX_ACTIVE BOOLEAN NOT NULL);
/**
* Sets the index description.
*
* Input parameters:
* FTS$INDEX_NAME - name of the index;
* FTS$DESCRIPTION - index description.
**/
PROCEDURE FTS$COMMENT_ON_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$DESCRIPTION BLOB SUB_TYPE TEXT CHARACTER SET UTF8);
/**
* Add a new segment (indexed table field) of the full-text index.
*
* Input parameters:
* FTS$INDEX_NAME - name of the index;
* FTS$FIELD_NAME - the name of the field to be indexed;
* FTS$BOOST - the coefficient of increasing the significance of the segment.
**/
PROCEDURE FTS$ADD_INDEX_FIELD (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$BOOST DOUBLE PRECISION DEFAULT NULL);
/**
* Delete a segment (indexed table field) of the full-text index.
*
* Input parameters:
* FTS$INDEX_NAME - index name;
* FTS$FIELD_NAME - field name.
**/
PROCEDURE FTS$DROP_INDEX_FIELD (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL);
/**
* Sets the significance multiplier for the full-text index field.
*
* Input parameters:
* FTS$INDEX_NAME - name of the index;
* FTS$FIELD_NAME - name of the field;
* FTS$BOOST - the coefficient of increasing the significance of the segment.
**/
PROCEDURE FTS$SET_INDEX_FIELD_BOOST (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$BOOST DOUBLE PRECISION);
/**
* Rebuild the full-text index.
*
* Input parameters:
* FTS$INDEX_NAME - index name.
**/
PROCEDURE FTS$REBUILD_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL);
/**
* Rebuild all full-text indexes for the specified table.
*
* Input parameters:
* FTS$RELATION_NAME - table name.
**/
PROCEDURE FTS$REINDEX_TABLE (
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL);
/**
* Rebuild all full-text indexes in the database.
**/
PROCEDURE FTS$FULL_REINDEX;
/**
* Optimize the full-text index.
*
* Input parameters:
* FTS$INDEX_NAME - index name.
**/
PROCEDURE FTS$OPTIMIZE_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL
);
/**
* Optimize all full-text indexes.
**/
PROCEDURE FTS$OPTIMIZE_INDEXES;
END^
RECREATE PACKAGE BODY FTS$MANAGEMENT
AS
BEGIN
FUNCTION FTS$GET_DIRECTORY ()
RETURNS VARCHAR(255) CHARACTER SET UTF8
DETERMINISTIC
EXTERNAL NAME 'luceneudr!getFTSDirectory' ENGINE UDR;
PROCEDURE FTS$ANALYZERS
RETURNS (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8,
FTS$BASE_ANALYZER VARCHAR(63) CHARACTER SET UTF8,
FTS$STOP_WORDS_SUPPORTED BOOLEAN,
FTS$SYSTEM_FLAG BOOLEAN)
EXTERNAL NAME 'luceneudr!getAnalyzers' ENGINE UDR;
PROCEDURE FTS$CREATE_ANALYZER (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$BASE_ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$DESCRIPTION BLOB SUB_TYPE TEXT CHARACTER SET UTF8)
EXTERNAL NAME 'luceneudr!createAnalyzer' ENGINE UDR;
PROCEDURE FTS$DROP_ANALYZER (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
EXTERNAL NAME 'luceneudr!dropAnalyzer' ENGINE UDR;
PROCEDURE FTS$ANALYZER_STOP_WORDS (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
RETURNS (
FTS$WORD VARCHAR(63) CHARACTER SET UTF8)
EXTERNAL NAME 'luceneudr!getAnalyzerStopWords' ENGINE UDR;
PROCEDURE FTS$ADD_STOP_WORD (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$WORD VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
EXTERNAL NAME 'luceneudr!addStopWord' ENGINE UDR;
PROCEDURE FTS$DROP_STOP_WORD (
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$WORD VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
EXTERNAL NAME 'luceneudr!dropStopWord' ENGINE UDR;
PROCEDURE FTS$CREATE_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8,
FTS$KEY_FIELD_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$DESCRIPTION BLOB SUB_TYPE TEXT CHARACTER SET UTF8)
EXTERNAL NAME 'luceneudr!createIndex' ENGINE UDR;
PROCEDURE FTS$DROP_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
EXTERNAL NAME 'luceneudr!dropIndex' ENGINE UDR;
PROCEDURE FTS$SET_INDEX_ACTIVE (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$INDEX_ACTIVE BOOLEAN NOT NULL)
EXTERNAL NAME 'luceneudr!setIndexActive' ENGINE UDR;
PROCEDURE FTS$COMMENT_ON_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$DESCRIPTION BLOB SUB_TYPE TEXT CHARACTER SET UTF8)
AS
BEGIN
UPDATE FTS$INDICES
SET FTS$DESCRIPTION = :FTS$DESCRIPTION
WHERE FTS$INDEX_NAME = :FTS$INDEX_NAME;
END
PROCEDURE FTS$ADD_INDEX_FIELD (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$BOOST DOUBLE PRECISION)
EXTERNAL NAME 'luceneudr!addIndexField' ENGINE UDR;
PROCEDURE FTS$DROP_INDEX_FIELD (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
EXTERNAL NAME 'luceneudr!dropIndexField' ENGINE UDR;
PROCEDURE FTS$SET_INDEX_FIELD_BOOST (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$BOOST DOUBLE PRECISION)
EXTERNAL NAME 'luceneudr!setIndexFieldBoost' ENGINE UDR;
PROCEDURE FTS$REBUILD_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
EXTERNAL NAME 'luceneudr!rebuildIndex' ENGINE UDR;
PROCEDURE FTS$REINDEX_TABLE (
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
AS
BEGIN
FOR
SELECT I.FTS$INDEX_NAME
FROM FTS$INDICES I
WHERE I.FTS$RELATION_NAME = :FTS$RELATION_NAME
AS CURSOR C
DO
EXECUTE PROCEDURE FTS$MANAGEMENT.FTS$REBUILD_INDEX(:C.FTS$INDEX_NAME);
END
PROCEDURE FTS$FULL_REINDEX
AS
BEGIN
FOR
SELECT
FTS$INDEX_NAME
FROM FTS$INDICES
AS CURSOR C
DO
EXECUTE PROCEDURE FTS$MANAGEMENT.FTS$REBUILD_INDEX(:C.FTS$INDEX_NAME);
END
PROCEDURE FTS$OPTIMIZE_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL)
EXTERNAL NAME 'luceneudr!optimizeIndex' ENGINE UDR;
PROCEDURE FTS$OPTIMIZE_INDEXES
AS
BEGIN
FOR
SELECT I.FTS$INDEX_NAME
FROM FTS$INDICES I
AS CURSOR C
DO
EXECUTE PROCEDURE FTS$MANAGEMENT.FTS$OPTIMIZE_INDEX(:C.FTS$INDEX_NAME);
END
END
^
SET TERM ; ^
COMMENT ON PACKAGE FTS$MANAGEMENT IS
'Procedures and functions for managing full-text indexes.';
GRANT ALL ON TABLE FTS$INDICES TO PACKAGE FTS$MANAGEMENT;
GRANT ALL ON TABLE FTS$INDEX_SEGMENTS TO PACKAGE FTS$MANAGEMENT;
CREATE OR ALTER FUNCTION FTS$ESCAPE_QUERY (
FTS$QUERY VARCHAR(8191) CHARACTER SET UTF8
)
RETURNS VARCHAR(8191) CHARACTER SET UTF8
EXTERNAL NAME 'luceneudr!ftsEscapeQuery'
ENGINE UDR;
COMMENT ON FUNCTION FTS$ESCAPE_QUERY IS
'Escapes special characters in the search query.';
COMMENT ON PARAMETER FTS$ESCAPE_QUERY.FTS$QUERY IS
'Full text search expression.';
CREATE OR ALTER PROCEDURE FTS$SEARCH (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$QUERY VARCHAR(8191) CHARACTER SET UTF8,
FTS$LIMIT INT NOT NULL DEFAULT 1000,
FTS$EXPLAIN BOOLEAN DEFAULT FALSE
)
RETURNS (
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$KEY_FIELD_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$DB_KEY CHAR(8) CHARACTER SET OCTETS,
FTS$ID BIGINT,
FTS$UUID CHAR(16) CHARACTER SET OCTETS,
FTS$SCORE DOUBLE PRECISION,
FTS$EXPLANATION BLOB SUB_TYPE TEXT CHARACTER SET UTF8
)
EXTERNAL NAME 'luceneudr!ftsSearch'
ENGINE UDR;
COMMENT ON PROCEDURE FTS$SEARCH IS
'Performs a full-text search at the specified index.';
COMMENT ON PARAMETER FTS$SEARCH.FTS$INDEX_NAME IS
'Name of the full-text index to search.';
COMMENT ON PARAMETER FTS$SEARCH.FTS$QUERY IS
'Full text search expression.';
COMMENT ON PARAMETER FTS$SEARCH.FTS$LIMIT IS
'Limit on the number of records (search result).';
COMMENT ON PARAMETER FTS$SEARCH.FTS$EXPLAIN IS
'Explain the search results';
COMMENT ON PARAMETER FTS$SEARCH.FTS$RELATION_NAME IS
'The name of the table in which the document is found.';
COMMENT ON PARAMETER FTS$SEARCH.FTS$DB_KEY IS
'Reference to the record in the table where the document was found (corresponds to the RDB$DB_KEY pseudo field).';
COMMENT ON PARAMETER FTS$SEARCH.FTS$SCORE IS
'The degree of match to the search query.';
COMMENT ON PARAMETER FTS$SEARCH.FTS$EXPLANATION IS
'Explanation of the search result';
GRANT SELECT ON TABLE FTS$INDICES TO PROCEDURE FTS$SEARCH;
GRANT SELECT ON TABLE FTS$INDEX_SEGMENTS TO PROCEDURE FTS$SEARCH;
CREATE OR ALTER PROCEDURE FTS$ANALYZE (
FTS$TEXT BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL DEFAULT 'STANDARD')
RETURNS (
FTS$TERM VARCHAR(8191) CHARACTER SET UTF8)
EXTERNAL NAME 'luceneudr!ftsAnalyze' ENGINE UDR;
COMMENT ON PROCEDURE FTS$ANALYZE IS
'Split text into terms with the specified analyzer.';
COMMENT ON PARAMETER FTS$ANALYZE.FTS$TEXT IS
'The text to be split into terms';
COMMENT ON PARAMETER FTS$ANALYZE.FTS$ANALYZER IS
'The analyzer on which the text is split';
COMMENT ON PARAMETER FTS$ANALYZE.FTS$TERM IS
'Term';
CREATE OR ALTER PROCEDURE FTS$UPDATE_INDEXES
EXTERNAL NAME 'luceneudr!updateFtsIndexes'
ENGINE UDR;
COMMENT ON PROCEDURE FTS$UPDATE_INDEXES IS
'Updates full-text indexes on entries in the FTS$LOG change log.';
GRANT SELECT ON TABLE FTS$INDICES TO PROCEDURE FTS$UPDATE_INDEXES;
GRANT SELECT ON TABLE FTS$INDEX_SEGMENTS TO PROCEDURE FTS$UPDATE_INDEXES;
GRANT SELECT, DELETE ON TABLE FTS$LOG TO PROCEDURE FTS$UPDATE_INDEXES;
CREATE OR ALTER PROCEDURE FTS$LOG_BY_DBKEY (
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$DBKEY CHAR(8) CHARACTER SET OCTETS NOT NULL,
FTS$CHANGE_TYPE FTS$D_CHANGE_TYPE NOT NULL
)
EXTERNAL NAME 'luceneudr!ftsLogByDdKey'
ENGINE UDR;
COMMENT ON PROCEDURE FTS$LOG_BY_DBKEY IS
'Adds a change record for one of the fields included in full-text indexes built on the table to the change log, based on which full-text indexes will be updated.';
COMMENT ON PARAMETER FTS$LOG_BY_DBKEY.FTS$RELATION_NAME IS
'The name of the table for which the link to the record is added.';
COMMENT ON PARAMETER FTS$LOG_BY_DBKEY.FTS$DBKEY IS
'Record ID(corresponds to the RDB$DB_KEY pseudo field).';
COMMENT ON PARAMETER FTS$LOG_BY_DBKEY.FTS$CHANGE_TYPE IS
'Change type (I - INSERT, U - UPDATE, D - DELETE).';
GRANT INSERT ON TABLE FTS$LOG TO PROCEDURE FTS$LOG_BY_DBKEY;
CREATE OR ALTER PROCEDURE FTS$LOG_BY_UUID (
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$UUID CHAR(16) CHARACTER SET OCTETS NOT NULL,
FTS$CHANGE_TYPE FTS$D_CHANGE_TYPE NOT NULL
)
EXTERNAL NAME 'luceneudr!ftsLogByUuid'
ENGINE UDR;
COMMENT ON PROCEDURE FTS$LOG_BY_UUID IS
'Adds a change record for one of the fields included in full-text indexes built on the table to the change log, based on which full-text indexes will be updated.';
COMMENT ON PARAMETER FTS$LOG_BY_UUID.FTS$RELATION_NAME IS
'The name of the table for which the link to the record is added.';
COMMENT ON PARAMETER FTS$LOG_BY_UUID.FTS$UUID IS
'Record UUID (GUID key).';
COMMENT ON PARAMETER FTS$LOG_BY_UUID.FTS$CHANGE_TYPE IS
'Change type (I - INSERT, U - UPDATE, D - DELETE).';
GRANT INSERT ON TABLE FTS$LOG TO PROCEDURE FTS$LOG_BY_UUID;
CREATE OR ALTER PROCEDURE FTS$LOG_BY_ID (
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$ID BIGINT NOT NULL,
FTS$CHANGE_TYPE FTS$D_CHANGE_TYPE NOT NULL
)
EXTERNAL NAME 'luceneudr!ftsLogById'
ENGINE UDR;
COMMENT ON PROCEDURE FTS$LOG_BY_ID IS
'Adds a change record for one of the fields included in full-text indexes built on the table to the change log, based on which full-text indexes will be updated.';
COMMENT ON PARAMETER FTS$LOG_BY_ID.FTS$RELATION_NAME IS
'The name of the table for which the link to the record is added.';
COMMENT ON PARAMETER FTS$LOG_BY_ID.FTS$ID IS
'Record ID (Integer key).';
COMMENT ON PARAMETER FTS$LOG_BY_ID.FTS$CHANGE_TYPE IS
'Change type (I - INSERT, U - UPDATE, D - DELETE).';
GRANT INSERT ON TABLE FTS$LOG TO PROCEDURE FTS$LOG_BY_ID;
CREATE OR ALTER PROCEDURE FTS$CLEAR_LOG
EXTERNAL NAME 'luceneudr!ftsClearLog'
ENGINE UDR;
COMMENT ON PROCEDURE FTS$CLEAR_LOG IS
'Clears the FTS$LOG entry change log.';
GRANT SELECT, DELETE ON TABLE FTS$LOG TO PROCEDURE FTS$CLEAR_LOG;
SET TERM ^ ;
CREATE OR ALTER PACKAGE FTS$TRIGGER_HELPER
AS
BEGIN
/**
* The FTS$MAKE_TRIGGERS procedure generates trigger source codes for
* a given table to keep full-text indexes up-to-date.
*
* Input parameters:
* FTS$RELATION_NAME - table name for which triggers are created;
* FTS$MULTI_ACTION - universal trigger flag. If set to TRUE,
* then a trigger for multiple actions will be created,
* otherwise a separate trigger will be created for each action;
* FTS$POSITION - position of triggers.
*
* Output parameters:
* FTS$TRIGGER_NAME - trigger name;
* FTS$TRIGGER_RELATION - name of the trigger relation;
* FTS$TRIGGER_EVENTS - events for which the trigger is fired;
* FTS$TRIGGER_POSITION - trigger position;
* FTS$TRIGGER_SOURCE - the text of the source code of the trigger;
* FTS$TRIGGER_SCRIPT - trigger creation script.
**/
PROCEDURE FTS$MAKE_TRIGGERS (
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$MULTI_ACTION BOOLEAN NOT NULL DEFAULT TRUE,
FTS$POSITION SMALLINT NOT NULL DEFAULT 100
)
RETURNS (
FTS$TRIGGER_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_RELATION VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_EVENTS VARCHAR(26) CHARACTER SET UTF8,
FTS$TRIGGER_POSITION SMALLINT,
FTS$TRIGGER_SOURCE BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$TRIGGER_SCRIPT BLOB SUB_TYPE TEXT CHARACTER SET UTF8
);
/**
* The FTS$MAKE_TRIGGERS_BY_INDEX procedure generates trigger source codes
* for a given index to keep the full-text index up to date.
*
* Input parameters:
* FTS$INDEX_NAME - index name for which triggers are created;
* FTS$MULTI_ACTION - universal trigger flag. If set to TRUE,
* then a trigger for multiple actions will be created,
* otherwise a separate trigger will be created for each action;
* FTS$POSITION - position of triggers.
*
* Output parameters:
* FTS$TRIGGER_NAME - trigger name;
* FTS$TRIGGER_RELATION - name of the trigger relation;
* FTS$TRIGGER_EVENTS - events for which the trigger is fired;
* FTS$TRIGGER_POSITION - trigger position;
* FTS$TRIGGER_SOURCE - the text of the source code of the trigger;
* FTS$TRIGGER_SCRIPT - trigger creation script.
**/
PROCEDURE FTS$MAKE_TRIGGERS_BY_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$MULTI_ACTION BOOLEAN NOT NULL DEFAULT TRUE,
FTS$POSITION SMALLINT NOT NULL DEFAULT 100
)
RETURNS (
FTS$TRIGGER_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_RELATION VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_EVENTS VARCHAR(26) CHARACTER SET UTF8,
FTS$TRIGGER_POSITION SMALLINT,
FTS$TRIGGER_SOURCE BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$TRIGGER_SCRIPT BLOB SUB_TYPE TEXT CHARACTER SET UTF8
);
/**
* The FTS$MAKE_ALL_TRIGGERS procedure generates trigger source codes
* to keep all full-text indexes up to date.
*
* Input parameters:
* FTS$MULTI_ACTION - universal trigger flag. If set to TRUE,
* then a trigger for multiple actions will be created,
* otherwise a separate trigger will be created for each action;
* FTS$POSITION - position of triggers.
*
* Output parameters:
* FTS$TRIGGER_NAME - trigger name;
* FTS$TRIGGER_RELATION - name of the trigger relation;
* FTS$TRIGGER_EVENTS - events for which the trigger is fired;
* FTS$TRIGGER_POSITION - trigger position;
* FTS$TRIGGER_SOURCE - the text of the source code of the trigger;
* FTS$TRIGGER_SCRIPT - trigger creation script.
**/
PROCEDURE FTS$MAKE_ALL_TRIGGERS (
FTS$MULTI_ACTION BOOLEAN NOT NULL DEFAULT TRUE,
FTS$POSITION SMALLINT NOT NULL DEFAULT 100
)
RETURNS (
FTS$TRIGGER_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_RELATION VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_EVENTS VARCHAR(26) CHARACTER SET UTF8,
FTS$TRIGGER_POSITION SMALLINT,
FTS$TRIGGER_SOURCE BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$TRIGGER_SCRIPT BLOB SUB_TYPE TEXT CHARACTER SET UTF8
);
END^
RECREATE PACKAGE BODY FTS$TRIGGER_HELPER
AS
BEGIN
PROCEDURE FTS$MAKE_TRIGGERS (
FTS$RELATION_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$MULTI_ACTION BOOLEAN NOT NULL,
FTS$POSITION SMALLINT NOT NULL
)
RETURNS (
FTS$TRIGGER_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_RELATION VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_EVENTS VARCHAR(26) CHARACTER SET UTF8,
FTS$TRIGGER_POSITION SMALLINT,
FTS$TRIGGER_SOURCE BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$TRIGGER_SCRIPT BLOB SUB_TYPE TEXT CHARACTER SET UTF8
)
EXTERNAL NAME 'luceneudr!ftsMakeTrigger'
ENGINE UDR;
PROCEDURE FTS$MAKE_TRIGGERS_BY_INDEX (
FTS$INDEX_NAME VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$MULTI_ACTION BOOLEAN NOT NULL,
FTS$POSITION SMALLINT NOT NULL
)
RETURNS (
FTS$TRIGGER_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_RELATION VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_EVENTS VARCHAR(26) CHARACTER SET UTF8,
FTS$TRIGGER_POSITION SMALLINT,
FTS$TRIGGER_SOURCE BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$TRIGGER_SCRIPT BLOB SUB_TYPE TEXT CHARACTER SET UTF8
)
AS
BEGIN
FOR
SELECT
I.FTS$RELATION_NAME
FROM FTS$INDICES I
WHERE I.FTS$INDEX_NAME = :FTS$INDEX_NAME
GROUP BY 1
AS CURSOR C
DO
BEGIN
FOR
SELECT
FTS$TRIGGER_NAME,
FTS$TRIGGER_RELATION,
FTS$TRIGGER_EVENTS,
FTS$TRIGGER_POSITION,
FTS$TRIGGER_SOURCE,
FTS$TRIGGER_SCRIPT
FROM FTS$TRIGGER_HELPER.FTS$MAKE_TRIGGERS(:C.FTS$RELATION_NAME, :FTS$MULTI_ACTION, :FTS$POSITION)
INTO
FTS$TRIGGER_NAME,
FTS$TRIGGER_RELATION,
FTS$TRIGGER_EVENTS,
FTS$TRIGGER_POSITION,
FTS$TRIGGER_SOURCE,
FTS$TRIGGER_SCRIPT
DO
SUSPEND;
END
END
PROCEDURE FTS$MAKE_ALL_TRIGGERS (
FTS$MULTI_ACTION BOOLEAN NOT NULL,
FTS$POSITION SMALLINT NOT NULL
)
RETURNS (
FTS$TRIGGER_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_RELATION VARCHAR(63) CHARACTER SET UTF8,
FTS$TRIGGER_EVENTS VARCHAR(26) CHARACTER SET UTF8,
FTS$TRIGGER_POSITION SMALLINT,
FTS$TRIGGER_SOURCE BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$TRIGGER_SCRIPT BLOB SUB_TYPE TEXT CHARACTER SET UTF8
)
AS
BEGIN
FOR
SELECT
I.FTS$RELATION_NAME
FROM FTS$INDICES I
JOIN RDB$RELATIONS R ON R.RDB$RELATION_NAME = I.FTS$RELATION_NAME
WHERE R.RDB$RELATION_TYPE = 0
GROUP BY I.FTS$RELATION_NAME
AS CURSOR C
DO
BEGIN
FOR
SELECT
FTS$TRIGGER_NAME,
FTS$TRIGGER_RELATION,
FTS$TRIGGER_EVENTS,
FTS$TRIGGER_POSITION,
FTS$TRIGGER_SOURCE,
FTS$TRIGGER_SCRIPT
FROM FTS$TRIGGER_HELPER.FTS$MAKE_TRIGGERS(:C.FTS$RELATION_NAME, :FTS$MULTI_ACTION, :FTS$POSITION)
INTO
FTS$TRIGGER_NAME,
FTS$TRIGGER_RELATION,
FTS$TRIGGER_EVENTS,
FTS$TRIGGER_POSITION,
FTS$TRIGGER_SOURCE,
FTS$TRIGGER_SCRIPT
DO
SUSPEND;
END
END
END^
SET TERM ; ^
COMMENT ON PACKAGE FTS$TRIGGER_HELPER IS
'Utilities for creating triggers that support full-text search indexes.';
GRANT SELECT ON FTS$INDICES TO PACKAGE FTS$TRIGGER_HELPER;
SET TERM ^ ;
CREATE OR ALTER PACKAGE FTS$HIGHLIGHTER
AS
BEGIN
/**
* The FTS$BEST_FRAGMENT function returns a text fragment with highlighted
* occurrences of words from the search query.
*
* Input parameters:
* FTS$TEXT - the text in which the phrase is searched;
* FTS$QUERY - full-text search expression;
* FTS$ANALYZER - analyzer;
* FTS$FIELD_NAME - the name of the field that is being searched;
* FTS$FRAGMENT_SIZE - the length of the returned fragment.
* No less than is required to return whole words;
* FTS$LEFT_TAG - the left tag to highlight;
* FTS$RIGHT_TAG - the right tag to highlight.
**/
FUNCTION FTS$BEST_FRAGMENT (
FTS$TEXT BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$QUERY VARCHAR(8191) CHARACTER SET UTF8,
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL DEFAULT 'STANDARD',
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 DEFAULT NULL,
FTS$FRAGMENT_SIZE SMALLINT NOT NULL DEFAULT 512,
FTS$LEFT_TAG VARCHAR(50) CHARACTER SET UTF8 NOT NULL DEFAULT '<b>',
FTS$RIGHT_TAG VARCHAR(50) CHARACTER SET UTF8 NOT NULL DEFAULT '</b>')
RETURNS VARCHAR(8191) CHARACTER SET UTF8;
/**
* The FTS$BEST_FRAGMENTS procedure returns text fragments with highlighted
* occurrences of words from the search query.
*
* Input parameters:
* FTS$TEXT - the text in which the phrase is searched;
* FTS$QUERY - full-text search expression;
* FTS$ANALYZER - analyzer;
* FTS$FIELD_NAME - the name of the field that is being searched;
* FTS$FRAGMENT_SIZE - the length of the returned fragment.
* No less than is required to return whole words;
* FTS$MAX_NUM_FRAGMENTS - maximum number of fragments;
* FTS$LEFT_TAG - the left tag to highlight;
* FTS$RIGHT_TAG - the right tag to highlight.
*
* Output parameters:
* FTS$FRAGMENT - text fragment in which the searched phrase was found.
**/
PROCEDURE FTS$BEST_FRAGMENTS (
FTS$TEXT BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$QUERY VARCHAR(8191) CHARACTER SET UTF8,
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL DEFAULT 'STANDARD',
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8 DEFAULT NULL,
FTS$FRAGMENT_SIZE SMALLINT NOT NULL DEFAULT 512,
FTS$MAX_NUM_FRAGMENTS INTEGER NOT NULL DEFAULT 10,
FTS$LEFT_TAG VARCHAR(50) CHARACTER SET UTF8 NOT NULL DEFAULT '<b>',
FTS$RIGHT_TAG VARCHAR(50) CHARACTER SET UTF8 NOT NULL DEFAULT '</b>')
RETURNS (
FTS$FRAGMENT VARCHAR(8191) CHARACTER SET UTF8);
END^
RECREATE PACKAGE BODY FTS$HIGHLIGHTER
AS
BEGIN
FUNCTION FTS$BEST_FRAGMENT (
FTS$TEXT BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$QUERY VARCHAR(8191) CHARACTER SET UTF8,
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$FRAGMENT_SIZE SMALLINT NOT NULL,
FTS$LEFT_TAG VARCHAR(50) CHARACTER SET UTF8 NOT NULL,
FTS$RIGHT_TAG VARCHAR(50) CHARACTER SET UTF8 NOT NULL)
RETURNS VARCHAR(8191) CHARACTER SET UTF8
EXTERNAL NAME 'luceneudr!bestFragementHighligh' ENGINE UDR;
PROCEDURE FTS$BEST_FRAGMENTS (
FTS$TEXT BLOB SUB_TYPE TEXT CHARACTER SET UTF8,
FTS$QUERY VARCHAR(8191) CHARACTER SET UTF8,
FTS$ANALYZER VARCHAR(63) CHARACTER SET UTF8 NOT NULL,
FTS$FIELD_NAME VARCHAR(63) CHARACTER SET UTF8,
FTS$FRAGMENT_SIZE SMALLINT NOT NULL,
FTS$MAX_NUM_FRAGMENTS INTEGER NOT NULL,
FTS$LEFT_TAG VARCHAR(50) CHARACTER SET UTF8 NOT NULL,