MINI MINI MANI MO
Rem
Rem $Header: ctx_src_2/src/dr/admin/d1202020.sql /main/17 2017/10/26 11:13:59 nspancha Exp $
Rem
Rem d1202020.sql
Rem
Rem Copyright (c) 2016, 2017, Oracle and/or its affiliates.
Rem All rights reserved.
Rem
Rem NAME
Rem d1202020.sql
Rem
Rem DESCRIPTION
Rem
Rem
Rem NOTES
Rem
Rem
Rem BEGIN SQL_FILE_METADATA
Rem SQL_SOURCE_FILE: ctx_src_2/src/dr/admin/d1202020.sql
Rem SQL_SHIPPED_FILE:
Rem SQL_PHASE: DOWNGRADE
Rem SQL_STARTUP_MODE: NORMAL
Rem SQL_IGNORABLE_ERRORS: NONE
Rem SQL_CALLING_FILE:
Rem END SQL_FILE_METADATA
Rem
Rem MODIFIED (MM/DD/YY)
Rem nspancha 09/01/17 - Bug 26225601: Downgrade script failure
Rem aczarlin 08/16/17 - bug 26633319 change default stage_itab_max_rows
Rem demukhin 06/20/17 - bug 26051570: keep $R for legacy indexes
Rem rodfuent 05/09/17 - Bug 25217590: dml-bypass for TextIndexMethods
Rem nspancha 03/26/17 - Bug 25661502: Duplicate tokens due to truncation
Rem snetrava 03/14/17 - Add FILE_ACCESS_ROLE
Rem boxia 03/13/17 - Bug 25468759: rm idx_auto_opt_para_degree,
Rem ixp_auto_opt_para_degree
Rem nspancha 02/27/17 - Bug 25353917:Convert token tables back to 64bytes
Rem demukhin 02/20/17 - prj 68638: remove $R
Rem rodfuent 02/06/17 - Bug 25422217: $DI storage clause
Rem boxia 01/17/17 - Proj 68638: rm dbms_scheduler privileges
Rem boxia 01/12/17 - Bug 25390928: alter dr$index_partition,
Rem ctx_index_partitions, ctx_user_index_partitions
Rem snetrava 01/05/17 - Storage clauses for Wildcard index
Rem rodfuent 12/15/16 - Bug 25028151: revoke dba_tab_subpartitions
Rem boxia 12/09/16 - correct last line of running sqlsessend.sql
Rem boxia 11/19/16 - Bug 25172618: rm stage_itab_auto_opt
Rem alter dr$index, ctx_indexes, ctx_user_indexes
Rem snetrava 11/02/16 - Bug 25035481 WILDCARD_INDEX, WILDCARD_INDEX_K
Rem shuroy 10/13/16 - Created
Rem
SET ECHO ON
SET FEEDBACK 1
SET NUMWIDTH 10
SET LINESIZE 80
SET TRIMSPOOL ON
SET TAB OFF
SET PAGESIZE 100
@@?/rdbms/admin/sqlsessstart.sql
--IMP NOTE: The following temp functions are copies of functions from
--non-upg/dwgrd code. Please check if changes or fixes to the following
--temp functions require corresponding fixes in their original functions.
--------------TEMP FUNCTIONS FOR DOWNGRADE-------------------
create or replace package temp_utl_pkg authid definer as
-- exceptions used by all components
textile_error EXCEPTION;
POL_INDEX_ONLY constant number := 0;
POL_POLICY_ONLY constant number := 1;
POL_INDEX_OR_POLICY constant number := 2;
SEC_NONE constant number := 0;
SEC_CONTAINS constant number := 1;
SEC_OWNER constant number := 2;
SEC_ALTER constant number := 3;
SEC_DROP constant number := 4;
subtype dr_id is dbms_id_128; /* use: id */
subtype dr_id2 is varchar2(257); /* use: id.id */
subtype dr_id3 is varchar2(386); /* use: id.id.id */
subtype dr_qid is dbms_quoted_id_128; /* use: quoted id */
subtype dr_qid2 is varchar2(261); /* use: qid.qid */
subtype dr_qid3 is varchar2(392); /* use: qid.qid.qid */
subtype dr_lid is dbms_id_128; /* use: long id lid */
subtype dr_lid2 is varchar2(257); /* use: lid.lid */
subtype dr_lid3 is varchar2(386); /* use: lid.lid.lid */
subtype dr_qlid is dbms_quoted_id_128; /* use: quoted long id qlid */
subtype dr_qlid2 is varchar2(261); /* use: qlid.qlid */
subtype dr_qlid3 is varchar2(392); /* use: qlid.qlid.qlid */
subtype dr_longpart is varchar2(403); /* use: qlid.qlid partition(qlid) */
subtype dr_shortbuf is varchar2(32); /* use: small scratch buff */
subtype dr_medbuf is varchar2(128); /* use: medium scratch buff */
subtype dr_longbuf is varchar2(512); /* use: long scratch buff */
subtype dr_extrabuf is varchar2(4000); /* use: 4000 bytes */
subtype dr_maxbuf is varchar2(32767); /* use: max len allowed */
type idx_rec is record (
IDX_ID NUMBER(38)
, IDX_TYPE NUMBER
, IDX_OWNER VARCHAR2(128)
, IDX_OWNER# NUMBER
, IDX_NAME VARCHAR2(128)
, IDX_TABLE_OWNER VARCHAR2(128)
, IDX_TABLE VARCHAR2(128)
, IDX_TABLE# NUMBER
, IDX_KEY_NAME VARCHAR2(256)
, IDX_KEY_TYPE NUMBER
, IDX_TEXT_NAME VARCHAR2(256)
, IDX_TEXT_TYPE NUMBER
, IDX_TEXT_LENGTH NUMBER
, IDX_DOCID_COUNT NUMBER
, IDX_STATUS VARCHAR2(12)
, IDX_VERSION NUMBER
, IDX_NEXTID NUMBER
, IDX_LANGUAGE_COLUMN VARCHAR2(256)
, IDX_FORMAT_COLUMN VARCHAR2(256)
, IDX_CHARSET_COLUMN VARCHAR2(256)
, IDX_CONFIG_COLUMN VARCHAR2(256)
, IDX_OPTION VARCHAR2(64)
, IDX_OPT_TOKEN VARCHAR2(255)
, IDX_OPT_TYPE NUMBER
, IDX_OPT_COUNT NUMBER
, IDX_SYNC_TYPE VARCHAR2(20)
, IDX_SYNC_MEMORY VARCHAR2(100)
, IDX_SYNC_PARA_DEGREE NUMBER
, IDX_SYNC_INTERVAL VARCHAR2(4000)
);
DEFAULT_SEPARATOR constant varchar2(1) := '$';
-- These object types are used by max_name_length to determine the maximum
-- length of an object. This list must match the same list that appears in
-- dret.h.
OBJTYPE_INDEX constant number := 1; -- Index name
OBJTYPE_POLICY constant number := 2; -- Policy name
OBJTYPE_CONSTRAINT constant number := 3; -- Constraint (within internal objs)
OBJTYPE_THESAURUS constant number := 4; -- Thesaurus name
OBJTYPE_SECTION constant number := 5; -- Section name
OBJTYPE_PARAM constant number := 6; -- Parameter
OBJTYPE_FEEDBACK constant number := 7; -- Feedback column
OBJTYPE_SQE constant number := 8; -- SQE name
OBJTYPE_LEXER constant number := 9; -- Lexer name
OBJTYPE_TBS constant number := 10; -- TBS name
OBJTYPE_ATTR constant number := 11; -- Attribute
OBJTYPE_IDXSET constant number := 12; -- Index set name
OBJTYPE_FILENAME constant number := 13; -- File name
OBJTYPE_COLUMN constant number := 14; -- Column name
OBJTYPE_LANGUAGE constant number := 15; -- Language name
OBJTYPE_CHARSET constant number := 16; -- Charset name
OBJTYPE_PREFERENCE constant number := 17; -- Preference name
OBJTYPE_STOPLIST constant number := 18; -- Stoplist name
OBJTYPE_DICTIONARY constant number := 19; -- Dictionary name
DR_ID_LEN_30 constant number := 30;
DR_ID_LEN constant number := 128;
/* Length of an object name after the final $ */
DR_INDEX_OBJECT_NAME_LEN constant number := 5;
/* This is the maximum length of a language name. */
MAX_LANGUAGE_LEN constant number := 30;
end temp_utl_pkg;
/
CREATE OR REPLACE FUNCTION dr$temp_enquote_parts(p_spec IN VARCHAR2,
capitalize IN BOOLEAN := TRUE)
RETURN VARCHAR2 IS
l_spec temp_utl_pkg.dr_qlid3;
l_period1 number;
l_period2 number;
BEGIN
IF INSTR(p_spec, '"') = 1 THEN
-- Already start with a quote, so we're good
l_spec := p_spec;
ELSIF INSTR(p_spec, '.') = 0 THEN
-- No period found, so just enquote the entire string
l_spec := dbms_assert.enquote_name(p_spec, capitalize);
ELSE
-- Find the location(s) of the period(s)
l_period1 := INSTR(p_spec, '.');
l_period2 := INSTR(p_spec, '.', l_period1 + 1);
-- Enquote between the periods
l_spec :=
dbms_assert.enquote_name(SUBSTR(p_spec, 1, l_period1 - 1), capitalize)
|| '.';
IF l_period2 = 0 THEN
l_spec := l_spec ||
dbms_assert.enquote_name(SUBSTR(p_spec, l_period1 + 1), capitalize);
ELSE
l_spec := l_spec ||
dbms_assert.enquote_name(SUBSTR(p_spec, l_period1 + 1,
(l_period2 - l_period1 - 1)),
capitalize) || '.' ||
dbms_assert.enquote_name(SUBSTR(p_spec, l_period2 + 1), capitalize);
END IF;
END IF;
RETURN l_spec;
END dr$temp_enquote_parts;
/
CREATE OR REPLACE PROCEDURE dr$temp_parse_object_name(
spec in varchar2,
uname in out varchar2,
oname in out varchar2
)
is
l_uname temp_utl_pkg.dr_qid;
l_oname temp_utl_pkg.dr_qid;
l_dblink temp_utl_pkg.dr_lid;
dummy temp_utl_pkg.dr_shortbuf;
pos binary_integer;
begin
if spec is null then
uname := NULL;
oname := NULL;
-- dblink := NULL;
return;
end if;
begin
-- Parse spec which is assumed to be in quoted form. Double quotes
-- are stripped, or name is converted to upper case if there are no
-- quotes.
dbms_utility.name_tokenize(spec, l_uname, l_oname, dummy, l_dblink, pos);
if pos <> lengthb(spec) then
raise temp_utl_pkg.textile_error;
end if;
exception
when others then
--drue.text_on_stack(sqlerrm);
--drue.push(DRIG.DL_ILL_POL_NAME);
raise;
end;
if dummy is not null then
--drue.push(DRIG.DL_ILL_POL_NAME);
raise temp_utl_pkg.textile_error;
end if;
if l_dblink is not null and instr(l_dblink,'.') = 0 then
select l_dblink||'.'||value into l_dblink from v$parameter
where name = 'db_domain';
if lengthb(l_dblink) > 128 THEN
-- TODO: better error message
--drue.push(DRIG.DL_OBJ_NAME_TOO_LONG);
raise temp_utl_pkg.textile_error;
end if;
end if;
if l_oname is null then
l_oname := l_uname;
l_uname := 'CTXSYS';--drvutl.GetCurrentSchema;
if l_dblink is not null then
-- get remote user name
for r in (select username from dba_db_links
where db_link = upper(l_dblink) and
owner in (l_uname, 'PUBLIC')
order by decode(owner,'PUBLIC',1,0))
loop
l_uname := nvl(r.username,l_uname);
exit;
end loop;
end if;
end if;
uname := l_uname;
oname := l_oname;
-- dblink := l_dblink;
exception
--when dr_def.textile_error then
--driutl.druebrk; -- Break on the error
--raise;
when others then
--drue.text_on_stack(sqlerrm, 'driutl.parse_object_name');
raise;
end dr$temp_parse_object_name;
/
/*---------------------------- ChkIndexOption -----------------------------*/
CREATE OR REPLACE function dr$temp_ChkIndexOption (
p_idxid in number,
p_opt in varchar2
) return number
is
l_opt varchar2(40);
begin
select idx_option into l_opt from ctxsys.dr$index where idx_id = p_idxid;
if (l_opt like '%'||p_opt||'%') then
return 1;
else
return 0;
end if;
/*Bug 10405766 Add exception if table does not have value with given index */
exception
when NO_DATA_FOUND then
return 0;
when others then
raise;
end dr$temp_ChkIndexOption;
/
/*----------------------- IndexHasFullLengthObjects ------------------------*/
CREATE OR REPLACE FUNCTION dr$temp_IndexHasFullLengthObj(
p_idx_id in number)
RETURN boolean is
ret boolean := false;
begin
for c1 in (select null from ctxsys.dr$index
where idx_option like '%f%'
and idx_id = p_idx_id)
loop
ret := TRUE;
end loop;
return ret;
exception
when others then
raise;
end dr$temp_IndexHasFullLengthObj;
/
/*--------------------------- GetIndexRec -------------------------------*/
CREATE OR REPLACE FUNCTION dr$temp_GetIndexRec(
p_idx_name in varchar2,
f_ispolicy in number default temp_utl_pkg.POL_INDEX_ONLY,
f_security in number default temp_utl_pkg.SEC_CONTAINS
) return temp_utl_pkg.idx_rec
is
l_name temp_utl_pkg.dr_qid2;
l_table temp_utl_pkg.dr_id;
l_owner temp_utl_pkg.dr_qid2;
l_idx temp_utl_pkg.idx_rec;
lv_datasrc temp_utl_pkg.dr_longbuf;
lv_index_name temp_utl_pkg.dr_qid2;
lv_user temp_utl_pkg.dr_qid2;
l_owner# number;
begin
-- 20952246: We can be called with any of the following formats:
-- indexname "indexname" user.indexname "user"."indexname"
-- We need to end up with a quoted value to pass to parse_object_name.
lv_index_name := dr$temp_enquote_parts(p_idx_name);
lv_user := 'CTXSYS';
-- required to resolve synonyms on policies
dr$temp_parse_object_name(lv_index_name, l_owner, l_name);
select user_id into l_owner# from SYS.all_users where username = ''||l_owner;
select /*+ ORDERED USE_NL(o) */ idx_id, idx_type,
l_owner#, l_owner, idx_name,
u.name, o.name, idx_table#,
idx_key_name, idx_key_type,
idx_text_name, idx_text_type, idx_text_length,
idx_docid_count, idx_status,
idx_version, idx_nextid,
idx_language_column, idx_format_column,
idx_charset_column, idx_config_column, idx_option,
idx_opt_token, idx_opt_type, idx_opt_count,
idx_sync_type, idx_sync_memory, idx_sync_para_degree,
idx_sync_interval
into l_idx.idx_id, l_idx.idx_type,
l_idx.idx_owner#, l_idx.idx_owner, l_idx.idx_name,
l_idx.idx_table_owner, l_idx.idx_table, l_idx.idx_table#,
l_idx.idx_key_name, l_idx.idx_key_type,
l_idx.idx_text_name, l_idx.idx_text_type, l_idx.idx_text_length,
l_idx.idx_docid_count, l_idx.idx_status,
l_idx.idx_version, l_idx.idx_nextid,
l_idx.idx_language_column, l_idx.idx_format_column,
l_idx.idx_charset_column, l_idx.idx_config_column,
l_idx.idx_option,
l_idx.idx_opt_token, l_idx.idx_opt_type, l_idx.idx_opt_count,
l_idx.idx_sync_type, l_idx.idx_sync_memory,
l_idx.idx_sync_para_degree, l_idx.idx_sync_interval
from ctxsys.dr$index, sys."_BASE_USER" u, sys.obj$ o
where idx_name = l_name
and idx_owner# = l_owner#
and idx_table_owner# = u.user#
and idx_table# = o.obj#;
-- 6654757: Check for null idx_option
if (f_ispolicy = temp_utl_pkg.POL_POLICY_ONLY and
(l_idx.idx_option is null or l_idx.idx_option not like '%O%')) then
--drue.push(DRIG.D2_ISIDX_NOT_POL);
raise temp_utl_pkg.textile_error;
end if;
if (f_ispolicy = temp_utl_pkg.POL_INDEX_ONLY and l_idx.idx_option like '%O%') then
--drue.push(DRIG.D2_ISPOL_NOT_IDX);
raise temp_utl_pkg.textile_error;
end if;
return l_idx;
exception
when no_data_found then
--if (f_ispolicy = POL_POLICY_ONLY) then
--drue.push(DRIG.D2_POLICY_NOTXIST,
-- driutl.NormalizeObjectName(p_idx_name));
--else
--drue.push(DRIG.DL_POLICY_NOTXIST,
-- driutl.NormalizeObjectName(p_idx_name));
--end if;
raise;
when others then
--drue.text_on_stack(sqlerrm, 'drixmd.GetIndexRec');
raise;
end dr$temp_GetIndexRec;
/
/*------------------------------- MaxNameLength -----------------------------*/
/*
NAME
max_name_length - Compute and return the maximum length of an object's name
DESCRIPTION
Returns the maximum length of the object, based on the object type,
database compatible settings, and whether full length index names are
enabled.
NOTES
Full length index names are disabled by setting level 4 for event 30580.
ARGUMENTS
p_obj_type - One of the OBJTYPE constants defined in the package header
p_partition - If TRUE, return the maximum length assuming the object is
partitioned
p_full_length_objs - If TRUE, consider full length objects enabled
p_pfx_check - If TRUE, we are called from make_pfx. In this case return
the point at which the name needs to be truncated.
p_30_char_names - If TRUE, consider the maximum length of a database object
to be 30, even if compatible >= 12.2
EXCEPTIONS
dr_def.textile_error if p_obj_type is not one of the OBJTYPE constants
RETURNS
Maximum length for the given object
*/
CREATE OR REPLACE FUNCTION dr$temp_max_name_length(
p_obj_type IN NUMBER,
p_partition IN BOOLEAN,
p_full_length_objs IN BOOLEAN,
p_30_char_names IN BOOLEAN,
p_pfx_check IN BOOLEAN := FALSE)
RETURN NUMBER IS
dr_id_len NUMBER;
partid_len NUMBER;
object_name_len NUMBER;
compatible_param varchar2(20);
BEGIN
select value into compatible_param from v$parameter
where name like 'compatible';
-- 22097228: Maximum length is 30 if compatible < 12.2 or p_30_char_names
-- is true
IF compatible_param >= '12.2' AND NOT p_30_char_names THEN
dr_id_len := temp_utl_pkg.DR_ID_LEN;
ELSE
dr_id_len := temp_utl_pkg.DR_ID_LEN_30;
END IF;
-- Partition string is 4 characters if full length index names are disabled
-- (just the partid itself), 5 characters if full length index names are
-- enabled (# and the partid).
IF p_partition THEN
IF p_full_length_objs THEN
partid_len := 5;
ELSE
partid_len := 4;
END IF;
ELSE
partid_len := 0;
END IF;
-- Determine length of the object name (I, R, ERROR, etc.) that is found
-- after the final $. This is dependent on full length index names.
IF p_full_length_objs THEN
object_name_len := temp_utl_pkg.DR_INDEX_OBJECT_NAME_LEN;
ELSE
object_name_len := 1; -- Only single character objects
END IF;
-- Switch based on object type. For now, only database objects such as
-- table and index names support long identifiers. Other Text objects such
-- as preferences are limited to the original 30 characters.
CASE p_obj_type
WHEN temp_utl_pkg.OBJTYPE_INDEX THEN
IF NOT p_pfx_check AND p_full_length_objs THEN
RETURN dr_id_len;
ELSE
RETURN dr_id_len
- 3 -- Initial DR$ or DR#
- 1 -- Final $
- object_name_len -- Object name (I, R, ERROR, etc.)
- partid_len; -- Partition string
END IF;
WHEN temp_utl_pkg.OBJTYPE_POLICY THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_CONSTRAINT THEN
IF NOT p_pfx_check AND p_full_length_objs THEN
RETURN dr_id_len;
ELSE
RETURN dr_id_len
- 4 -- Initial DRC$
- 1 -- Final $
- object_name_len -- Object name (I, R, ERROR, etc.)
- partid_len; -- Partition string
END IF;
WHEN temp_utl_pkg.OBJTYPE_THESAURUS THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_SECTION THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_PARAM THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_FEEDBACK THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_SQE THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_LEXER THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_TBS THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_ATTR THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_IDXSET THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_FILENAME THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_COLUMN THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_LANGUAGE THEN
RETURN temp_utl_pkg.MAX_LANGUAGE_LEN;
WHEN temp_utl_pkg.OBJTYPE_CHARSET THEN
RETURN dr_id_len;
WHEN temp_utl_pkg.OBJTYPE_PREFERENCE THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_STOPLIST THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
WHEN temp_utl_pkg.OBJTYPE_DICTIONARY THEN
-- Limited to original 30 characters, regardless of partitions
RETURN temp_utl_pkg.DR_ID_LEN_30;
ELSE
--drue.push_internal('max_name_length', p_obj_type);
RAISE temp_utl_pkg.textile_error;
END CASE;
END dr$temp_max_name_length;
/
CREATE OR REPLACE FUNCTION dr$temp_make_pfx(idx_owner in varchar2,
idx_name in varchar2,
pfx_type in varchar2 default '$',
part_id in number default null,
constraint_pfx in boolean default FALSE,
idx_id in number default null,
full_length_objs in boolean default null,
thirty_char_names in boolean default null)
return varchar2
is
partidstr varchar2(5);
init_sep char(1);
lpid number := part_id;
l_idx_owner temp_utl_pkg.dr_qlid;
l_idx_name temp_utl_pkg.dr_qlid;
l_pfx_type varchar(1);
l_pfx_str varchar(4);
lvl number;
l_max_name_len number;
l_idx_id number;
l_idx temp_utl_pkg.idx_rec;
q_idx_name temp_utl_pkg.dr_qlid;
l_full_length_objs boolean;
l_30_char_names boolean;
begin
-- 6786088: Validate idx_owner and idx_name
if (idx_owner is null) then
l_idx_owner := null;
else
l_idx_owner := dbms_assert.enquote_name(idx_owner, FALSE);
end if;
if (constraint_pfx = TRUE) then
l_pfx_str := 'DRC';
else
l_pfx_str := 'DR';
end if;
-- 20671782: Validate q_idx_name not idx_name
l_idx_name := ltrim(rtrim(idx_name, '"'), '"');
q_idx_name :=
dbms_assert.simple_sql_name(dbms_assert.enquote_name(idx_name, FALSE));
-- 7425113: Validate pfx_type
if (length(pfx_type) != 1) then
--drue.push(DRIG.AG_BAD_VALUE, 'pfx_type');
raise temp_utl_pkg.textile_error;
else
l_pfx_type := dbms_assert.noop(pfx_type);
end if;
-- Determine index ID so we can truncate if needed. If the index ID is
-- passed in (i.e. we are renaming) use that. Add quotes if not present.
if idx_id is not null then
l_idx_id := idx_id;
elsif l_idx_owner is null then
l_idx := dr$temp_GetIndexRec(q_idx_name,
f_security => temp_utl_pkg.SEC_NONE);
l_idx_id := l_idx.idx_id;
else
l_idx :=
dr$temp_GetIndexRec(l_idx_owner || '.' || q_idx_name,
f_security => temp_utl_pkg.SEC_NONE);
l_idx_id := l_idx.idx_id;
end if;
-- Determine l_full_length_objs. If it is passed in, use that. Otherwise
-- we will use the settings for the index in question.
if full_length_objs is not null then
l_full_length_objs := full_length_objs;
else
l_full_length_objs := dr$temp_IndexHasFullLengthObj(l_idx_id);
end if;
-- 22097228: Determine 30_char_names. If it is passed in, use that.
-- Otherwise we will use the setting for the index in question.
if thirty_char_names is not null then
l_30_char_names := thirty_char_names;
else
l_30_char_names := (dr$temp_ChkIndexOption(l_idx_id, 't') = 1);
end if;
if (constraint_pfx and not l_full_length_objs) then
l_pfx_str := 'DRC';
else
l_pfx_str := 'DR';
end if;
-- Determine partidstr and init_sep
if (part_id is null or part_id = 0) then
partidstr := '';
init_sep := '$';
else
if (lpid >= 10000) then
lpid := lpid - 10000;
partidstr := '';
--Removed OLS Bug Fix 13783516, unrequired for upgrade. Breaks sync etc.
else
partidstr := ltrim(to_char(part_id,'0000'));
end if;
if l_full_length_objs then
partidstr := '#' || partidstr;
init_sep := '$';
else
init_sep := '#';
end if;
end if;
if constraint_pfx and not l_full_length_objs then
-- 20952246: Truncate constraint name if needed
l_max_name_len :=
dr$temp_max_name_length(temp_utl_pkg.OBJTYPE_CONSTRAINT,
p_partition => (part_id is not null and part_id != 0),
p_full_length_objs => l_full_length_objs,
p_30_char_names => l_30_char_names,
p_pfx_check => TRUE);
l_idx_name := rtrim(substrb(l_idx_name, 1, l_max_name_len));
elsif l_full_length_objs then
-- Adjust l_idx_name so that it will fit
-- 20952246: use max_name_length
l_max_name_len :=
dr$temp_max_name_length(temp_utl_pkg.OBJTYPE_INDEX,
p_partition => (part_id is not null and part_id != 0),
p_full_length_objs =>l_full_length_objs,
p_30_char_names => l_30_char_names,
p_pfx_check => TRUE);
if lengthb(l_idx_name) > l_max_name_len then
l_idx_name := rtrim(substrb(l_idx_name, 1,
l_max_name_len - lengthb(l_idx_id))) ||
l_idx_id;
end if;
end if;
if ((l_idx_owner is null) OR (constraint_pfx = TRUE)) then
return '"' || l_pfx_str || init_sep || l_idx_name ||
partidstr || l_pfx_type;
else
return l_idx_owner || '.' ||
'"' || l_pfx_str || init_sep || l_idx_name ||
partidstr || l_pfx_type;
end if;
end dr$temp_make_pfx;
/
/*------------------------ get_object_prefix -----------------------------*/
CREATE OR REPLACE FUNCTION dr$temp_get_object_prefix(
idx_owner in varchar2,
idx_name in varchar2,
part_id in number default null,
sep in varchar2 default temp_utl_pkg.DEFAULT_SEPARATOR,
full_length_objs in boolean default null
) RETURN VARCHAR2 IS
pfx temp_utl_pkg.dr_qlid2;
begin
-- 20952246: Pass full_length_objs
pfx := dr$temp_make_pfx(idx_owner, idx_name, sep, part_id, false, null,
full_length_objs);
return pfx;
end dr$temp_get_object_prefix;
/
/*-------------------------- get_object_name ------------------------------*/
CREATE OR REPLACE FUNCTION dr$temp_get_object_name(
idx_owner in varchar2,
idx_name in varchar2,
idxid in number,
part_id in number default null,
which in varchar2,
sep in varchar2 default temp_utl_pkg.DEFAULT_SEPARATOR,
full_length_objs in boolean default null
) RETURN VARCHAR2 IS
pfx temp_utl_pkg.dr_qlid2;
begin
pfx := dr$temp_get_object_prefix(idx_owner, idx_name, part_id, sep);
--RC is for local index on $R table, NI is for local index on $N table
--KI is for index on $K table, UI is for index on $U table
--with system partition, we can not have global primary/unique index on
--partitioned $R and $N tables
if (which in ('A', 'D', 'DG', 'E', 'F', 'G', 'H', 'I', 'K', 'KI', 'L', 'M',
'N', 'NI', 'O', 'P', 'PP', 'R', 'RC', 'S', 'SBD', 'SBDI',
'SBF', 'SBFI', 'SD', 'SDI', 'SIDS', 'SIDSI', 'SIYM',
'SN', 'SNI', 'ST', 'STI', 'STZ', 'STZI', 'SIYMI', 'SV',
'SVI', 'SR', 'SRI', 'T', 'U', 'UI','V', 'W',
'X', 'Y', 'Z', 'KG', 'KGI')) then
-- 20952246: Pass full_length_objs
pfx := dr$temp_get_object_prefix(idx_owner, idx_name,
part_id, sep, full_length_objs);
if (which = 'PP') then
pfx := pfx || 'P' || '"'; -- special case
else
pfx := pfx || which || '"';
end if;
elsif (which in ('KD', 'KR')) then
-- new objects with full length names
pfx := dr$temp_make_pfx(idx_owner, idx_name, sep, part_id,
FALSE, idxid, TRUE);
pfx := pfx || which || '"';
else
raise temp_utl_pkg.textile_error;
end if;
return pfx;
end dr$temp_get_object_name;
/
REM
REM BEGIN creating a 12.1 version dummy impl. type and operator
REM
create or replace type DummyindexMethods authid definer as object
(
key RAW(4),
objid RAW(4),
tmpobjid RAW(4),
static function ODCIGetInterfaces(ifclist OUT sys.ODCIObjectList)
return number
);
/
PROMPT Create dummy implementation type body
PROMPT
create or replace type body DummyIndexMethods is
static function ODCIGetInterfaces(
ifclist out sys.ODCIObjectList
) return number
is
begin
ifclist := sys.ODCIObjectList(sys.ODCIObject('SYS','ODCIINDEX2'));
return sys.ODCIConst.Success;
end ODCIGetInterfaces;
end;
/
show errors
create or replace package ctx_dummyop authid definer as
function dummyop(Colval in varchar2,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT DummyIndexMethods,
cflg number /*, env sys.ODCIEnv*/)
return number is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
end ctx_dummyop;
/
PROMPT Create dummy operator
PROMPT
create or replace operator dummyop binding
(varchar2, varchar2) return number
with index context, scan context DummyIndexMethods
without column data using ctx_dummyop.dummyop;
grant execute on dummyop to public;
REM
REM END creating a dummy impl. type and operator
REM
PROMPT DisAssociate Statistics
PROMPT
DISASSOCIATE STATISTICS FROM INDEXTYPES CONTEXT FORCE;
DISASSOCIATE STATISTICS FROM INDEXTYPES CONTEXT_V2 FORCE;
DISASSOCIATE STATISTICS FROM PACKAGES CTX_CONTAINS FORCE;
REM
REM BEGIN DOWN-GRADING CONTEXT INDEXTYPE
REM
PROMPT Remove existing indextype operator bindings ...
PROMPT
alter indextype context add dummyop(varchar2, varchar2);
alter indextype context drop contains(varchar2, varchar2);
alter indextype context drop contains(varchar2, clob);
alter indextype context drop contains(clob, varchar2);
alter indextype context drop contains(clob, clob);
alter indextype context drop contains(blob, varchar2);
alter indextype context drop contains(blob, clob);
alter indextype context drop contains(bfile, varchar2);
alter indextype context drop contains(bfile, clob);
alter indextype context drop contains(sys.xmltype, varchar2);
alter indextype context drop contains(sys.xmltype, clob);
alter indextype context drop contains(sys.uritype, varchar2);
alter indextype context drop contains(sys.uritype, clob);
alter indextype context_v2 add dummyop(varchar2, varchar2);
alter indextype context_v2 drop contains(varchar2, varchar2);
alter indextype context_v2 drop contains(varchar2, clob);
alter indextype context_v2 drop contains(clob, varchar2);
alter indextype context_v2 drop contains(clob, clob);
alter indextype context_v2 drop contains(blob, varchar2);
alter indextype context_v2 drop contains(blob, clob);
alter indextype context_v2 drop contains(bfile, varchar2);
alter indextype context_v2 drop contains(bfile, clob);
alter indextype context_v2 drop contains(sys.xmltype, varchar2);
alter indextype context_v2 drop contains(sys.xmltype, clob);
alter indextype context_v2 drop contains(sys.uritype, varchar2);
alter indextype context_v2 drop contains(sys.uritype, clob);
PROMPT Drop SCORE and CONTAINS operators
PROMPT
drop operator score FORCE;
drop operator contains FORCE;
drop package ctx_contains;
drop package driscore;
PROMPT Shift indextype implementation to dummy implementation type
PROMPT
alter indextype context using DummyIndexMethods;
alter indextype context_v2 using DummyIndexMethods;
PROMPT Create new version of TextIndexMethods and TextOptStats
PROMPT
drop type TextIndexMethods;
drop type TextOptStats;
PROMPT Create 12.2 version of TextIndexMethods and TextOptStats
PROMPT
REM (this is copied directly from old dr0type.pkh)
create or replace type TextIndexMethods authid current_user as object
(
key RAW(4),
objid RAW(4),
tmpobjid RAW(4),
static function ODCIGetInterfaces(ifclist OUT sys.ODCIObjectList)
return number,
static function ODCIIndexCreate(ia sys.odciindexinfo, parms varchar2,
env sys.ODCIEnv)
return number,
static function ODCIIndexAlter(ia sys.odciindexinfo,
parms in out varchar2,
altopt number, env sys.ODCIEnv)
return number,
static function ODCIIndexTruncate(ia sys.odciindexinfo,
env sys.ODCIEnv)
return number,
static function ODCIIndexDrop(ia sys.odciindexinfo,
env sys.ODCIEnv)
return number,
static function ODCIIndexInsert(
ia sys.odciindexinfo,
ridlist sys.odciridlist,
env sys.odcienv)
return number is language C
name "insert"
library dr$lib
with context
parameters(
context,
ia,
ia INDICATOR STRUCT,
ridlist,
ridlist INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIIndexUpdate(
ia sys.odciindexinfo,
ridlist sys.odciridlist,
env sys.odcienv)
return number is language C
name "update"
library dr$lib
with context
parameters(
context,
ia,
ia INDICATOR STRUCT,
ridlist,
ridlist INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIIndexDelete(
ia sys.odciindexinfo,
ridlist sys.odciridlist,
env sys.odcienv)
return number is language C
name "delete"
library dr$lib
with context
parameters(
context,
ia,
ia INDICATOR STRUCT,
ridlist,
ridlist INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIIndexStart(sctx in out TextIndexMethods,
ia sys.odciindexinfo,
op sys.odcipredinfo,
qi sys.odciqueryinfo,
strt number, stop number, valarg varchar2,
env SYS.ODCIEnv)
return number is language C
name "start"
library dr$lib
with context
parameters(
context,
sctx,
sctx INDICATOR STRUCT,
ia,
ia INDICATOR STRUCT,
op,
op INDICATOR STRUCT,
qi,
qi INDICATOR STRUCT,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
valarg,
valarg INDICATOR,
valarg LENGTH,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIIndexStart(sctx in out TextIndexMethods,
ia sys.odciindexinfo,
op sys.odcipredinfo,
qi sys.odciqueryinfo,
strt number, stop number, valarg clob,
env SYS.ODCIEnv)
return number is language C
name "start_clob"
library dr$lib
with context
parameters(
context,
sctx,
sctx INDICATOR STRUCT,
ia,
ia INDICATOR STRUCT,
op,
op INDICATOR STRUCT,
qi,
qi INDICATOR STRUCT,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
member function ODCIIndexFetch(nrows number,
rids OUT sys.odciridlist, env SYS.ODCIEnv)
return number is language C
name "fetch"
library dr$lib
with context
parameters(
context,
self,
self INDICATOR STRUCT,
nrows,
nrows INDICATOR,
rids,
rids INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
member function ODCIIndexClose(env sys.ODCIEnv)
return number is language C
name "close"
library dr$lib
with context
parameters(
context,
self,
self INDICATOR STRUCT,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIIndexGetMetaData(ia IN sys.odciindexinfo,
version IN varchar2,
new_block OUT PLS_INTEGER,
env IN sys.ODCIEnv)
return varchar2,
static function ODCIIndexUpdPartMetaData(ia IN sys.odciindexinfo,
palist IN sys.ODCIPartInfoList,
env IN sys.ODCIEnv)
return NUMBER,
static function ODCIIndexUtilGetTableNames(ia IN sys.odciindexinfo,
read_only IN PLS_INTEGER,
version IN varchar2,
context OUT PLS_INTEGER)
return boolean,
static procedure ODCIIndexUtilCleanup(context IN PLS_INTEGER),
static function ODCIIndexSplitPartition(ia IN SYS.ODCIIndexInfo,
part_name1 IN SYS.ODCIPartInfo,
part_name2 IN SYS.ODCIPartInfo,
parms IN varchar2,
env IN SYS.ODCIEnv)
return number,
static function ODCIIndexMergePartition(ia IN SYS.ODCIIndexInfo,
part_name1 IN SYS.ODCIPartInfo,
part_name2 IN SYS.ODCIPartInfo,
parms IN varchar2,
env IN SYS.ODCIEnv)
return number,
static function ODCIIndexExchangePartition(ia IN SYS.ODCIIndexInfo,
ia1 IN SYS.ODCIIndexInfo,
env IN SYS.ODCIEnv)
return number,
static function ODCIIndexUpdate(ia sys.odciindexinfo,
ridlist sys.odciridlist,
oldvallist sys.odcicolarrayvallist,
newvallist sys.odcicolarrayvallist,
env sys.ODCIEnv)
return number
);
/
----------------------------------------------
-- CREATE EIX OPTIMIZER IMPLEMENTATION TYPE --
----------------------------------------------
create or replace type TextOptStats authid definer as object
(
stats_ctx RAW(4),
static function ODCIGetInterfaces(ifclist OUT sys.ODCIObjectList)
return number,
static function ODCIStatsCollect(idx sys.ODCIIndexInfo,
options sys.ODCIStatsOptions,
statistics OUT RAW,
env sys.ODCIEnv)
return number is language C
name "st_coll"
library dr$lib
with context
parameters(
context,
idx,
idx INDICATOR STRUCT,
options,
options INDICATOR STRUCT,
statistics,
statistics INDICATOR,
statistics LENGTH,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsDelete(idx sys.ODCIIndexInfo, statistics OUT RAW,
env sys.ODCIEnv)
return number is language C
name "st_delv2"
library dr$lib
with context
parameters(
context,
idx,
idx INDICATOR STRUCT,
statistics,
statistics INDICATOR,
statistics LENGTH,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval varchar2,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_sel"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval varchar2,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_sel_clob"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval clob,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_sel"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval clob,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_sel_clob"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval blob,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_sel"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval blob,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_sel_clob"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval bfile,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_sel"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval bfile,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_sel_clob"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval sys.xmltype,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_sel"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval sys.xmltype,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_sel_clob"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval sys.uritype,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_sel"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR STRUCT,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsSelectivity(pred sys.ODCIPredInfo,
sel OUT NUMBER,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
colval sys.uritype,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_sel_clob"
library dr$lib
with context
parameters(
context,
pred,
pred INDICATOR STRUCT,
sel,
sel INDICATOR,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
colval,
colval INDICATOR STRUCT,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval varchar2,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_fcost"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval varchar2,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_fcost_clob"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval clob,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_fcost"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval clob,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_fcost_clob"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval blob,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_fcost"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval blob,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_fcost_clob"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval bfile,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_fcost"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval bfile,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_fcost_clob"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval sys.xmltype,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_fcost"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval sys.xmltype,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_fcost_clob"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval sys.uritype,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_fcost"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR STRUCT,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsFunctionCost(func sys.ODCIFuncinfo,
cost IN OUT sys.ODCICost,
args sys.ODCIArgDescList,
colval sys.uritype,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_fcost_clob"
library dr$lib
with context
parameters(
context,
func,
func INDICATOR STRUCT,
cost,
cost INDICATOR STRUCT,
args,
args INDICATOR,
colval,
colval INDICATOR STRUCT,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsIndexCost(idx sys.ODCIIndexInfo,
sel NUMBER,
cost IN OUT sys.ODCICost,
qi sys.ODCIQueryInfo,
pred sys.ODCIPredInfo,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
valarg varchar2,
env sys.ODCIEnv)
return number is language C
name "st_icost"
library dr$lib
with context
parameters(
context,
idx,
idx INDICATOR STRUCT,
sel,
sel INDICATOR,
cost,
cost INDICATOR STRUCT,
qi,
qi INDICATOR STRUCT,
pred,
pred INDICATOR STRUCT,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
static function ODCIStatsIndexCost(idx sys.ODCIIndexInfo,
sel NUMBER,
cost IN OUT sys.ODCICost,
qi sys.ODCIQueryInfo,
pred sys.ODCIPredInfo,
args sys.ODCIArgDescList,
strt NUMBER,
stop NUMBER,
valarg clob,
env sys.ODCIEnv)
return number is language C
name "st_icost_clob"
library dr$lib
with context
parameters(
context,
idx,
idx INDICATOR STRUCT,
sel,
sel INDICATOR,
cost,
cost INDICATOR STRUCT,
qi,
qi INDICATOR STRUCT,
pred,
pred INDICATOR STRUCT,
args,
args INDICATOR,
strt,
strt INDICATOR,
stop,
stop INDICATOR,
valarg,
valarg INDICATOR,
env,
env INDICATOR STRUCT,
return OCINumber
),
pragma restrict_references(ODCIStatsSelectivity, WNDS, WNPS),
pragma restrict_references(ODCIStatsFunctionCost, WNDS, WNPS),
pragma restrict_references(ODCIStatsIndexCost, WNDS, WNPS)
);
/
REM create a dummy type body.
create or replace type body TextIndexMethods is
static function ODCIGetInterfaces(
ifclist out sys.ODCIObjectList
) return number
is
begin
ifclist := sys.ODCIObjectList(sys.ODCIObject('SYS','ODCIINDEX2'));
return sys.ODCIConst.Success;
end ODCIGetInterfaces;
static function ODCIIndexCreate(
ia in sys.odciindexinfo,
parms in varchar2,
env in sys.ODCIEnv
) return number
is
begin
return sys.odciconst.fatal;
end ODCIIndexCreate;
static function ODCIIndexAlter(
ia in sys.odciindexinfo,
parms in out varchar2,
altopt in number,
env in sys.ODCIEnv
) return number
is
begin
return sys.odciconst.fatal;
end ODCIIndexAlter;
static function ODCIIndexTruncate(
ia in sys.odciindexinfo,
env in sys.ODCIEnv
) return number
is
begin
return sys.odciconst.fatal;
end ODCIIndexTruncate;
static function ODCIIndexDrop(
ia in sys.odciindexinfo,
env in sys.ODCIEnv
) return number
is
begin
return sys.odciconst.fatal;
end ODCIIndexDrop;
static function ODCIIndexGetMetaData(
ia in sys.odciindexinfo,
version in varchar2,
new_block out PLS_INTEGER,
env in sys.ODCIEnv
) return varchar2
is
begin
return sys.odciconst.fatal;
end ODCIIndexGetMetaData;
static function ODCIIndexUpdPartMetaData(
ia in sys.odciindexinfo,
palist in sys.ODCIPartInfoList,
env in sys.ODCIEnv
) return NUMBER
is
begin
return sys.odciconst.fatal;
end ODCIIndexUpdPartMetaData;
static function ODCIIndexUtilGetTableNames(
ia IN sys.odciindexinfo,
read_only IN PLS_INTEGER,
version IN varchar2,
context OUT PLS_INTEGER)
return boolean
is
begin
Return FALSE;
end ODCIIndexUtilGetTableNames;
static procedure ODCIIndexUtilCleanup(
context IN PLS_INTEGER)
is
begin
null;
end ODCIIndexUtilCleanup;
static function ODCIIndexSplitPartition(
ia IN SYS.ODCIIndexInfo,
part_name1 IN SYS.ODCIPartInfo,
part_name2 IN SYS.ODCIPartInfo,
parms IN varchar2,
env IN SYS.ODCIEnv
) return number
is
begin
return sys.odciconst.fatal;
end ODCIIndexSplitPartition;
static function ODCIIndexMergePartition(
ia IN SYS.ODCIIndexInfo,
part_name1 IN SYS.ODCIPartInfo,
part_name2 IN SYS.ODCIPartInfo,
parms IN varchar2,
env IN SYS.ODCIEnv
) return number
is
begin
return sys.odciconst.fatal;
end ODCIIndexMergePartition;
static function ODCIIndexExchangePartition(
ia IN SYS.ODCIIndexInfo,
ia1 IN SYS.ODCIIndexInfo,
env IN SYS.ODCIEnv
) return number
is
begin
return sys.odciconst.fatal;
end ODCIIndexExchangePartition;
static function ODCIIndexUpdate(
ia sys.odciindexinfo,
ridlist sys.odciridlist,
oldvallist sys.odcicolarrayvallist,
newvallist sys.odcicolarrayvallist,
env sys.ODCIEnv)
return number
is
begin
return sys.odciconst.fatal;
end ODCIIndexUpdate;
end;
/
select text from dba_errors
where owner = 'CTXSYS' and name = 'TEXTINDEXMETHODS';
show errors;
create or replace type body TextOptStats is
static function ODCIGetInterfaces(ifclist OUT sys.ODCIObjectList)
return number is
begin
ifclist := sys.ODCIObjectList(sys.ODCIObject('SYS','ODCISTATS2'));
return ODCIConst.Success;
end ODCIGetInterfaces;
end;
/
select text from dba_errors
where owner = 'CTXSYS' and name = 'TEXTOPTSTATS';
show errors;
PROMPT Shift indextype implementation to TextIndexMethods and add
PROMPT support for composite index.
PROMPT
alter indextype context using TextIndexMethods;
alter indextype context_v2 using TextIndexMethods;
REM
REM recreate 12.2 version contains and score operators
REM following copied directly from dr0itype.sql
REM
create or replace package ctx_contains authid current_user as
-- varchar2 column type, varchar2 query string type
function Textcontains(Colval in varchar2,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv*/)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- varchar2 column type, clob query string type
function Textcontains(Colval in varchar2,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv*/)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- clob column type, varchar2 query string type
function Textcontains(Colval in clob,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- clob column type, clob query string type
function Textcontains(Colval in clob,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- blob column type, varchar2 query string type
function Textcontains(Colval in blob,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv*/)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- blob column type, clob query string type
function Textcontains(Colval in blob,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv*/)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- bfile column type, varchar2 query string type
function Textcontains(Colval in bfile,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- bfile column type, clob query string type
function Textcontains(Colval in bfile,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- Xmltype column type, varchar2 query string type
function Textcontains(Colval in sys.xmltype,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv*/)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- Xmltype column type, clob query string type
function Textcontains(Colval in sys.xmltype,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv*/)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- Uritype column type, varchar2 query string type
function Textcontains(Colval in sys.uritype,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv*/)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR STRUCT,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
-- Uritype column type, clob query string type
function Textcontains(Colval in sys.uritype,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv*/)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR STRUCT,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
end ctx_contains;
/
--------------------------------------
-- CREATE CONTAINS PRIMARY OPERATOR --
--------------------------------------
--- CREATE TEXT OPERATOR
create or replace operator contains binding
(varchar2, varchar2) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(varchar2, clob) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(clob, varchar2) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(clob, clob) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(blob, varchar2) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(blob, clob) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(bfile, varchar2) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(bfile, clob) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(sys.xmltype, varchar2) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(sys.xmltype, clob) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(sys.uritype, varchar2) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
,
(sys.uritype, clob) return number
with index context, scan context TextIndexMethods
compute ancillary data without column data using ctx_contains.Textcontains
;
grant execute on contains to public;
drop public synonym contains;
create public synonym contains for ctxsys.contains;
-------------------------------
-- CREATE ANCILLARY FUNCTION --
-------------------------------
create or replace package driscore authid current_user as
function TextScore(Colval in varchar2,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in varchar2,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in clob,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in clob,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in blob,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in blob,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in bfile,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in bfile,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in sys.xmltype,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in sys.xmltype,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in sys.uritype,
Text in varchar2, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR STRUCT,
Text,
Text INDICATOR,
Text LENGTH,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
function TextScore(Colval in sys.uritype,
Text in clob, ia sys.odciindexctx,
sctx IN OUT TextIndexMethods,
cflg number /*, env sys.ODCIEnv */)
return number parallel_enable is language C
name "contains_clob"
library dr$lib
with context
parameters(
context,
Colval,
Colval INDICATOR STRUCT,
Text,
Text INDICATOR,
ia,
ia INDICATOR STRUCT,
sctx,
sctx INDICATOR STRUCT,
cflg,
cflg INDICATOR,
return OCINumber
);
end driscore;
/
-------------------------------
-- CREATE ANCILLARY OPERATOR --
-------------------------------
--- CREATE Score OPERATOR
create or replace operator score binding
(number) return number
ancillary to contains(varchar2, varchar2),
contains(varchar2, clob),
contains(clob, varchar2),
contains(clob, clob),
contains(blob, varchar2),
contains(blob, clob),
contains(bfile, varchar2),
contains(bfile, clob),
contains(sys.xmltype, varchar2),
contains(sys.xmltype, clob),
contains(sys.uritype, varchar2),
contains(sys.uritype, clob)
without column data using driscore.TextScore;
grant execute on score to public;
drop public synonym score;
create public synonym score for ctxsys.score;
grant execute on ConText to public;
grant execute on ConText_V2 to public;
PROMPT Rebind operators and remove the dummyop
PROMPT
alter indextype context add contains(varchar2, varchar2);
alter indextype context add contains(varchar2, clob);
alter indextype context add contains(clob, varchar2);
alter indextype context add contains(clob, clob);
alter indextype context add contains(blob, varchar2);
alter indextype context add contains(blob, clob);
alter indextype context add contains(bfile, varchar2);
alter indextype context add contains(bfile, clob);
alter indextype context add contains(sys.xmltype, varchar2);
alter indextype context add contains(sys.xmltype, clob);
alter indextype context add contains(sys.uritype, varchar2);
alter indextype context add contains(sys.uritype, clob);
alter indextype context drop dummyop(varchar2, varchar2);
alter indextype context_v2 add contains(varchar2, varchar2);
alter indextype context_v2 add contains(varchar2, clob);
alter indextype context_v2 add contains(clob, varchar2);
alter indextype context_v2 add contains(clob, clob);
alter indextype context_v2 add contains(blob, varchar2);
alter indextype context_v2 add contains(blob, clob);
alter indextype context_v2 add contains(bfile, varchar2);
alter indextype context_v2 add contains(bfile, clob);
alter indextype context_v2 add contains(sys.xmltype, varchar2);
alter indextype context_v2 add contains(sys.xmltype, clob);
alter indextype context_v2 add contains(sys.uritype, varchar2);
alter indextype context_v2 add contains(sys.uritype, clob);
alter indextype context_v2 drop dummyop(varchar2, varchar2);
-- Added for bug 2695369
alter indextype context using textindexmethods
with order by score(number);
alter indextype context_v2 using textindexmethods
with order by score(number);
REM RE-ASSOCIATE EIX OPTIMIZER IMPLEMENTATION TYPE
ASSOCIATE STATISTICS WITH INDEXTYPES ConText USING TextOptStats;
ASSOCIATE STATISTICS WITH INDEXTYPES ConText_V2 USING TextOptStats
WITH SYSTEM MANAGED STORAGE TABLES;
ASSOCIATE STATISTICS WITH PACKAGES ctx_contains USING TextOptStats;
REM
REM END DOWN-GRADING CONTEXT INDEXTYPE
REM
delete from dr$object_attribute
where oat_id = 70116 and oat_cla_id = 7 and oat_att_id = 16
and oat_name = 'WILDCARD_INDEX';
delete from dr$object_attribute
where oat_id = 70117 and oat_cla_id = 7 and oat_att_id = 17
and oat_name = 'WILDCARD_INDEX_K';
delete from dr$object_attribute
where oat_id = 90156 and oat_cla_id = 9 and oat_att_id = 1
and oat_name = 'KG_TABLE_CLAUSE';
delete from dr$object_attribute
where oat_id = 90158 and oat_cla_id = 9 and oat_att_id = 1
and oat_name = 'KG_INDEX_CLAUSE';
-- delete STAGE_ITAB_AUTO_OPT
delete from dr$object_attribute
where oat_id = 90157 and oat_cla_id = 9 and oat_att_id = 1
and oat_name = 'STAGE_ITAB_AUTO_OPT';
delete from dr$object_attribute
where oat_id = 90159 and oat_cla_id = 9 and oat_att_id = 1
and oat_name = 'D_INDEX_CLAUSE';
delete from dr$object_attribute
where oat_id = 90160 and oat_cla_id = 9 and oat_att_id = 1
and oat_name = 'N_INDEX_CLAUSE';
delete from dr$object_attribute
where oat_id = 90161 and oat_cla_id = 9 and oat_att_id = 1
and oat_name = 'K_INDEX_CLAUSE';
delete from dr$object_attribute
where oat_id = 90162 and oat_cla_id = 9 and oat_att_id = 1
and oat_name = 'U_INDEX_CLAUSE';
delete from dr$object_attribute
where oat_id = 90163 and oat_cla_id = 9 and oat_att_id = 1
and oat_name = 'KD_INDEX_CLAUSE';
delete from dr$object_attribute
where oat_id = 90164 and oat_cla_id = 9 and oat_att_id = 1
and oat_name = 'KR_INDEX_CLAUSE';
--change back to old stage_itab_max_rows default (100K -> 1M)
update dr$object_attribute
set oat_default = 1000000
where oat_id = 90128 and oat_cla_id = 9 and oat_obj_id = 1 and
oat_att_id = 28 and oat_name = 'STAGE_ITAB_MAX_ROWS';
commit;
REM ========================================================
REM Alter dr$index, ctx_indexes, ctx_user_indexes
REM Drop column idx_auto_opt_type, idx_auto_opt_interval
REM ========================================================
SET SERVEROUTPUT ON
DECLARE
errnum number;
BEGIN
execute immediate('
alter table dr$index drop (idx_auto_opt_type,
idx_auto_opt_interval,
idx_auto_opt_para_degree)');
EXCEPTION
when others then
errnum := SQLCODE;
if (errnum = -00904) then
null;
else
raise;
end if;
END;
/
create or replace view ctx_indexes as
select
idx_id
,u.name idx_owner
,idx_name idx_name
,u2.name idx_table_owner
,o.name idx_table
,idx_key_name idx_key_name
,idx_text_name idx_text_name
,idx_docid_count idx_docid_count
,idx_status idx_status
,idx_language_column idx_language_column
,idx_format_column idx_format_column
,idx_charset_column idx_charset_column
,decode(idx_type, 0, 'CONTEXT', 1, 'CTXCAT', 2, 'CTXRULE') idx_type
,idx_sync_type idx_sync_type
,idx_sync_memory idx_sync_memory
,idx_sync_para_degree idx_sync_para_degree
,idx_sync_interval idx_sync_interval
,idx_sync_jobname idx_sync_jobname
,decode(instr(idx_option, 'Z'), 0, 'NO', NULL, 'NO', 'YES')
idx_query_stats_enabled
from dr$index, sys."_BASE_USER" u, sys.obj$ o, sys."_BASE_USER" u2
where idx_owner# = u.user#
and idx_table_owner# = u2.user#
and idx_table# = o.obj#
;
create or replace view ctx_user_indexes as
select
idx_id
,idx_name idx_name
,u.name idx_table_owner
,o.name idx_table
,idx_key_name idx_key_name
,idx_text_name idx_text_name
,idx_docid_count idx_docid_count
,idx_status idx_status
,idx_language_column idx_language_column
,idx_format_column idx_format_column
,idx_charset_column idx_charset_column
,decode(idx_type, 0, 'CONTEXT', 1, 'CTXCAT', 2, 'CTXRULE') idx_type
,idx_sync_type idx_sync_type
,idx_sync_memory idx_sync_memory
,idx_sync_para_degree idx_sync_para_degree
,idx_sync_interval idx_sync_interval
,idx_sync_jobname idx_sync_jobname
,decode(instr(idx_option, 'Z'), 0, 'NO', NULL, 'NO', 'YES')
idx_query_stats_enabled
from dr$index, sys."_BASE_USER" u, sys.obj$ o
where idx_owner# = userenv('SCHEMAID')
and idx_table_owner# = u.user#
and idx_table# = o.obj#
;
REM ==========================================================================
REM alter dr$index_partition, ctx_index_partitions, ctx_user_index_partitions
REM drop column ixp_auto_opt_type, ixp_auto_opt_interval
REM ==========================================================================
DECLARE
errnum number;
BEGIN
execute immediate('
alter table dr$index_partition
drop (ixp_auto_opt_type, ixp_auto_opt_interval,
ixp_auto_opt_para_degree)');
EXCEPTION
when others then
errnum := SQLCODE;
if (errnum = -00904) then
null;
else
raise;
end if;
END;
/
create or replace view ctx_index_partitions as
select
ixp_id
,u1.name ixp_index_owner
,idx_name ixp_index_name
,ixp_name ixp_index_partition_name
,u2.name ixp_table_owner
,o1.name ixp_table_name
,o2.subname ixp_table_partition_name
,ixp_docid_count ixp_docid_count
,ixp_status ixp_status
,ixp_sync_type ixp_sync_type
,ixp_sync_memory ixp_sync_memory
,ixp_sync_para_degree ixp_sync_para_degree
,ixp_sync_interval ixp_sync_interval
,ixp_sync_jobname ixp_sync_jobname
from dr$index_partition, dr$index, sys."_BASE_USER" u1, sys."_BASE_USER" u2,
sys.obj$ o1, sys.obj$ o2
where idx_owner# = u1.user#
and idx_table_owner# = u2.user#
and ixp_table_partition# = o2.obj#
and idx_table# = o1.obj#
and ixp_idx_id = idx_id
/
create or replace view ctx_user_index_partitions as
select
ixp_id
,idx_name ixp_index_name
,ixp_name ixp_index_partition_name
,u2.name ixp_table_owner
,o1.name ixp_table_name
,o2.subname ixp_table_partition_name
,ixp_docid_count ixp_docid_count
,ixp_status ixp_status
,ixp_sync_type ixp_sync_type
,ixp_sync_memory ixp_sync_memory
,ixp_sync_para_degree ixp_sync_para_degree
,ixp_sync_interval ixp_sync_interval
,ixp_sync_jobname ixp_sync_jobname
from dr$index_partition, dr$index, sys."_BASE_USER" u2,
sys.obj$ o1, sys.obj$ o2
where idx_owner# = userenv('SCHEMAID')
and idx_table_owner# = u2.user#
and ixp_table_partition# = o2.obj#
and idx_table# = o1.obj#
and ixp_idx_id = idx_id
/
REM ========================================================================
REM Add FILE_ACCESS_ROLE
REM ========================================================================
delete from ctxsys.dr$parameter where par_name = 'FILE_ACCESS_ROLE';
insert into ctxsys.dr$parameter(par_name, par_value)
values('FILE_ACCESS_ROLE', NULL);
--Loop over all indexes and widen token columns (Runs as sys, in CTXSYS schema)
DECLARE
table_name VARCHAR2(128);
event_level NUMBER;
token_length_check NUMBER;
BEGIN
FOR r_index_partitions IN
(SELECT i.idx_owner,
i.idx_id,
i.idx_name,
i.idx_type,
ixp.ixp_id,
ixp.ixp_index_partition_name
FROM CTX_INDEXES i LEFT OUTER JOIN
CTX_INDEX_PARTITIONS ixp
ON ixp.ixp_index_name = i.idx_name
WHERE i.idx_status LIKE 'INDEXED'
AND (i.idx_type LIKE 'CONTEXT'
OR i.idx_type LIKE 'CONTEXT2')
ORDER BY i.idx_id, ixp.ixp_id) LOOP
BEGIN
BEGIN
-- Widening $I table --
table_name := dr$temp_get_object_name(r_index_partitions.idx_owner,
r_index_partitions.idx_name,
r_index_partitions.idx_id,
r_index_partitions.ixp_id,
'I');
dbms_output.put_line('Table Name: ' || table_name);
token_length_check := 0;
execute immediate ('select count(token_text) from '||table_name||
' where length(token_text) > 64 and rownum < 2')
into token_length_check;
if token_length_check > 0 then
dbms_output.put_line('Index '||r_index_partitions.idx_owner||'.'
||r_index_partitions.idx_name||' is unusable,'
||'as it contains longer than 64 byte tokens.'
||' Please rebuild.');
execute immediate('alter index '||r_index_partitions.idx_owner||'.'
||r_index_partitions.idx_name||' UNUSABLE');
--Index has been marked UNUSABLE, skip other tables
CONTINUE;
else
--Context V2 tables were widened to 255 bytes in 12.2.0.1
if r_index_partitions.idx_type LIKE 'CONTEXT' then
execute immediate('alter table ' || table_name ||
' modify TOKEN_TEXT VARCHAR2(64)');
end if;
end if;
EXCEPTION
when others then
if (SQLCODE = -00942) then --Table Does Not Exist!
dbms_output.put_line('Table ' || table_name ||
' not be found. Skipping.');
null;
else
raise;
end if;
END;
-- Widening $P table --
BEGIN
table_name := dr$temp_get_object_name(r_index_partitions.idx_owner,
r_index_partitions.idx_name,
r_index_partitions.idx_id,
r_index_partitions.ixp_id,
'P');
dbms_output.put_line('Table Name ' || table_name);
sys.dbms_system.read_ev(30579,event_level);
if(bitand(event_level, 2097152) = 0) then
token_length_check := 0;
execute immediate ('select count(*) from '||table_name||' where '||
'length(pat_part1) > 61'|| --Checking for 61 here
'or length(pat_part2) > 64 and rownum < 2')
into token_length_check;
if token_length_check > 0 then
dbms_output.put_line('Index '||r_index_partitions.idx_owner||'.'
||r_index_partitions.idx_name||' is unusable,'
||'as it contains longer than 64 byte tokens.'
||' Please rebuild.');
execute immediate('alter index '||r_index_partitions.idx_owner||'.'
||r_index_partitions.idx_name||' UNUSABLE');
--Index has been marked UNUSABLE, skip other tables
CONTINUE;
else
execute immediate(
'alter table ' || table_name ||
' modify (pat_part1 VARCHAR2(61), pat_part2 VARCHAR2(64))');
end if;
else
token_length_check := 0;
execute immediate ('select count(*) from '||
table_name||' where length(pat_part1) > 64 '||
'or length(pat_part2) > 64 and rownum < 2')
into token_length_check;
if token_length_check > 0 then
dbms_output.put_line('Index '||r_index_partitions.idx_owner||'.'
||r_index_partitions.idx_name||' is unusable,'
||'as it contains longer than 64 byte tokens.'
||' Please rebuild.');
execute immediate('alter index '||r_index_partitions.idx_owner||'.'
||r_index_partitions.idx_name||' UNUSABLE');
--Index has been marked UNUSABLE, skip other tables
CONTINUE;
else
execute immediate(
'alter table ' || table_name ||
' modify (pat_part1 VARCHAR2(64), pat_part2 VARCHAR2(64))');
end if;
end if;
EXCEPTION
when others then
if (SQLCODE = -00942) then --Table Does Not Exist!
dbms_output.put_line('Table ' || table_name ||
' not be found. Skipping.');
null;
else
raise;
end if;
END;
-- Widening $G table --
BEGIN
table_name := dr$temp_get_object_name(r_index_partitions.idx_owner,
r_index_partitions.idx_name,
r_index_partitions.idx_id,
r_index_partitions.ixp_id,
'G');
dbms_output.put_line('Table Name ' || table_name);
token_length_check := 0;
execute immediate ('select count(*) from '
||table_name||' where length(token_text) > 64 '||
' and rownum < 2')
into token_length_check;
if token_length_check > 0 then
dbms_output.put_line('Index '||r_index_partitions.idx_owner||'.'
||r_index_partitions.idx_name||' is unusable,'
||'as it contains longer than 64 byte tokens.'
||' Please rebuild.');
execute immediate('alter index '||r_index_partitions.idx_owner||'.'
||r_index_partitions.idx_name||' UNUSABLE');
--Index has been marked UNUSABLE, skip other tables
CONTINUE;
else
--Context V2 tables were widened to 255 bytes in 12.2.0.1
if r_index_partitions.idx_type LIKE 'CONTEXT' then
execute immediate('alter table ' || table_name ||
' modify TOKEN_TEXT VARCHAR2(64)');
end if;
end if;
EXCEPTION
when others then
if (SQLCODE = -00942) then --Table Does Not Exist!
dbms_output.put_line('Table ' || table_name ||
' not be found. Skipping.');
null;
else
raise;
end if;
END;
-----------------------
END;
END LOOP;
END;
/
show errors;
--------------END TEMP FUNCTIONS FOR DOWNGRADE-------------------
-- Widen columns that hold tokens to 255 bytes
UPDATE dr$index SET idx_opt_token = substr(idx_opt_token,1,64);
ALTER TABLE dr$index MODIFY idx_opt_token varchar2(64);
UPDATE dr$index_partition SET ixp_opt_token = substr(ixp_opt_token,1,64);
ALTER TABLE dr$index_partition MODIFY ixp_opt_token varchar2(64);
UPDATE dr$freqtoks SET fqt_token = substr(fqt_token,1,64);
ALTER TABLE dr$freqtoks MODIFY fqt_token varchar2(64);
--Used to be 80, reverting to that length
UPDATE dr$stopword SET spw_word = substr(spw_word,1,80);
ALTER TABLE dr$stopword MODIFY spw_word varchar2(80);
--Dropping all the temp functions created above
drop function dr$temp_get_object_name;
drop function dr$temp_get_object_prefix;
drop function dr$temp_make_pfx;
drop function dr$temp_max_name_length;
drop function dr$temp_GetIndexRec;
drop function dr$temp_IndexHasFullLengthObj;
drop function dr$temp_ChkIndexOption;
drop procedure dr$temp_parse_object_name;
drop function dr$temp_enquote_parts;
drop package temp_utl_pkg;
REM ========================================================================
REM SYS changes
REM ========================================================================
ALTER SESSION SET CURRENT_SCHEMA = SYS;
revoke select on SYS.DBA_TAB_SUBPARTITIONS from ctxsys;
ALTER SESSION SET CURRENT_SCHEMA = CTXSYS;
@?/rdbms/admin/sqlsessend.sql
OHA YOOOO