/libsrc/Wi/sparql.sql

https://github.com/XixiLuo/virtuoso-opensource · SQL · 17566 lines · 15959 code · 657 blank · 950 comment · 3103 complexity · 9f0d15e8b932454fa58f529fe45da796 MD5 · raw file

Large files are truncated click here to view the full file

  1. --
  2. -- $Id$
  3. --
  4. -- This file is part of the OpenLink Software Virtuoso Open-Source (VOS)
  5. -- project.
  6. --
  7. -- Copyright (C) 1998-2014 OpenLink Software
  8. --
  9. -- This project is free software; you can redistribute it and/or modify it
  10. -- under the terms of the GNU General Public License as published by the
  11. -- Free Software Foundation; only version 2 of the License, dated June 1991.
  12. --
  13. -- This program is distributed in the hope that it will be useful, but
  14. -- WITHOUT ANY WARRANTY; without even the implied warranty of
  15. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. -- General Public License for more details.
  17. --
  18. -- You should have received a copy of the GNU General Public License along
  19. -- with this program; if not, write to the Free Software Foundation, Inc.,
  20. -- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  21. --
  22. --
  23. create table DB.DBA.RDF_QUAD (
  24. G IRI_ID_8,
  25. S IRI_ID_8,
  26. P IRI_ID_8,
  27. O any,
  28. primary key (P, S, O, G) column
  29. )
  30. alter index RDF_QUAD on DB.DBA.RDF_QUAD partition (S int (0hexffff00))
  31. create distinct no primary key ref column index RDF_QUAD_SP on DB.DBA.RDF_QUAD (S, P) partition (S int (0hexffff00))
  32. create column index RDF_QUAD_POGS on DB.DBA.RDF_QUAD (P, O, S, G) partition (O varchar (-1, 0hexffff))
  33. create distinct no primary key ref column index RDF_QUAD_GS on DB.DBA.RDF_QUAD (G, S) partition (S int (0hexffff00))
  34. create distinct no primary key ref column index RDF_QUAD_OP on DB.DBA.RDF_QUAD (O, P) partition (O varchar (-1, 0hexffff))
  35. ;
  36. create table DB.DBA.RDF_QUAD_RECOV_TMP (
  37. G1 IRI_ID_8, S1 IRI_ID_8, P1 IRI_ID_8, O1 any, primary key (P1, S1, O1, G1) column)
  38. alter index RDF_QUAD_RECOV_TMP on DB.DBA.RDF_QUAD_RECOV_TMP partition (S1 int (0hexffff00))
  39. create column index RDF_QUAD_RECOV_TMP_POGS on DB.DBA.RDF_QUAD_RECOV_TMP (P1, O1, G1, S1) partition (O1 varchar (-1, 0hexffff))
  40. create distinct no primary key ref column index RDF_QUAD_RECOV_TMP_OP on DB.DBA.RDF_QUAD_RECOV_TMP (O1, P1) partition (O1 varchar (-1, 0hexffff))
  41. ;
  42. create function DB.DBA.RDF_MAKE_IID_OF_QNAME_SAFE (in qname any) returns IRI_ID
  43. {
  44. return iri_to_id_nosignal (qname);
  45. }
  46. ;
  47. create function DB.DBA.RDF_MAKE_IID_OF_QNAME_COMP (in qname any) returns IRI_ID
  48. {
  49. return iri_to_id_nosignal (qname, 0);
  50. }
  51. ;
  52. create function DB.DBA.RDF_QNAME_OF_IID (in iid IRI_ID) returns varchar -- DEPRECATED
  53. {
  54. return id_to_iri_nosignal (iid);
  55. }
  56. ;
  57. DB.DBA.RDF_MAKE_IID_OF_QNAME_SAFE (null)
  58. ;
  59. DB.DBA.RDF_MAKE_IID_OF_QNAME_COMP (null)
  60. ;
  61. DB.DBA.RDF_QNAME_OF_IID (null)
  62. ;
  63. --create trigger DB.DBA.RDF_QUAD_O_AUDIT before insert on DB.DBA.RDF_QUAD
  64. --{
  65. -- if (not rdf_box_is_storeable (O))
  66. -- signal ('RDFXX', 'non-storeable O');
  67. --}
  68. --;
  69. create table DB.DBA.RDF_OBJ (
  70. RO_ID bigint primary key,
  71. RO_VAL varchar not null,
  72. RO_LONG long varchar,
  73. RO_FLAGS smallint not null default 0,
  74. RO_DT_AND_LANG integer not null default 16843009 compress any
  75. )
  76. alter index RDF_OBJ on RDF_OBJ partition (RO_ID int (0hexffff00))
  77. create index RO_VAL on DB.DBA.RDF_OBJ (RO_VAL, RO_DT_AND_LANG)
  78. partition (RO_VAL varchar (-4, 0hexffff))
  79. ;
  80. create table DB.DBA.RO_START (RS_START varchar, RS_DT_AND_LANG int, RS_RO_ID any,
  81. primary key (RS_START, RS_DT_AND_LANG, RS_RO_ID))
  82. alter index RO_START on DB.DBA.RO_START partition (RS_RO_ID varchar (-1, 0hexffff))
  83. ;
  84. --create table DB.DBA.RDF_FT (
  85. -- RF_ID bigint primary key,
  86. -- RF_O any)
  87. --alter index RDF_FT on RDF_FT partition (RF_ID int (0hexffff00))
  88. --create index RF_O on RDF_FT (RF_O) partition (RF_O varchar (-1, 0hexffff))
  89. --;
  90. create table DB.DBA.RDF_DATATYPE (
  91. RDT_IID IRI_ID_8 not null primary key,
  92. RDT_TWOBYTE integer not null unique,
  93. RDT_QNAME varchar not null unique )
  94. alter index RDF_DATATYPE on RDF_DATATYPE partition cluster replicated
  95. alter index DB_DBA_RDF_DATATYPE_UNQC_RDT_TWOBYTE on RDF_DATATYPE partition cluster replicated
  96. alter index DB_DBA_RDF_DATATYPE_UNQC_RDT_QNAME on RDF_DATATYPE partition cluster replicated
  97. ;
  98. create table DB.DBA.RDF_LANGUAGE (
  99. RL_ID varchar not null primary key,
  100. RL_TWOBYTE integer not null unique )
  101. alter index RDF_LANGUAGE on RDF_LANGUAGE partition cluster replicated
  102. alter index DB_DBA_RDF_LANGUAGE_UNQC_RL_TWOBYTE on RDF_LANGUAGE partition cluster replicated
  103. ;
  104. create table DB.DBA.SYS_SPARQL_HOST (
  105. SH_HOST varchar not null primary key,
  106. SH_GRAPH_URI varchar,
  107. SH_USER_URI varchar,
  108. SH_BASE_URI varchar,
  109. SH_DEFINES long varchar
  110. )
  111. ;
  112. alter table DB.DBA.SYS_SPARQL_HOST add SH_BASE_URI varchar
  113. ;
  114. create table DB.DBA.RDF_OBJ_FT_RULES (
  115. ROFR_G varchar not null,
  116. ROFR_P varchar not null,
  117. ROFR_REASON varchar not null,
  118. primary key (ROFR_G, ROFR_P, ROFR_REASON) )
  119. alter index RDF_OBJ_FT_RULES on RDF_OBJ_FT_RULES partition cluster replicated
  120. ;
  121. create table DB.DBA.SYS_SPARQL_SW_LOG (
  122. PL_SERVER varchar,
  123. PL_URI varchar,
  124. PL_TS timestamp,
  125. PL_RC varchar,
  126. PL_MSG long varchar,
  127. primary key (PL_SERVER, PL_URI, PL_TS))
  128. ;
  129. create table DB.DBA.SYS_XML_PERSISTENT_NS_DECL
  130. (
  131. NS_PREFIX varchar not null primary key,
  132. NS_URL varchar not null
  133. )
  134. alter index SYS_XML_PERSISTENT_NS_DECL on SYS_XML_PERSISTENT_NS_DECL partition cluster replicated
  135. ;
  136. create table DB.DBA.RDF_EXPLICITLY_CREATED_GRAPH
  137. (
  138. REC_GRAPH_IID IRI_ID not null primary key
  139. )
  140. alter index RDF_EXPLICITLY_CREATED_GRAPH on RDF_EXPLICITLY_CREATED_GRAPH partition cluster replicated
  141. ;
  142. create table RDF_GEO (X real no compress, Y real no compress,X2 real no compress, Y2 real no compress, ID bigint no compress, primary key (X, Y, X2, Y2, ID))
  143. alter index RDF_GEO on RDF_GEO partition (ID int (0hexffff00))
  144. ;
  145. create table DB.DBA.RDF_LABEL (RL_O any primary key, RL_RO_ID bigint, RL_TEXT varchar, RL_LANG int)
  146. alter index RDF_LABEL on RDF_LABEL partition (RL_O varchar (-1, 0hexffff))
  147. create index RDF_LABEL_TEXT on RDF_LABEL (RL_TEXT, RL_O) partition (RL_TEXT varchar (6, 0hexffff))
  148. ;
  149. create table DB.DBA.RDF_QUAD_DELETE_QUEUE (
  150. EVENT_ID bigint not null,
  151. RULE_ID bigint not null,
  152. QG IRI_ID not null,
  153. QS IRI_ID not null,
  154. QP IRI_ID not null,
  155. QO any not null,
  156. primary key (EVENT_ID, RULE_ID, QG, QS, QP, QO)
  157. )
  158. ;
  159. create table DB.DBA.SYS_IDONLY_EMPTY
  160. (
  161. ID integer not null primary key
  162. )
  163. ;
  164. create table DB.DBA.SYS_IDONLY_ONE
  165. (
  166. ID integer not null primary key
  167. )
  168. ;
  169. insert soft DB.DBA.SYS_IDONLY_ONE (ID) values (0)
  170. ;
  171. sequence_set ('RDF_URL_IID_NAMED', 1000000, 1)
  172. ;
  173. sequence_set ('RDF_PREF_SEQ', 1, 1)
  174. ;
  175. sequence_set ('RDF_URL_IID_BLANK', iri_id_num (min_bnode_iri_id ()), 1)
  176. ;
  177. sequence_set ('RDF_URL_IID_NAMED_BLANK', iri_id_num (min_named_bnode_iri_id ()), 1)
  178. ;
  179. sequence_set ('RDF_RO_ID', 1, 1)
  180. ;
  181. sequence_set ('RDF_DATATYPE_TWOBYTE', 258, 1)
  182. ;
  183. sequence_set ('RDF_LANGUAGE_TWOBYTE', 258, 1)
  184. ;
  185. create procedure RDF_QUAD_FT_INIT ()
  186. {
  187. if (not exists (select 1 from SYS_VT_INDEX where VI_COL = 'o'))
  188. {
  189. insert soft SYS_VT_INDEX (VI_TABLE, VI_INDEX, VI_COL, VI_ID_COL, VI_INDEX_TABLE, VI_ID_IS_PK, VI_OPTIONS)
  190. values ('DB.DBA.RDF_QUAD', 'RDF_QUAD_OP', 'O', 'O', 'DB.DBA.RDF_GEO', 1, 'GR');
  191. insert soft SYS_VT_INDEX (VI_TABLE, VI_INDEX, VI_COL, VI_ID_COL, VI_INDEX_TABLE, VI_ID_IS_PK, VI_OPTIONS)
  192. values ('DB.DBA.RDF_QUAD', 'RDF_QUAD_OP', 'o', 'O', 'DB.DBA.RDF_OBJ_RO_FLAGS_WORDS', 1, null);
  193. __ddl_changed ('DB.DBA.RDF_QUAD');
  194. }
  195. }
  196. ;
  197. create procedure DB.DBA.RDF_OBJ_RO_FLAGS_INDEX_HOOK (inout vtb any, inout d_id any)
  198. {
  199. if (cl_current_slice () = 0hexffff)
  200. {
  201. for (select RO_LONG, RO_VAL, RO_FLAGS
  202. from DB.DBA.RDF_OBJ where RO_ID=d_id and bit_and (RO_FLAGS, 1)) do
  203. {
  204. if (bit_and (RO_FLAGS, 2))
  205. vt_batch_feed (vtb, xml_tree_doc (__xml_deserialize_packed (RO_LONG)), 0);
  206. else
  207. vt_batch_feed (vtb, coalesce (RO_LONG, RO_VAL), 0);
  208. }
  209. }
  210. else
  211. {
  212. for (select RO_LONG, RO_VAL, RO_FLAGS
  213. from DB.DBA.RDF_OBJ table option (no cluster) where RO_ID=d_id and bit_and (RO_FLAGS, 1)) do
  214. {
  215. if (bit_and (RO_FLAGS, 2))
  216. vt_batch_feed (vtb, xml_tree_doc (__xml_deserialize_packed (RO_LONG)), 0);
  217. else
  218. vt_batch_feed (vtb, coalesce (RO_LONG, RO_VAL), 0);
  219. }
  220. }
  221. return 1;
  222. }
  223. ;
  224. create procedure DB.DBA.RDF_OBJ_RO_FLAGS_UNINDEX_HOOK (inout vtb any, inout d_id any)
  225. {
  226. if (cl_current_slice () = 0hexffff)
  227. {
  228. for (select RO_LONG, RO_VAL, RO_FLAGS
  229. from DB.DBA.RDF_OBJ where RO_ID=d_id and bit_and (RO_FLAGS, 1)) do
  230. {
  231. if (bit_and (RO_FLAGS, 2))
  232. vt_batch_feed (vtb, xml_tree_doc (__xml_deserialize_packed (RO_LONG)), 1);
  233. else
  234. vt_batch_feed (vtb, coalesce (RO_LONG, RO_VAL), 1);
  235. }
  236. }
  237. else
  238. {
  239. for (select RO_LONG, RO_VAL, RO_FLAGS
  240. from DB.DBA.RDF_OBJ table option (no cluster) where RO_ID=d_id and bit_and (RO_FLAGS, 1)) do
  241. {
  242. if (bit_and (RO_FLAGS, 2))
  243. vt_batch_feed (vtb, xml_tree_doc (__xml_deserialize_packed (RO_LONG)), 1);
  244. else
  245. vt_batch_feed (vtb, coalesce (RO_LONG, RO_VAL), 1);
  246. }
  247. }
  248. return 1;
  249. }
  250. ;
  251. create procedure sparql_exec_quiet (in expn varchar)
  252. {
  253. declare sta, msg varchar;
  254. exec (expn, sta, msg);
  255. }
  256. ;
  257. sparql_exec_quiet ('DB.DBA.vt_create_text_index (
  258. fix_identifier_case (''DB.DBA.RDF_OBJ''),
  259. fix_identifier_case (''RO_FLAGS''),
  260. fix_identifier_case (''RO_ID''),
  261. 0, 0, vector (), 1, ''*ini*'', ''UTF-8-QR'')')
  262. ;
  263. sparql_exec_quiet ('DB.DBA.vt_batch_update (fix_identifier_case (''DB.DBA.RDF_OBJ''), ''ON'', 1)')
  264. ;
  265. --sparql_exec_quiet ('alter index VTLOG_DB_DBA_RDF_OBJ on VTLOG_DB_DBA_RDF_OBJ partition (VTLOG_RO_ID int (0hexffff00))')
  266. --;
  267. --!AWK PUBLIC
  268. create function DB.DBA.XML_SET_NS_DECL (in prefix varchar, in url varchar, in persist integer := 1) returns integer
  269. {
  270. declare res integer;
  271. res := __xml_set_ns_decl (prefix, url, persist);
  272. if (bit_and (res, 2))
  273. {
  274. declare exit handler for sqlstate '*' { __xml_remove_ns_by_prefix (prefix, persist); resignal; };
  275. if (exists (select 1 from DB.DBA.SYS_XML_PERSISTENT_NS_DECL where NS_PREFIX = prefix and NS_URL = url))
  276. return;
  277. delete from DB.DBA.SYS_XML_PERSISTENT_NS_DECL where NS_PREFIX = prefix;
  278. insert into DB.DBA.SYS_XML_PERSISTENT_NS_DECL (NS_PREFIX, NS_URL) values (prefix, url);
  279. commit work;
  280. }
  281. return res;
  282. }
  283. ;
  284. --!AWK PUBLIC
  285. create procedure DB.DBA.XML_REMOVE_NS_BY_PREFIX (in prefix varchar, in persist integer := 1)
  286. {
  287. declare res integer;
  288. __xml_remove_ns_by_prefix (prefix, persist);
  289. if (bit_and (persist, 2))
  290. {
  291. whenever sqlstate '*' goto again;
  292. again:
  293. delete from DB.DBA.SYS_XML_PERSISTENT_NS_DECL where NS_PREFIX=prefix;
  294. commit work;
  295. }
  296. }
  297. ;
  298. --!AWK PUBLIC
  299. create procedure DB.DBA.XML_CLEAR_ALL_NS_DECLS (in persist integer := 1)
  300. {
  301. declare res integer;
  302. __xml_clear_all_ns_decls (persist);
  303. if (bit_and (persist, 2))
  304. {
  305. whenever sqlstate '*' goto again;
  306. again:
  307. delete from DB.DBA.SYS_XML_PERSISTENT_NS_DECL;
  308. commit work;
  309. }
  310. }
  311. ;
  312. --!AWK PUBLIC
  313. create procedure DB.DBA.XML_SELECT_ALL_NS_DECLS (in persist integer := 3)
  314. {
  315. declare decls any;
  316. declare ctr, len integer;
  317. declare PREFIX, URI varchar;
  318. decls := __xml_get_all_ns_decls (persist);
  319. result_names (PREFIX, URI);
  320. len := length (decls);
  321. for (ctr := 0; ctr < len; ctr := ctr + 2)
  322. result (decls[ctr], decls[ctr+1]);
  323. }
  324. ;
  325. create procedure DB.DBA.XML_LOAD_ALL_NS_DECLS ()
  326. {
  327. for (select NS_PREFIX, NS_URL from DB.DBA.SYS_XML_PERSISTENT_NS_DECL) do
  328. {
  329. __xml_set_ns_decl (NS_PREFIX, NS_URL, 2);
  330. }
  331. DB.DBA.XML_SET_NS_DECL ( 'bif' , 'bif:' , 2);
  332. DB.DBA.XML_SET_NS_DECL ( 'dawgt' , 'http://www.w3.org/2001/sw/DataAccess/tests/test-dawg#' , 2);
  333. DB.DBA.XML_SET_NS_DECL ( 'dbpedia' , 'http://dbpedia.org/resource/' , 2);
  334. DB.DBA.XML_SET_NS_DECL ( 'dbpprop' , 'http://dbpedia.org/property/' , 2);
  335. DB.DBA.XML_SET_NS_DECL ( 'dc' , 'http://purl.org/dc/elements/1.1/' , 2);
  336. DB.DBA.XML_SET_NS_DECL ( 'go' , 'http://purl.org/obo/owl/GO#' , 2);
  337. DB.DBA.XML_SET_NS_DECL ( 'geo' , 'http://www.w3.org/2003/01/geo/wgs84_pos#' , 2);
  338. DB.DBA.XML_SET_NS_DECL ( 'fn' , 'http://www.w3.org/2005/xpath-functions/#' , 2);
  339. DB.DBA.XML_SET_NS_DECL ( 'foaf' , 'http://xmlns.com/foaf/0.1/' , 2);
  340. DB.DBA.XML_SET_NS_DECL ( 'obo' , 'http://www.geneontology.org/formats/oboInOwl#' , 2);
  341. DB.DBA.XML_SET_NS_DECL ( 'ogc' , 'http://www.opengis.net/' , 2);
  342. DB.DBA.XML_SET_NS_DECL ( 'ogcgml' , 'http://www.opengis.net/ont/gml#' , 2);
  343. DB.DBA.XML_SET_NS_DECL ( 'ogcgs' , 'http://www.opengis.net/ont/geosparql#' , 2);
  344. DB.DBA.XML_SET_NS_DECL ( 'ogcgsf' , 'http://www.opengis.net/def/function/geosparql/' , 2);
  345. DB.DBA.XML_SET_NS_DECL ( 'ogcgsr' , 'http://www.opengis.net/def/rule/geosparql/' , 2);
  346. DB.DBA.XML_SET_NS_DECL ( 'ogcsf' , 'http://www.opengis.net/ont/sf#' , 2);
  347. DB.DBA.XML_SET_NS_DECL ( 'owl' , 'http://www.w3.org/2002/07/owl#' , 2);
  348. DB.DBA.XML_SET_NS_DECL ( 'mesh' , 'http://purl.org/commons/record/mesh/' , 2);
  349. DB.DBA.XML_SET_NS_DECL ( 'math' , 'http://www.w3.org/2000/10/swap/math#' , 2);
  350. DB.DBA.XML_SET_NS_DECL ( 'mf' , 'http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#' , 2);
  351. DB.DBA.XML_SET_NS_DECL ( 'nci' , 'http://ncicb.nci.nih.gov/xml/owl/EVS/Thesaurus.owl#' , 2);
  352. DB.DBA.XML_SET_NS_DECL ( 'product' , 'http://www.buy.com/rss/module/productV2/' , 2);
  353. DB.DBA.XML_SET_NS_DECL ( 'protseq' , 'http://purl.org/science/protein/bysequence/' , 2);
  354. DB.DBA.XML_SET_NS_DECL ( 'rdf' , 'http://www.w3.org/1999/02/22-rdf-syntax-ns#' , 2);
  355. DB.DBA.XML_SET_NS_DECL ( 'rdfa' , 'http://www.w3.org/ns/rdfa#' , 2);
  356. DB.DBA.XML_SET_NS_DECL ( 'rdfdf' , 'http://www.openlinksw.com/virtrdf-data-formats#' , 2);
  357. DB.DBA.XML_SET_NS_DECL ( 'rdfs' , 'http://www.w3.org/2000/01/rdf-schema#' , 2);
  358. DB.DBA.XML_SET_NS_DECL ( 'sc' , 'http://purl.org/science/owl/sciencecommons/' , 2);
  359. DB.DBA.XML_SET_NS_DECL ( 'sd' , 'http://www.w3.org/ns/sparql-service-description#' , 2);
  360. DB.DBA.XML_SET_NS_DECL ( 'sioc' , 'http://rdfs.org/sioc/ns#' , 2);
  361. DB.DBA.XML_SET_NS_DECL ( 'skos' , 'http://www.w3.org/2004/02/skos/core#' , 2);
  362. DB.DBA.XML_SET_NS_DECL ( 'sql' , 'sql:' , 2);
  363. DB.DBA.XML_SET_NS_DECL ( 'vcard' , 'http://www.w3.org/2001/vcard-rdf/3.0#' , 2);
  364. DB.DBA.XML_SET_NS_DECL ( 'vcard2006' , 'http://www.w3.org/2006/vcard/ns#' , 2);
  365. DB.DBA.XML_SET_NS_DECL ( 'virtrdf' , 'http://www.openlinksw.com/schemas/virtrdf#' , 2);
  366. DB.DBA.XML_SET_NS_DECL ( 'virtcxml' , 'http://www.openlinksw.com/schemas/virtcxml#' , 2);
  367. DB.DBA.XML_SET_NS_DECL ( 'void' , 'http://rdfs.org/ns/void#' , 2);
  368. DB.DBA.XML_SET_NS_DECL ( 'xf' , 'http://www.w3.org/2004/07/xpath-functions' , 2);
  369. DB.DBA.XML_SET_NS_DECL ( 'xml' , 'http://www.w3.org/XML/1998/namespace' , 2);
  370. DB.DBA.XML_SET_NS_DECL ( 'xsd' , 'http://www.w3.org/2001/XMLSchema#' , 2);
  371. DB.DBA.XML_SET_NS_DECL ( 'xsl10' , 'http://www.w3.org/XSL/Transform/1.0' , 2);
  372. DB.DBA.XML_SET_NS_DECL ( 'xsl1999' , 'http://www.w3.org/1999/XSL/Transform' , 2);
  373. DB.DBA.XML_SET_NS_DECL ( 'xslwd' , 'http://www.w3.org/TR/WD-xsl' , 2);
  374. DB.DBA.XML_SET_NS_DECL ( 'yago' , 'http://dbpedia.org/class/yago/' , 2);
  375. }
  376. ;
  377. DB.DBA.XML_LOAD_ALL_NS_DECLS ()
  378. ;
  379. rdf_inf_const_init ()
  380. ;
  381. create procedure DB.DBA.RDF_LOAD_ALL_FT_RULES ()
  382. {
  383. whenever sqlstate '*' goto again;
  384. again:
  385. for (select ROFR_G as rule_g, ROFR_P as rule_p, ROFR_REASON as reason from DB.DBA.RDF_OBJ_FT_RULES) do
  386. {
  387. declare rule_g_iid, rule_p_iid IRI_ID;
  388. rule_g_iid := case (rule_g) when '' then null else iri_to_id (rule_g) end;
  389. rule_p_iid := case (rule_p) when '' then null else iri_to_id (rule_p) end;
  390. -- dbg_obj_princ ('__rdf_obj_ft_rule_add (', rule_g_iid, rule_p_iid, reason, ')');
  391. __rdf_obj_ft_rule_add (rule_g_iid, rule_p_iid, reason);
  392. }
  393. }
  394. ;
  395. DB.DBA.RDF_LOAD_ALL_FT_RULES ()
  396. ;
  397. create procedure DB.DBA.RDF_REPL_START (in quiet integer := 0)
  398. {
  399. if (repl_this_server () is null)
  400. return;
  401. if (isstring (registry_get ('DB.DBA.RDF_REPL')))
  402. {
  403. if (quiet)
  404. return;
  405. signal ('RDF99', 'RDF replication is already enabled');
  406. }
  407. for (select RGGM_MEMBER_IID from DB.DBA.RDF_GRAPH_GROUP_MEMBER
  408. where RGGM_GROUP_IID = iri_to_id (UNAME'http://www.openlinksw.com/schemas/virtrdf#rdf_repl_graph_group')
  409. and not __rgs_ack_cbk (RGGM_MEMBER_IID, __rdf_repl_uid(), 1) ) do
  410. {
  411. signal ('RDF99', 'RDF replication can not be enabled because it will violate security rules for read access to graph <' || id_to_iri(RGGM_MEMBER_IID) || '> by __rdf_repl account');
  412. }
  413. repl_publish ('__rdf_repl', '__rdf_repl.log');
  414. repl_text ('__rdf_repl', '__rdf_repl_flush_queue()');
  415. DB.DBA.RDF_GRAPH_GROUP_CREATE (UNAME'http://www.openlinksw.com/schemas/virtrdf#rdf_repl_graph_group', 1);
  416. DB.DBA.CL_EXEC ('registry_set (?,?)', vector ('DB.DBA.RDF_REPL', cast (now() as varchar)));
  417. exec ('checkpoint');
  418. }
  419. ;
  420. create procedure DB.DBA.RDF_REPL_STOP (in quiet integer := 0)
  421. {
  422. if (not isstring (registry_get ('DB.DBA.RDF_REPL')))
  423. {
  424. if (quiet)
  425. return;
  426. signal ('RDF99', 'RDF replication is not enabled');
  427. }
  428. repl_unpublish ('__rdf_repl');
  429. DB.DBA.CL_EXEC ('registry_remove (?)', vector ('DB.DBA.RDF_REPL'));
  430. }
  431. ;
  432. create procedure DB.DBA.RDF_REPL_GRAPH_INS (in memb_iri varchar)
  433. {
  434. declare memb_iid IRI_ID;
  435. memb_iid := iri_to_id (memb_iri);
  436. memb_iri := id_to_iri (memb_iid);
  437. DB.DBA.RDF_GRAPH_GROUP_INS (UNAME'http://www.openlinksw.com/schemas/virtrdf#rdf_repl_graph_group', memb_iri);
  438. }
  439. ;
  440. create procedure DB.DBA.RDF_REPL_GRAPH_DEL (in memb_iri varchar)
  441. {
  442. declare memb_iid IRI_ID;
  443. DB.DBA.RDF_GRAPH_GROUP_DEL (UNAME'http://www.openlinksw.com/schemas/virtrdf#rdf_repl_graph_group', memb_iri);
  444. }
  445. ;
  446. create procedure DB.DBA.RDF_REPL_SYNC (in publisher varchar, in u varchar, in pwd varchar)
  447. {
  448. declare lvl, stat integer;
  449. if (repl_this_server () is null)
  450. return;
  451. commit work;
  452. retr:
  453. repl_sync (publisher, '__rdf_repl', u, pwd);
  454. again:
  455. repl_status (publisher, '__rdf_repl', lvl, stat);
  456. if (0 = stat)
  457. {
  458. __rdf_repl_flush_queue();
  459. return;
  460. }
  461. if (1 = stat)
  462. {
  463. delay (0.1);
  464. goto again;
  465. }
  466. if (2 = stat)
  467. {
  468. __rdf_repl_flush_queue();
  469. return;
  470. }
  471. goto retr;
  472. }
  473. ;
  474. create procedure DB.DBA.RDF_REPL_INSERT_TRIPLES (in graph_iri varchar, inout triples any)
  475. {
  476. declare ctr integer;
  477. for (ctr := length (triples) - 1; ctr >= 0; ctr := ctr - 1)
  478. {
  479. declare s_iri, p_iri, o_val, o_type, o_lang any;
  480. s_iri := iri_canonicalize (triples[ctr][0]);
  481. p_iri := iri_canonicalize (triples[ctr][1]);
  482. o_val := triples[ctr][2];
  483. if (isiri_id (o_val))
  484. __rdf_repl_quad (84, graph_iri, s_iri, p_iri, iri_canonicalize (o_val));
  485. else if (__tag of rdf_box <> __tag (o_val))
  486. __rdf_repl_quad (80, graph_iri, s_iri, p_iri, o_val);
  487. else
  488. {
  489. declare dt_twobyte, lang_twobyte integer;
  490. dt_twobyte := rdf_box_type (o_val);
  491. lang_twobyte := rdf_box_lang (o_val);
  492. if (257 <> dt_twobyte)
  493. __rdf_repl_quad (81, graph_iri, s_iri, p_iri, rdf_box_data (o_val), (select RDT_QNAME from DB.DBA.RDF_DATATYPE where RDT_TWOBYTE = dt_twobyte), NULL);
  494. else if (257 <> lang_twobyte)
  495. __rdf_repl_quad (82, graph_iri, s_iri, p_iri, rdf_box_data (o_val), NULL, (select RL_ID from DB.DBA.RDF_LANGUAGE where RL_TWOBYTE = lang_twobyte));
  496. else
  497. __rdf_repl_quad (80, graph_iri, s_iri, p_iri, rdf_box_data (o_val));
  498. }
  499. }
  500. }
  501. ;
  502. create procedure DB.DBA.RDF_REPL_DELETE_TRIPLES (in graph_iri varchar, inout triples any)
  503. {
  504. declare ctr integer;
  505. for (ctr := length (triples) - 1; ctr >= 0; ctr := ctr - 1)
  506. {
  507. declare s_iri, p_iri, o_val, o_type, o_lang any;
  508. s_iri := iri_canonicalize (triples[ctr][0]);
  509. p_iri := iri_canonicalize (triples[ctr][1]);
  510. o_val := triples[ctr][2];
  511. if (isiri_id (o_val))
  512. __rdf_repl_quad (164, graph_iri, s_iri, p_iri, iri_canonicalize (o_val));
  513. else if (__tag of rdf_box <> __tag (o_val))
  514. __rdf_repl_quad (160, graph_iri, s_iri, p_iri, o_val);
  515. else
  516. {
  517. declare dt_twobyte, lang_twobyte integer;
  518. dt_twobyte := rdf_box_type (o_val);
  519. lang_twobyte := rdf_box_lang (o_val);
  520. if (257 <> dt_twobyte)
  521. __rdf_repl_quad (161, graph_iri, s_iri, p_iri, rdf_box_data (o_val), (select RDT_QNAME from DB.DBA.RDF_DATATYPE where RDT_TWOBYTE = dt_twobyte), NULL);
  522. else if (257 <> lang_twobyte)
  523. __rdf_repl_quad (162, graph_iri, s_iri, p_iri, rdf_box_data (o_val), NULL, (select RL_ID from DB.DBA.RDF_LANGUAGE where RL_TWOBYTE = lang_twobyte));
  524. else
  525. __rdf_repl_quad (160, graph_iri, s_iri, p_iri, rdf_box_data (o_val));
  526. }
  527. }
  528. }
  529. ;
  530. --!AFTER
  531. create procedure DB.DBA.RDF_GLOBAL_RESET (in hard integer := 0)
  532. {
  533. if (isstring (registry_get ('DB.DBA.RDF_REPL')))
  534. {
  535. signal ('42RDF', 'Can not make DB.DBA.RDF_GLOBAL_RESET while an RDF replication is enabled');
  536. }
  537. -- checkpoint;
  538. __atomic (1);
  539. iri_id_cache_flush ();
  540. __rdf_obj_ft_rule_zap_all ();
  541. dict_zap (__rdf_graph_group_dict(), 2);
  542. dict_zap (__rdf_graph_group_of_privates_dict(), 2);
  543. dict_zap (__rdf_graph_default_perms_of_user_dict(0), 2);
  544. dict_zap (__rdf_graph_default_perms_of_user_dict(1), 2);
  545. dict_zap (__rdf_graph_public_perms_dict(), 2);
  546. for select RS_NAME from DB.DBA.SYS_RDF_SCHEMA do
  547. rdf_inf_clear (RS_NAME);
  548. delete from sys_rdf_schema;
  549. delete from DB.DBA.RDF_QUAD;
  550. delete from DB.DBA.RDF_OBJ_FT_RULES;
  551. delete from DB.DBA.RDF_GRAPH_GROUP;
  552. for (select __id2i(t.RGU_GRAPH_IID) as graph_iri from (select distinct RGU_GRAPH_IID from DB.DBA.RDF_GRAPH_USER) as t) do
  553. {
  554. if (graph_iri is not null)
  555. {
  556. jso_mark_affected (graph_iri);
  557. log_text ('jso_mark_affected (?)', graph_iri);
  558. jso_mark_affected (iri_canonicalize (graph_iri));
  559. log_text ('jso_mark_affected (?)', iri_canonicalize (graph_iri));
  560. log_text ('jso_mark_affected (iri_canonicalize (?))', graph_iri);
  561. }
  562. }
  563. for (select __id2i(t.RGGM_GROUP_IID) as group_iri from (select distinct RGGM_GROUP_IID from DB.DBA.RDF_GRAPH_GROUP_MEMBER) as t) do
  564. {
  565. if (group_iri is not null)
  566. {
  567. jso_mark_affected (group_iri);
  568. log_text ('jso_mark_affected (?)', group_iri);
  569. }
  570. }
  571. for (select __id2i(RGGM_MEMBER_IID) as memb_iri from DB.DBA.RDF_GRAPH_GROUP_MEMBER where RGGM_GROUP_IID = __i2id ('http://www.openlinksw.com/schemas/virtrdf#PrivateGraphs')) do
  572. {
  573. if (memb_iri is not null)
  574. {
  575. jso_mark_affected (memb_iri);
  576. log_text ('jso_mark_affected (?)', memb_iri);
  577. }
  578. }
  579. for (sparql define input:storage "" select distinct str (?qms) as ?qms_iri from virtrdf: where { ?qms a virtrdf:QuadStorage } ) do
  580. {
  581. if ("qms_iri" is not null)
  582. {
  583. jso_mark_affected ("qms_iri");
  584. log_text ('jso_mark_affected (?)', "qms_iri");
  585. }
  586. }
  587. jso_mark_affected ('http://www.openlinksw.com/schemas/virtrdf#PrivateGraphs');
  588. log_text ('jso_mark_affected (?)', 'http://www.openlinksw.com/schemas/virtrdf#PrivateGraphs');
  589. jso_mark_affected ('http://www.openlinksw.com/schemas/virtrdf#DefaultQuadStorage');
  590. log_text ('jso_mark_affected (?)', 'http://www.openlinksw.com/schemas/virtrdf#DefaultQuadStorage');
  591. jso_mark_affected ('http://www.openlinksw.com/schemas/virtrdf#DefaultQuadMap');
  592. log_text ('jso_mark_affected (?)', 'http://www.openlinksw.com/schemas/virtrdf#DefaultQuadMap');
  593. delete from DB.DBA.RDF_GRAPH_GROUP_MEMBER;
  594. delete from DB.DBA.RDF_GRAPH_USER;
  595. delete from DB.DBA.RDF_LABEL;
  596. delete from DB.DBA.RDF_GEO;
  597. commit work;
  598. if (hard)
  599. {
  600. --delete from DB.DBA.RDF_URL;
  601. delete from DB.DBA.RDF_IRI;
  602. delete from DB.DBA.RDF_PREFIX;
  603. delete from DB.DBA.RDF_OBJ;
  604. delete from DB.DBA.RO_START;
  605. delete from DB.DBA.RDF_DATATYPE;
  606. delete from DB.DBA.RDF_LANGUAGE;
  607. --__rdf_twobyte_cache_zap();
  608. --log_text ('__rdf_twobyte_cache_zap()');
  609. delete from DB.DBA.VTLOG_DB_DBA_RDF_OBJ;
  610. delete from DB.DBA.RDF_OBJ_RO_FLAGS_WORDS;
  611. sequence_set ('RDF_URL_IID_NAMED', 1000000, 0);
  612. sequence_set ('RDF_URL_IID_BLANK', iri_id_num (min_bnode_iri_id ()), 0);
  613. sequence_set ('RDF_URL_IID_NAMED_BLANK', iri_id_num (min_named_bnode_iri_id ()), 0);
  614. sequence_set ('RDF_PREF_SEQ', 1, 0);
  615. sequence_set ('RDF_RO_ID', 1, 0);
  616. sequence_set ('RDF_DATATYPE_TWOBYTE', 258, 0);
  617. sequence_set ('RDF_LANGUAGE_TWOBYTE', 258, 0);
  618. __atomic (0);
  619. exec ('checkpoint');
  620. raw_exit ();
  621. }
  622. sequence_set ('RDF_URL_IID_NAMED', 1000000, 1);
  623. sequence_set ('RDF_URL_IID_BLANK', iri_id_num (min_bnode_iri_id ()), 1);
  624. sequence_set ('RDF_URL_IID_NAMED_BLANK', iri_id_num (min_named_bnode_iri_id ()), 1);
  625. sequence_set ('RDF_PREF_SEQ', 1, 1);
  626. sequence_set ('RDF_RO_ID', 1, 1);
  627. sequence_set ('RDF_DATATYPE_TWOBYTE', 258, 1);
  628. sequence_set ('RDF_LANGUAGE_TWOBYTE', 258, 1);
  629. DB.DBA.RDF_LOAD_ALL_FT_RULES ();
  630. DB.DBA.TTLP (
  631. cast ( DB.DBA.XML_URI_GET (
  632. 'http://www.openlinksw.com/sparql/virtrdf-data-formats.ttl', '' ) as varchar ),
  633. '', 'http://www.openlinksw.com/schemas/virtrdf#' );
  634. DB.DBA.TTLP ('
  635. @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
  636. @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
  637. @prefix owl: <http://www.w3.org/2002/07/owl#> .
  638. @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
  639. @prefix virtrdf: <http://www.openlinksw.com/schemas/virtrdf#> .
  640. @prefix rdfdf: <http://www.openlinksw.com/virtrdf-data-formats#> .
  641. @prefix atom: <http://atomowl.org/ontologies/atomrdf#> .
  642. virtrdf:DefaultQuadStorage
  643. rdf:type virtrdf:QuadStorage ;
  644. virtrdf:qsUserMaps virtrdf:DefaultQuadStorage-UserMaps ;
  645. virtrdf:qsDefaultMap virtrdf:DefaultQuadMap ;
  646. virtrdf:qsMatchingFlags virtrdf:SPART_QS_NO_IMPLICIT_USER_QM .
  647. virtrdf:DefaultQuadStorage-UserMaps
  648. rdf:type virtrdf:array-of-QuadMap .
  649. virtrdf:DefaultServiceStorage
  650. rdf:type virtrdf:QuadStorage ;
  651. virtrdf:qsUserMaps virtrdf:DefaultServiceStorage-UserMaps ;
  652. virtrdf:qsDefaultMap virtrdf:DefaultServiceMap ;
  653. virtrdf:qsMatchingFlags virtrdf:SPART_QS_NO_IMPLICIT_USER_QM .
  654. virtrdf:DefaultServiceStorage-UserMaps
  655. rdf:type virtrdf:array-of-QuadMap .
  656. virtrdf:SyncToQuads
  657. rdf:type virtrdf:QuadStorage ;
  658. virtrdf:qsUserMaps virtrdf:SyncToQuads-UserMaps .
  659. virtrdf:SyncToQuads-UserMaps
  660. rdf:type virtrdf:array-of-QuadMap .
  661. ', '', 'http://www.openlinksw.com/schemas/virtrdf#' );
  662. delete from SYS_HTTP_SPONGE where HS_PARSER = 'DB.DBA.RDF_LOAD_HTTP_RESPONSE';
  663. commit work;
  664. sequence_set ('RDF_URL_IID_NAMED', 1010000, 1);
  665. sequence_set ('RDF_URL_IID_BLANK', iri_id_num (min_bnode_iri_id ()) + 10000, 1);
  666. sequence_set ('RDF_URL_IID_NAMED_BLANK', iri_id_num (min_named_bnode_iri_id ()) + 10000, 1);
  667. sequence_set ('RDF_PREF_SEQ', 101, 1);
  668. sequence_set ('RDF_RO_ID', 1001, 1);
  669. iri_id_cache_flush ();
  670. DB.DBA.SPARQL_RELOAD_QM_GRAPH ();
  671. __atomic (0);
  672. exec ('checkpoint');
  673. }
  674. ;
  675. -----
  676. -- Handling of IRI IDs
  677. create function DB.DBA.RDF_MAKE_IID_OF_QNAME (in qname varchar) returns IRI_ID
  678. {
  679. return iri_to_id (qname);
  680. }
  681. ;
  682. create function DB.DBA.RDF_MAKE_IID_OF_LONG (in qname any) returns IRI_ID -- DEPRECATED
  683. {
  684. if (isiri_id (qname))
  685. return qname;
  686. if (not isstring (qname))
  687. {
  688. if (__tag of rdf_box = __tag (qname) and rdf_box_is_complete (qname))
  689. qname := rdf_box_data (qname, 1);
  690. else
  691. qname := __rdf_strsqlval (qname);
  692. }
  693. return iri_to_id_nosignal (qname);
  694. }
  695. ;
  696. create function DB.DBA.RDF_MAKE_GRAPH_IIDS_OF_QNAMES (in qnames any) returns any
  697. {
  698. if (__tag of vector <> __tag (qnames))
  699. return vector ();
  700. declare res_acc any;
  701. vectorbld_init (res_acc);
  702. foreach (any qname in qnames) do
  703. {
  704. declare iid IRI_ID;
  705. whenever sqlstate '*' goto skip_acc;
  706. iid := iri_to_id (qname, 0, 0);
  707. if (not isinteger (iid))
  708. vectorbld_acc (res_acc, iid);
  709. skip_acc: ;
  710. }
  711. vectorbld_final (res_acc);
  712. return res_acc;
  713. }
  714. ;
  715. -----
  716. -- Datatypes and languages
  717. create function DB.DBA.RDF_TWOBYTE_OF_DATATYPE (in iid any) returns integer
  718. {
  719. declare res integer;
  720. declare qname varchar;
  721. if (iid is null)
  722. return 257;
  723. if (not isiri_id (iid))
  724. {
  725. declare new_iid IRI_ID;
  726. new_iid := iri_to_id (iid);
  727. if (new_iid is NULL or new_iid >= min_bnode_iri_id ())
  728. signal ('RDFXX', 'Invalid datatype IRI_ID passes as an argument to DB.DBA.RDF_TWOBYTE_OF_DATATYPE()');
  729. iid := new_iid;
  730. }
  731. qname := id_to_iri (iid);
  732. res := rdf_cache_id ('t', qname);
  733. if (res)
  734. return res;
  735. whenever not found goto mknew;
  736. set isolation='committed';
  737. select RDT_TWOBYTE into res from DB.DBA.RDF_DATATYPE where RDT_IID = iid;
  738. return res;
  739. mknew:
  740. set isolation='serializable';
  741. declare tb_cr cursor for select RDT_TWOBYTE from DB.DBA.RDF_DATATYPE where RDT_IID = iid;
  742. open tb_cr (exclusive);
  743. whenever not found goto mknew_ser;
  744. fetch tb_cr into res;
  745. return res;
  746. mknew_ser:
  747. res := sequence_next ('RDF_DATATYPE_TWOBYTE');
  748. if (0 = bit_and (res, 255))
  749. {
  750. if (res = 0hex7F00)
  751. {
  752. sequence_set ('RDF_DATATYPE_TWOBYTE', 0hex7F00, 0);
  753. res := 0hex7F01;
  754. qname := 'http://www.openlinksw.com/schemas/virtrdf#Unsaved';
  755. iid := iri_to_id (qname);
  756. insert soft DB.DBA.RDF_DATATYPE
  757. (RDT_IID, RDT_TWOBYTE, RDT_QNAME)
  758. values (iid, res, qname);
  759. goto cache_and_log;
  760. }
  761. res := sequence_next ('RDF_DATATYPE_TWOBYTE');
  762. }
  763. insert into DB.DBA.RDF_DATATYPE
  764. (RDT_IID, RDT_TWOBYTE, RDT_QNAME)
  765. values (iid, res, qname);
  766. cache_and_log:
  767. rdf_cache_id ('t', qname, res);
  768. log_text ('rdf_cache_id (\'t\', ?, ?)', qname, res); --'
  769. return res;
  770. }
  771. ;
  772. create function DB.DBA.RDF_PRESET_TWOBYTES_OF_DATATYPES ()
  773. {
  774. declare xsd_lnames any;
  775. xsd_lnames := vector (
  776. 'ENTITY',
  777. 'ENTITIES',
  778. 'ID',
  779. 'IDREF',
  780. 'IDREFS',
  781. 'NCName',
  782. 'Name',
  783. 'NMTOKEN',
  784. 'NMTOKENS',
  785. 'NOTATION',
  786. 'QName',
  787. 'any',
  788. 'anyAtomicType',
  789. 'anySimpleType',
  790. 'anyType',
  791. 'anyURI',
  792. 'base64Binary',
  793. 'boolean',
  794. 'byte',
  795. 'date',
  796. 'dateTime',
  797. 'dateTimeStamp',
  798. 'dayTimeDuration',
  799. 'decimal',
  800. 'double',
  801. 'duration',
  802. 'float',
  803. 'gDay',
  804. 'gMonth',
  805. 'gMonthDay',
  806. 'gYear',
  807. 'gYearMonth',
  808. 'hexBinary',
  809. 'int',
  810. 'integer',
  811. 'language',
  812. 'long',
  813. 'negativeInteger',
  814. 'nonNegativeInteger',
  815. 'nonPositiveInteger',
  816. 'normalizedString',
  817. 'positiveInteger',
  818. 'short',
  819. 'string',
  820. 'time',
  821. 'token',
  822. 'unsignedByte',
  823. 'unsignedInt',
  824. 'unsignedLong',
  825. 'unsignedShort',
  826. 'yearMonthDuration' );
  827. foreach (varchar n in xsd_lnames) do
  828. {
  829. __dbf_set ('rb_type__xsd:' || n, DB.DBA.RDF_TWOBYTE_OF_DATATYPE (iri_to_id ('http://www.w3.org/2001/XMLSchema#' || n)));
  830. }
  831. commit work;
  832. }
  833. ;
  834. DB.DBA.RDF_PRESET_TWOBYTES_OF_DATATYPES ()
  835. ;
  836. create function DB.DBA.RDF_TWOBYTE_OF_LANGUAGE (in id varchar) returns integer
  837. {
  838. declare res integer;
  839. if (id is null)
  840. return 257;
  841. id := lower (id);
  842. res := rdf_cache_id ('l', id);
  843. if (res)
  844. return res;
  845. whenever not found goto mknew;
  846. set isolation='committed';
  847. select RL_TWOBYTE into res from DB.DBA.RDF_LANGUAGE where RL_ID = id;
  848. return res;
  849. mknew:
  850. set isolation='serializable';
  851. declare tb_cr cursor for select RL_TWOBYTE from DB.DBA.RDF_LANGUAGE where RL_ID = id;
  852. open tb_cr (exclusive);
  853. whenever not found goto mknew_ser;
  854. fetch tb_cr into res;
  855. return res;
  856. mknew_ser:
  857. res := sequence_next ('RDF_LANGUAGE_TWOBYTE');
  858. if (0 = bit_and (res, 255))
  859. {
  860. if (res = 0hex7F00)
  861. {
  862. sequence_set ('RDF_LANGUAGE_TWOBYTE', 0hex7F00, 0);
  863. res := 0hex7F01;
  864. id := 'x-unsaved';
  865. insert soft DB.DBA.RDF_LANGUAGE (RL_ID, RL_TWOBYTE) values (id, res);
  866. goto cache_and_log;
  867. }
  868. res := sequence_next ('RDF_LANGUAGE_TWOBYTE');
  869. }
  870. insert into DB.DBA.RDF_LANGUAGE (RL_ID, RL_TWOBYTE) values (id, res);
  871. cache_and_log:
  872. rdf_cache_id ('l', id, res);
  873. log_text ('rdf_cache_id (\'l\', ?, ?)', id, res); --'
  874. return res;
  875. }
  876. ;
  877. -----
  878. -- Conversions from and to _table fields_ in short representation
  879. create function DB.DBA.RQ_LONG_OF_O (in o_col any) returns any -- DEPRECATED
  880. {
  881. return __rdf_long_of_obj (o_col);
  882. }
  883. ;
  884. create procedure DB.DBA.RDF_BOX_COMPLETE (inout o_col any) -- DEPRECATED
  885. {
  886. __rdf_box_make_complete (o_col);
  887. }
  888. ;
  889. create function DB.DBA.RQ_SQLVAL_OF_O (in o_col any) returns any -- DEPRECATED
  890. {
  891. return __rdf_sqlval_of_obj (o_col);
  892. }
  893. ;
  894. create function DB.DBA.RQ_BOOL_OF_O (in o_col any) returns any
  895. {
  896. declare t, len integer;
  897. if (isiri_id (o_col))
  898. return NULL;
  899. if (isinteger (o_col))
  900. {
  901. if (o_col)
  902. return 1;
  903. return 0;
  904. }
  905. if (__tag of rdf_box = __tag (o_col))
  906. {
  907. declare twobyte integer;
  908. declare dtqname any;
  909. if (__tag of varchar <> rdf_box_data_tag (o_col))
  910. {
  911. whenever sqlstate '*' goto retnull;
  912. return neq (rdf_box_data (o_col), 0.0);
  913. }
  914. twobyte := rdf_box_type (o_col);
  915. if (257 = twobyte)
  916. goto type_ok;
  917. whenever not found goto badtype;
  918. select RDT_QNAME into dtqname from DB.DBA.RDF_DATATYPE where RDT_TWOBYTE = twobyte;
  919. if (dtqname <> UNAME'http://www.w3.org/2001/XMLSchema#string')
  920. return null;
  921. type_ok:
  922. return case (length (rdf_box_data (o_col))) when 0 then 0 else 1 end;
  923. badtype:
  924. signal ('RDFXX', signal ('RDFXX', sprintf ('Unknown datatype in DB.DBA.RQ_BOOL_OF_O, bad type id %d, string value "%s"',
  925. twobyte, cast (rdf_box_data (o_col) as varchar) ) );
  926. }
  927. if (o_col is null)
  928. return null;
  929. whenever sqlstate '*' goto retnull;
  930. return neq (o_col, 0.0);
  931. retnull:
  932. return null;
  933. }
  934. ;
  935. create function DB.DBA.RQ_IID_OF_O (in shortobj any) returns IRI_ID -- DEPRECATED
  936. {
  937. return id_to_iri_nosignal (shortobj);
  938. }
  939. ;
  940. create function DB.DBA.RQ_O_IS_LIT (in shortobj any) returns integer -- DEPRECATED
  941. {
  942. if (isiri_id (shortobj))
  943. return 0;
  944. return 1;
  945. }
  946. ;
  947. -----
  948. -- Conversions from and to values in short representation that may be not field values (may perform more validation checks)
  949. create procedure RDF_G_INS (in id int, in g any)
  950. {
  951. geo_insert ('DB.DBA.RDF_GEO', g, id);
  952. }
  953. ;
  954. create procedure cl_rdf_geo_insert (in id int, inout g any)
  955. {
  956. declare daq any;
  957. daq := daq (1);
  958. daq_call (daq, 'DB.DBA.RDF_OBJ', 'RDF_OBJ', 'DB.DBA.RDF_G_INS', vector (id, g), 1);
  959. daq_results (daq);
  960. }
  961. ;
  962. create function rdf_geo_add (in v any)
  963. {
  964. declare id, h, ser, g any;
  965. if (rdf_box_ro_id (v))
  966. return v;
  967. g := rdf_box_data (v);
  968. if (not isgeometry (g))
  969. signal ('22023', 'RDFXX', 'Must be geometry box if to be stored as geo object');
  970. ser := serialize (g);
  971. if (length (ser) > 50)
  972. h := mdigest5 (ser);
  973. else
  974. {
  975. h := ser;
  976. ser := null;
  977. }
  978. set isolation = 'committed';
  979. id := (select ro_id, ro_val, ro_long from rdf_obj where ro_val = h and ro_dt_and_lang = 0hex1000101 and case when ro_long is not null then equ (blob_to_string (ro_long), ser) else 1 end );
  980. if (id is not null)
  981. {
  982. rdf_box_set_ro_id (v, id);
  983. return v;
  984. }
  985. set isolation = 'serializable';
  986. id := (select ro_id, ro_val, ro_long from rdf_obj where ro_val = h and ro_dt_and_lang = 0hex1000101 and case when ro_long is not null then equ (blob_to_string (ro_long), ser) else 1 end for update);
  987. if (id is not null)
  988. {
  989. rdf_box_set_ro_id (v, id);
  990. return v;
  991. }
  992. id := sequence_next ('RDF_RO_ID');
  993. set triggers off;
  994. -- dbg_obj_princ ('zero RO_FLAGS in sparql.sql:997 ', ro_val, ro_long);
  995. insert into rdf_obj (ro_id, ro_val, ro_long, ro_dt_and_lang)
  996. values (id, h, ser, 0hex1000101);
  997. if (1 = sys_stat ('cl_run_local_only'))
  998. geo_insert ('DB.DBA.RDF_GEO', g, id);
  999. else
  1000. cl_rdf_geo_insert (id, g);
  1001. rdf_box_set_ro_id (v, id);
  1002. return v;
  1003. }
  1004. ;
  1005. create function rdf_geo_set_id (inout v any)
  1006. {
  1007. declare id, h, ser, g any;
  1008. if (rdf_box_ro_id (v))
  1009. return v;
  1010. g := rdf_box_data (v);
  1011. if (not isgeometry (g))
  1012. signal ('22023', 'RDFXX', 'Must be geometry box if to be stored as geo object');
  1013. ser := serialize (g);
  1014. if (length (ser) > 50)
  1015. h := mdigest5 (ser);
  1016. else
  1017. {
  1018. h := ser;
  1019. ser := null;
  1020. }
  1021. set isolation = 'committed';
  1022. id := (select RO_ID from RDF_OBJ where RO_VAL = h and RO_DT_AND_LANG = 0hex1000101
  1023. and case when RO_LONG is not null then equ (blob_to_string (RO_LONG), ser) else 1 end );
  1024. if (id is not null)
  1025. {
  1026. rdf_box_set_ro_id (v, id);
  1027. return v;
  1028. }
  1029. return null;
  1030. }
  1031. ;
  1032. create function DB.DBA.RDF_OBJ_ADD (in dt_twobyte integeR, in v varchar, in lang_twobyte integeR, in ro_id_dict any := 0) returns varchar
  1033. {
  1034. declare llong, id, need_digest integer;
  1035. declare digest any;
  1036. declare old_flags, dt_and_lang integer;
  1037. -- dbg_obj_princ ('DB.DBA.RDF_OBJ_ADD (', dt_twobyte, v, lang_twobyte, case (isnull (ro_id_dict)) when 1 then '/*no_ft*/' else '/*want_ft*/' end,')');
  1038. if (isinteger (ro_id_dict))
  1039. {
  1040. if (__rdf_obj_ft_rule_check (null, null))
  1041. ro_id_dict := dict_new ();
  1042. else
  1043. ro_id_dict := null;
  1044. }
  1045. if (126 = __tag (v))
  1046. v := blob_to_string (v);
  1047. if (isstring (rdf_box_data (v)))
  1048. need_digest := rdf_box_needs_digest (v, ro_id_dict);
  1049. else if (__tag of XML = __tag (v))
  1050. need_digest := 1;
  1051. if (__tag of rdf_box = __tag (v))
  1052. {
  1053. if (256 = rdf_box_type (v))
  1054. return rdf_geo_add (v);
  1055. if (0 = need_digest)
  1056. return v;
  1057. if (1 = need_digest)
  1058. {
  1059. if (0 <> rdf_box_ro_id (v))
  1060. return v;
  1061. }
  1062. dt_twobyte := rdf_box_type (v);
  1063. lang_twobyte := rdf_box_lang (v);
  1064. v := __rdf_sqlval_of_obj (v, 1);
  1065. }
  1066. else
  1067. {
  1068. if (dt_twobyte <> 257 or lang_twobyte <> 257)
  1069. need_digest := 3;
  1070. else if (0 = need_digest)
  1071. return v;
  1072. if (dt_twobyte < 257)
  1073. signal ('RDFXX', sprintf ('Bad datatype code: DB.DBA.RDF_OBJ_ADD (%d, %s, %d)',
  1074. dt_twobyte, "LEFT" (cast (v as varchar), 100), lang_twobyte) );
  1075. if (lang_twobyte < 257)
  1076. signal ('RDFXX', sprintf ('Bad lang code: DB.DBA.RDF_OBJ_ADD (%d, %s, %d)',
  1077. dt_twobyte, "LEFT" (cast (v as varchar), 100), lang_twobyte) );
  1078. }
  1079. dt_and_lang := bit_or (bit_shift (dt_twobyte, 16), lang_twobyte);
  1080. if (not isstring (v))
  1081. {
  1082. declare sum64 varchar;
  1083. if (__tag of XML <> __tag (v))
  1084. signal ('RDFXX', sprintf ('Bad call: DB.DBA.RDF_OBJ_ADD (%d, %s, %d)',
  1085. dt_twobyte, "LEFT" (cast (v as varchar), 100), lang_twobyte) );
  1086. sum64 := xtree_sum64 (v);
  1087. whenever not found goto serializable_xtree;
  1088. set isolation='committed';
  1089. select RO_ID, RO_FLAGS into id, old_flags
  1090. from DB.DBA.RDF_OBJ table option (index RO_VAL)
  1091. where RO_VAL = sum64
  1092. and RO_DT_AND_LANG = dt_and_lang
  1093. and bit_and (RO_FLAGS, 2);
  1094. --!TBD ... and paranoid check
  1095. goto found_xtree;
  1096. serializable_xtree:
  1097. whenever not found goto new_xtree;
  1098. set isolation='serializable';
  1099. declare id_cr cursor for
  1100. select RO_ID, RO_FLAGS from DB.DBA.RDF_OBJ table option (index RO_VAL) where RO_VAL = sum64
  1101. and RO_DT_AND_LANG = dt_and_lang
  1102. and bit_and (RO_FLAGS, 2);
  1103. --!TBD ... and paranoid check
  1104. open id_cr (exclusive);
  1105. fetch id_cr into id, old_flags;
  1106. found_xtree:
  1107. digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
  1108. if (ro_id_dict is not null)
  1109. {
  1110. if (not (bit_and (old_flags, 1)))
  1111. {
  1112. update DB.DBA.RDF_OBJ set RO_FLAGS = bit_or (RO_FLAGS, 1) where RO_ID = id;
  1113. --insert soft rdf_ft (rf_id, rf_o) values (id, digest);
  1114. }
  1115. dict_put (ro_id_dict, id, 1);
  1116. }
  1117. if (not (rdf_box_is_storeable (digest)))
  1118. signal ('RDFX2', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
  1119. return digest;
  1120. -- goto recheck;
  1121. new_xtree:
  1122. id := sequence_next ('RDF_RO_ID');
  1123. digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
  1124. -- if (ro_id_dict is null)
  1125. -- {
  1126. -- dbg_obj_princ ('zero RO_FLAGS in sparql.sql:1124');
  1127. -- ;
  1128. -- }
  1129. insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_LONG, RO_FLAGS, RO_DT_AND_LANG) values
  1130. (id, sum64, __xml_serialize_packed (v), case (isnull (ro_id_dict)) when 0 then 3 else 2 end, dt_and_lang);
  1131. --if (ro_id_dict is not null)
  1132. --insert soft rdf_ft (rf_id, rf_o) values (id, digest);
  1133. if (ro_id_dict is not null)
  1134. dict_put (ro_id_dict, id, 1);
  1135. if (not (rdf_box_is_storeable (digest)))
  1136. signal ('RDFX3', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
  1137. return digest;
  1138. -- old_digest := null;
  1139. -- goto recheck;
  1140. }
  1141. if ((dt_twobyte = 257) and (lang_twobyte = 257) and (length (v) <= -1))
  1142. {
  1143. if (1 >= need_digest)
  1144. return v;
  1145. whenever not found goto serializable_veryshort;
  1146. set isolation='committed';
  1147. select RO_ID into id
  1148. from DB.DBA.RDF_OBJ table option (index RO_VAL)
  1149. where RO_VAL = v and RO_DT_AND_LANG = dt_and_lang and not (bit_and (RO_FLAGS, 2));
  1150. goto found_veryshort;
  1151. serializable_veryshort:
  1152. whenever not found goto new_veryshort;
  1153. set isolation='serializable';
  1154. declare id_cr cursor for select RO_ID
  1155. from DB.DBA.RDF_OBJ table option (index RO_VAL)
  1156. where RO_VAL = v and RO_DT_AND_LANG = dt_and_lang and not (bit_and (RO_FLAGS, 2));
  1157. open id_cr (exclusive);
  1158. fetch id_cr into id;
  1159. found_veryshort:
  1160. if (ro_id_dict is not null)
  1161. {
  1162. dict_put (ro_id_dict, id, 1);
  1163. --insert soft rdf_ft (rf_id, rf_o) values (id, v);
  1164. }
  1165. if (not (rdf_box_is_storeable (v)))
  1166. signal ('RDFX4', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
  1167. return v;
  1168. new_veryshort:
  1169. id := sequence_next ('RDF_RO_ID');
  1170. insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_FLAGS, RO_DT_AND_LANG) values (id, v, 1, dt_and_lang);
  1171. if (ro_id_dict is not null)
  1172. {
  1173. dict_put (ro_id_dict, id, 1);
  1174. }
  1175. insert into DB.DBA.RO_START (RS_START, RS_DT_AND_LANG, RS_RO_ID)
  1176. values (subseq (v, 0, case when length (v) > 10 then 10 else length (v) end), dt_and_lang, rdf_box (0, 257, 257, id, 0));
  1177. if (not (rdf_box_is_storeable (v)))
  1178. signal ('RDFX5', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
  1179. return v;
  1180. }
  1181. llong := 50;
  1182. if (length (v) > llong)
  1183. {
  1184. declare chksm varchar;
  1185. chksm := mdigest5 (v, 1);
  1186. whenever not found goto serializable_long;
  1187. set isolation='committed';
  1188. select RO_ID, RO_FLAGS into id, old_flags
  1189. from DB.DBA.RDF_OBJ table option (index RO_VAL)
  1190. where RO_VAL = chksm
  1191. and RO_DT_AND_LANG = dt_and_lang
  1192. and not (bit_and (RO_FLAGS, 2))
  1193. and blob_to_string (RO_LONG) = v;
  1194. goto found_long;
  1195. serializable_long:
  1196. whenever not found goto new_long;
  1197. set isolation='serializable';
  1198. declare id_cr cursor for
  1199. select RO_ID, RO_FLAGS from DB.DBA.RDF_OBJ
  1200. table option (index RO_VAL) where RO_VAL = chksm
  1201. and RO_DT_AND_LANG = dt_and_lang
  1202. and not (bit_and (RO_FLAGS, 2))
  1203. and blob_to_string (RO_LONG) = v;
  1204. open id_cr (exclusive);
  1205. fetch id_cr into id, old_flags;
  1206. found_long:
  1207. digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
  1208. if ((not (bit_and (old_flags, 1))) and (1 < need_digest))
  1209. update DB.DBA.RDF_OBJ set RO_FLAGS = bit_or (RO_FLAGS, 1) where RO_ID = id;
  1210. if (ro_id_dict is not null)
  1211. {
  1212. dict_put (ro_id_dict, id, 1);
  1213. }
  1214. if (not (rdf_box_is_storeable (digest)))
  1215. signal ('RDFX6', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
  1216. return digest;
  1217. new_long:
  1218. id := sequence_next ('RDF_RO_ID');
  1219. digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
  1220. if (1 < need_digest)
  1221. insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_LONG, RO_FLAGS, RO_DT_AND_LANG)
  1222. values (id, chksm, v, 1, dt_and_lang);
  1223. else
  1224. {
  1225. set triggers off;
  1226. -- dbg_obj_princ ('zero RO_FLAGS in sparql.sql:1225 ', chksm, v);
  1227. insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_LONG, RO_DT_AND_LANG)
  1228. values (id, chksm, v, dt_and_lang);
  1229. set triggers on;
  1230. }
  1231. if (ro_id_dict is not null)
  1232. {
  1233. dict_put (ro_id_dict, id, 1);
  1234. }
  1235. insert into DB.DBA.RO_START (RS_START, RS_DT_AND_LANG, RS_RO_ID)
  1236. -- no need in values (subseq (v, 0, case when length (v) > 10 then 10 else length (v), RO_DT_AND_LANG, rdf_box (0, 257, 257, id, 0));
  1237. values (subseq (v, 0, 10), dt_and_lang, rdf_box (0, 257, 257, id, 0));
  1238. if (not (rdf_box_is_storeable (digest)))
  1239. signal ('RDFX7', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
  1240. return digest;
  1241. }
  1242. else
  1243. {
  1244. whenever not found goto serializable_short;
  1245. set isolation='committed';
  1246. select RO_ID, RO_FLAGS into id, old_flags
  1247. from DB.DBA.RDF_OBJ table option (index RO_VAL)
  1248. where RO_VAL = v
  1249. and RO_DT_AND_LANG = dt_and_lang;
  1250. goto found_short;
  1251. serializable_short:
  1252. whenever not found goto new_short;
  1253. set isolation='serializable';
  1254. declare id_cr cursor for select RO_ID, RO_FLAGS
  1255. from DB.DBA.RDF_OBJ table option (index RO_VAL)
  1256. where RO_VAL = v
  1257. and RO_DT_AND_LANG = dt_and_lang;
  1258. open id_cr (exclusive);
  1259. fetch id_cr into id, old_flags;
  1260. found_short:
  1261. digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
  1262. if ((not (bit_and (old_flags, 1))) and (1 < need_digest))
  1263. update DB.DBA.RDF_OBJ set RO_FLAGS = bit_or (RO_FLAGS, 1) where RO_ID = id;
  1264. if (ro_id_dict is not null)
  1265. {
  1266. dict_put (ro_id_dict, id, 1);
  1267. }
  1268. if (not (rdf_box_is_storeable (digest)))
  1269. signal ('RDFX8', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
  1270. return digest;
  1271. new_short:
  1272. id := sequence_next ('RDF_RO_ID');
  1273. digest := rdf_box (v, dt_twobyte, lang_twobyte, id, 1);
  1274. if (1 < need_digest)
  1275. insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_FLAGS, RO_DT_AND_LANG)
  1276. values (id, v, 1, dt_and_lang);
  1277. else
  1278. {
  1279. -- dbg_obj_princ ('zero RO_FLAGS in sparql.sql:1271 ', v);
  1280. set triggers off;
  1281. insert into DB.DBA.RDF_OBJ (RO_ID, RO_VAL, RO_FLAGS, RO_DT_AND_LANG)
  1282. values (id, v, 0, dt_and_lang);
  1283. set triggers on;
  1284. }
  1285. insert into DB.DBA.RO_START (RS_START, RS_DT_AND_LANG, RS_RO_ID)
  1286. values (subseq (v, 0, case when length (v) > 10 then 10 else length (v) end), dt_and_lang, rdf_box (0, 257, 257, id, 0));
  1287. if (ro_id_dict is not null)
  1288. {
  1289. dict_put (ro_id_dict, id, 1);
  1290. }
  1291. if (not (rdf_box_is_storeable (digest)))
  1292. signal ('RDFX9', 'DB.DBA.RDF_OBJ_ADD() tries to return bad digest');
  1293. return digest;
  1294. }
  1295. recheck:
  1296. -- dbg_obj_princ ('recheck: id=', id, ', old_digest=', old_digest, ', need_digest=', need_digest, ', digest=', digest);
  1297. signal ('FUNNY', 'Debug code of DB.DBA.RDF_OBJ_ADD() is reached. This can not happen (I believe). Please report this error.');
  1298. }
  1299. ;
  1300. create function DB.DBA.RDF_FIND_RO_DIGEST (in dt_twobyte integeR, in v varchar, in lang_twobyte integeR) returns varchar
  1301. {
  1302. declare llong, dt_and_lang int;
  1303. declare dt_s, lang_s, chksm, sum64 varchar;
  1304. declare digest, old_digest any;
  1305. if (126 = __tag (v))
  1306. v := blob_to_string (v);
  1307. dt_and_lang := bit_or (bit_shift (dt_twobyte, 16), lang_twobyte);
  1308. if (not (isstring (v)))
  1309. {
  1310. if (__tag of XML <> __tag (v))
  1311. return v;
  1312. sum64 := xtree_sum64 (v);
  1313. return (select rdf_box (v, dt_twobyte, lang_twobyte, RO_ID, 1)
  1314. from DB.DBA.RDF_OBJ table option (index RO_VAL)
  1315. where RO_VAL = sum64
  1316. and RO_DT_AND_LANG = dt_and_lang
  1317. and bit_and (RO_FLAGS, 2)
  1318. --!TBD ... and paranoid check
  1319. );
  1320. }
  1321. if ((dt_twobyte = 257) and (lang_twobyte = 257) and (length (v) <= 20))
  1322. return v;
  1323. llong := 50;
  1324. if (length (v) > llong)
  1325. {
  1326. chksm := mdigest5 (v, 1);
  1327. return (select rdf_box (v, dt_twobyte, lang_twobyte, RO_ID, 1)
  1328. from DB.DBA.RDF_OBJ table option (index RO_VAL)
  1329. where RO_VAL = chksm
  1330. and RO_DT_AND_LANG = dt_and_lang
  1331. and not (bit_and (RO_FLAGS, 2))
  1332. and blob_to_string (RO_LONG) = v );
  1333. }
  1334. else
  1335. {
  1336. return (select rdf_box (v, dt_twobyte, lang_twobyte, RO_ID, 1)
  1337. from DB.DBA.RDF_OBJ table option (index RO_VAL)
  1338. where RO_VAL = v
  1339. and RO_DT_AND_LANG = dt_and_lang
  1340. and not (bit_and (RO_FLAGS, 2)) );
  1341. }
  1342. }
  1343. ;
  1344. create function DB.DBA.RDF_MAKE_OBJ_OF_SQLVAL (in v any) returns any array
  1345. {
  1346. declare t int;
  1347. t := __tag (v);
  1348. if (not (t in (126, __tag of varchar, 217, __tag of nvarchar, __tag of XML, __tag of rdf_box)))
  1349. return v;
  1350. if (__tag of nvarchar = t)
  1351. v := charset_recode (v, '_WIDE_', 'UTF-8');
  1352. else if (t in (126, 217))
  1353. v := cast (v as varchar);
  1354. return DB.DBA.RDF_OBJ_ADD (257, v, 257);
  1355. }
  1356. ;
  1357. create function DB.DBA.RDF_MAKE_OBJ_OF_SQLVAL_FT (in v any, in g_iid IRI_ID, in p_iid IRI_ID, in ro_id_dict any := null) returns any
  1358. {
  1359. declare t int;
  1360. -- dbg_obj_princ ('DB.DBA.RDF_MAKE_OBJ_OF_SQLVAL_FT (', v, g_iid, p_iid, ro_id_dict, ')');
  1361. t := __tag (v);
  1362. if (not (t in (126, __tag of varchar, 217, __tag of nvarchar, __tag of XML, __tag of rdf_box)))
  1363. return v;
  1364. if (__tag of nvarchar = t)
  1365. v := charset_recode (v, '_WIDE_', 'UTF-8');
  1366. else if (t in (126, 217))
  1367. v := cast (v as varchar);
  1368. if (not __rdf_obj_ft_rule_check (g_iid, p_iid))
  1369. ro_id_dict := null;
  1370. else
  1371. {
  1372. if (ro_id_dict is null)
  1373. {
  1374. declare res any;
  1375. ro_id_dict := dict_new ();
  1376. res := DB.DBA.RDF_OBJ_ADD (257, v, 257, ro_id_dict);
  1377. DB.DBA.RDF_OBJ_ADD_KEYWORD_FOR_GRAPH (g_iid, ro_id_dict);
  1378. return res;
  1379. }
  1380. }
  1381. return DB.DBA.RDF_OBJ_ADD (257, v, 257, ro_id_dict);
  1382. }
  1383. ;
  1384. create function DB.DBA.RDF_MAKE_OBJ_OF_TYPEDSQLVAL (in v any, in dt_iid IRI_ID, in lang varchar) returns any array
  1385. {
  1386. declare t, dt_twobyte, lang_twobyte int;
  1387. -- dbg_obj_princ ('DB.DBA.RDF_MAKE_OBJ_OF_TYPEDSQLVAL (', v, dt_iid, lang, ')');
  1388. retry_unrdf:
  1389. t := __tag (v);
  1390. if (not (t in (126, __