Extensible Indexing бага / фича

telelvis
Дата: 07.12.2007 23:49:00
Добрый вечер.

Наткнулся на непонятный баг, пытаясь задействовать такую фичу Oracle как Extensible Indexing (если кратко, то она позволяет определять свои собственные типы индексов)
Ниже код, сразу оговорюсь - упрощен по самое немогу. some_idxtype_im - реализация интерфейса ODCI по типу NUMBER
sva@solus:~$ cat tosqlru.sql
create or replace
TYPE some_idxtype_im as object (
curnum        number,
static function ODCIGetinterfaces (ifclist out nocopy sys.ODCIObjectList) return number,
static function ODCIIndexCreate
    (ia sys.ODCIindexinfo, parms varchar2, 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, rid rowid,
                                  newval number, env sys.ODCIEnv) return number,
static function ODCIIndexDelete (ia sys.ODCIindexinfo, rid varchar2, oldval number,
                                  env sys.ODCIEnv) return number,
static function ODCIindexUpdate (ia sys.ODCIindexinfo, rid varchar2, oldval number,
                                  newval number, env sys.ODCIEnv) return number,
static function ODCIIndexStart (sctx in out nocopy some_idxtype_im, ia sys.ODCIindexinfo,
                                 op sys.ODCIPredinfo, qi sys.ODCIQueryinfo,
                                 strt number, stop number, val number, env sys.ODCIEnv) return number,
static function ODCIIndexFetch (slf in out nocopy some_idxtype_im, nrows in number,
                                 rids out nocopy sys.ODCIRidList, env sys.ODCIEnv)
                                 return number,
static function ODCIIndexClose (slf some_idxtype_im, env sys.ODCIEnv) return number
)
/
create or replace
TYPE body some_idxtype_im is
static function ODCIGetinterfaces (ifclist out nocopy sys.ODCIObjectList) return number is
begin
    ifclist := sys.ODCIObjectList (sys.ODCIObject ('SYS', 'ODCIINDEX2'));
    return ODCIConst.SUCCESS;
end;
static function ODCIIndexCreate
    (ia sys.ODCIindexinfo, parms varchar2, env sys.ODCIEnv) return number is
stm       varchar2(1000);
begin
    /* создаем таблицу для хранения данных индекса - все по букварю */
    stm := 'create table ' || ia.IndexSchema || '.' || ia.IndexName || '_idx ' ||
        '( r rowid, idxval number)';
    dbms_output.put_line (stm);
    execute immediate stm;

    /* делаем нечто полезное */
    return ODCIConst.SUCCESS;
end;
static function ODCIIndexTruncate (ia sys.ODCIindexinfo,
                                     env sys.ODCIEnv) return number is
begin
    /* делаем нечто полезное */
    return ODCIConst.SUCCESS;
end;
static function ODCIIndexDrop (ia sys.ODCIindexinfo,
                               env sys.ODCIEnv) return number is
begin
    /* делаем нечто полезное */
    return ODCIConst.SUCCESS;
end;
static function ODCIIndexInsert (ia sys.ODCIindexinfo, rid rowid,
                                  newval number, env sys.ODCIEnv) return number is
begin
    /* делаем нечто полезное */
    return ODCIConst.SUCCESS;
end;
static function ODCIIndexDelete (ia sys.ODCIindexinfo, rid varchar2, oldval number,
                                  env sys.ODCIEnv) return number is
begin
    /* делаем нечто полезное */
    return ODCIConst.SUCCESS;
end;
static function ODCIindexUpdate (ia sys.ODCIindexinfo, rid varchar2, oldval number,
                                  newval number, env sys.ODCIEnv) return number is
begin
    /* делаем нечто полезное */
    return ODCIConst.SUCCESS;
end;
static function ODCIIndexStart (sctx in out nocopy some_idxtype_im, ia sys.ODCIindexinfo,
                                 op sys.ODCIPredinfo, qi sys.ODCIQueryinfo,
                                 strt number, stop number, val number, env sys.ODCIEnv) return number is
begin
    /* делаем нечто полезное */
    return ODCIConst.SUCCESS;
end;
static function ODCIIndexFetch (slf in out nocopy some_idxtype_im, nrows in number,
                                 rids out nocopy sys.ODCIRidList, env sys.ODCIEnv)
                                 return number is
begin
    /* делаем нечто полезное */
    return ODCIConst.SUCCESS;
end;
static function ODCIIndexClose (slf some_idxtype_im, env sys.ODCIEnv) return number is
begin
    /* делаем нечто полезное */
    return ODCIConst.SUCCESS;
end;
end;
/
create or replace function some_fnc (a number, b number) return number is
begin
    return 1;
end;
/
create or replace operator some_op binding (number, number) return number  using some_fnc
/
create or replace indextype some_idxtype for
some_op (number, number)
using some_idxtype_im;

дальше пробуем
SQL> conn / as sysdba
Connected.
SQL> create user medved identified by preved;

User created.

SQL> grant connect, resource to medved;

Grant succeeded.

SQL> conn medved/preved
Connected.
SQL> @tosqlru.sql

Type created.


Type body created.


Function created.


Operator created.


Indextype created.

SQL> create table tbl (value number);

Table created.

SQL> set serverouput on;
SQL> create index p on tbl (value) indextype is some_idxtype;
create table MEDVED.P_idx ( r rowid, idxval number)
create index p on tbl (value) indextype is some_idxtype
*
ERROR at line 1:
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-01031: insufficient privileges
ORA-06512: at "MEDVED.SOME_IDXTYPE_IM", line 14


SQL> create table MEDVED.P_idx ( r rowid, idxval number);

Table created.

SQL>

Ошибка именно на создании таблицы индекса.
Не пойму в чем дело, ткните носом если что.

ну и второй вопрос даже незнаю как это назвать:

SQL> select bitand (18446744069414584320, 65535) from dual;

BITAND(18446744069414584320,65535)
----------------------------------
                             65535

???

БД была:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
и
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
PL/SQL Release 9.2.0.6.0 - Production
CORE    9.2.0.6.0       Production
TNS for Linux: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 - Production
Заранее спасибо.
vds
Дата: 08.12.2007 00:23:40
Посмотрите ноту 394924.1
Там объясняется про Spatial индекс, но природа ошибки 100% так же самая.

Если в двух словах, то у медведа не хватает некоторых прав
GRANT CREATE TABLE TO MEDVED
/

P.S. Еле-еле догадался, как Elic ставит смайлы нормальные, кто-бы мог подумать, что нужно целых три ))) скобки!!!
Elic
Дата: 10.12.2007 09:36:37
vds
P.S. Еле-еле догадался, как Elic ставит смайлы нормальные, кто-бы мог подумать, что нужно целых три ))) скобки!!!
STFF кнопка "Цитировать"
telelvis
Дата: 10.12.2007 14:12:28
Да действительно работает если пользователю дается право на CREATE TABLE напрямую а не через роль. С BITAND похоже совсем все плохо http://www.thescripts.com/forum/thread65349.html - написано что пофиксили в 9i, хотя я получаю ее в 10g.