Implementace funkce XMLTABLE v PostgreSQL. Pavel

Podobné dokumenty
PostgreSQL. Podpora dědičnosti Rozšiřitelnost vlastní datové typy. Univerzální nasazení ve vědecké sféře

Ukládání a vyhledávání XML dat

INDEXY JSOU GRUNT. Pavel Stěhule

Tabulka fotbalové ligy

Oracle XML DB. Tomáš Nykodým

Použití databází na Webu

PL/pgSQL. Pavel

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

TimescaleDB. Pavel Stěhule 2018

FIREBIRD relační databázový systém. Tomáš Svoboda

Databáze I. Přednáška 7

Databázové systémy. Cvičení 6: SQL

SQL injection princip a ochrana

Databázové systémy Cvičení 5.2

RELAČNÍ DATABÁZOVÉ SYSTÉMY

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

zobrazení délky ve výpisu v psql

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

Michal Krátký, Miroslav Beneš

Novinky v PostgreSQL 9.4. Tomáš Vondra, 2ndQuadrant

Embedded SQL v C/C++ úvod. Administrace Oracle Kateřina Opočenská

DUM 12 téma: Příkazy pro tvorbu databáze

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Dotazování nad stromem abstraktní syntaxe

Rozšiřování a upravování stávající funkcionality PLToolbox, Orafce

8. Zpracování dotazu. J. Zendulka: Databázové systémy 8 Zpracování dotazu 1

8.2 Používání a tvorba databází

Optimalizace dotazů a databázové transakce v Oracle

Jazyk PL/SQL Úvod, blok

Virtual Private Database (VPD) Jaroslav Kotrč

Jazyk SQL 1. Michal Valenta. Katedra softwarového inženýrství FIT České vysoké učení technické v Praze c Michal Valenta, 2012 BI-DBS, ZS 2011/12

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

J. Zendulka: Databázové systémy 8 Zpracování dotazu Podstata optimalizace zpracování dotazu

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Semestrální práce z DAS2 a WWW

Databázové systémy I. 1. přednáška

Paralelní dotazy v PostgreSQL 9.6 (a 10.0)

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

Jaký je rozdíl v definicicíh VARCHAR2(20 BYTE) a VARCHAR2(20 CHAR):

Databázové a informační systémy Jana Šarmanová

Verzování a publikace dat na webu za pomoci PostgreSQL

MBI - technologická realizace modelu

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Databázové systémy a SQL

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

FRED & PostgreSQL. CZ.NIC, z.s.p.o. Jaromír Talíř <jaromir.talir@nic.cz>

SQL - trigger, Databázové modelování

O Apache Derby detailněji. Hynek Mlnařík

Zabezpečení proti SQL injection

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

PG 9.5 novinky ve vývoji aplikací

Základy informatiky. 06 Databázové systémy. Kačmařík/Szturcová/Děrgel/Rapant

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

MySQL sežere vaše data

Nasazení Object Relation Mapping nástrojů nad legacy datovým modelem

PB161 Programování v jazyce C++ Přednáška 10

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

2. přednáška. Databázový přístup k datům (SŘBD) Možnost počítání v dekadické aritmetice - potřeba přesných výpočtů, např.

Mechanismus obarvení řádků browse

4. lekce Přístup k databázi z vyššího programovacího jazyka

Využití XML v DB aplikacích

Zabezpečení proti SQL injection

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

Úvod do databázových systémů

XMW4 / IW4 Pokročilé SELECT dotazy. Štefan Pataky

Úvod do databázových systémů

SQL a XML jako alternativa ke klasickým unixovým nástrojům

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

IDS optimalizátor. Ing. Jan Musil, IBM ČR Community of Practice for

Databázové systémy trocha teorie

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Databáze 2011/2012 T-SQL - kurzory, funkce. RNDr.David Hoksza, Ph.D.

Operátory ROLLUP a CUBE

Jazyk SQL databáze SQLite. připravil ing. petr polách

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Rezervační systém Tvorba WWW stránek

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

Algoritmizace a programování

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

PostgreSQL Novinky (a JSONB) Tomáš Vondra, GoodData (tomas.vondra@gooddata.com) (tomas@pgaddict.

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

Objektově relační databáze a ORACLE 8

Vzorové příklady SQL. Tabulka: Kniha CREATE TABLE kniha (id INTEGER, název VARCHAR(50), PRIMARY KEY (id))

Text úlohy. Systémový katalog (DICTIONARY):

13. blok Práce s XML dokumenty v databázi Oracle

Embedded SQL v C/C++ III - pole, struktury. Jindřich Vodrážka

Databázové systémy. Datová integrita + základy relační algebry. 4.přednáška

Kapitola 1: Úvod. Systém pro správu databáze (Database Management Systém DBMS) Účel databázových systémů

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS

Jazyk C# - přístup k datům

Sada 1 - PHP. 14. Úvod do jazyka SQL

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 26.3.

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

Budte chytří při vytváření aplikací

O datových typech a jejich kontrole

5. POČÍTAČOVÉ CVIČENÍ

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Transkript:

Implementace funkce XMLTABLE v PostgreSQL Pavel Stěhule @2017

Motivace Aktuálně chybí jednoduchý způsob, jak parsovat XML dokumenty v PostgreSQL S použitím untrusted funkcí (XML reader API) - pracné, a ne každý má dostatečné zkušenosti s Perlem, Pythonem (běžné jazyky jsou untrusted) Funkce XPath - opakované volání může být pomalé, i poměrně jednoduché transformace nepřehledné 2

Motivace - funkce XPath <data> <user id="1"> <jmeno>pavel</jmeno> <prijmeni>stehule</prijmeni> </user> <user id="2"> <jmeno>tomas</jmeno> <prijmeni>vondra</prijmeni> </user> </data> 3

Motivace - funkce XPath SELECT d[1] id, d[2] jmeno, d[3] prijmeni FROM (SELECT xpath('/user/@id /user/jmeno/text() ' '/user/prijmeni/text()',x) d FROM (SELECT unnest(xpath('/data/user', a)) x FROM foo) s) s2; 4

SQL/XML ANSI SQL 2003 funkce XMLELEMENT, XMLFOREST příprava XMLTABLE 2004 ANSI SQL 2006 obsahuje XMLTABLE PostgreSQL 8.3 (2008) podpora SQL/XML PostgreSQL 10 (2017) podpora XMLTABLE 5

Motivace - funkce XMLTABLE SELECT xmltable.* FROM foo, LATERAL xmltable('/data/user' PASSING a COLUMNS id int PATH '@id', jmeno text, prijmeni text); id jmeno prijmeni 1 Pavel Stehule 2 Tomas Vondra (2 rows) 6

Výhody Zjednodušení zápisu Efektivní zpracování dostupné všem uživatelům Zlepšení shody se standardem Implementace funkce občas požadované při migraci z Oracle 7

Pro detaily implementace Standard - nepokrývá všechny implementační detaily - málo čitelný Oracle, DB2 - potřeba odstínit specifika, občas protichůdná implementace - Oracle v detailu nesplňuje standard (byť je autorem této části) Je nutné respektovat specifika Postgresu - nová funkce musí zapadat do kontextu celé db - ANSI/SQL, Oracle - XML je blob, v PostgreSQL XML je nativní typ nevyžadující speciální transformaci 8

Implemetace Jak by mohla tato funkce vypadat v aktuální verzi PostgreSQL? 9

Implementace CREATE OR REPLACE FUNCTION fx(a xml, rowf text, colf text[]) RETURNS SETOF record as $$ BEGIN END $$ LANGUAGE plpgsql; SELECT * FROM foo, LATERAL fx(a, '/data/user', ARRAY['@id','jmeno','prijmeni']) AS (id int, jmeno text, prijmeni text); 10

Implementace v klasické funkci Není ve shodě se standardem Nelze jednoduše nastavit defaultní hodnoty Zápis je roztahaný - definice typů mimo volání funkce + lze napsat jako extenzi + pravděpodobně plnohodnotná implementace bez zásahu do Postgresu 11

Nativní implementace konzistentní úspornější čístý zápis s možností definovat defaultní hodnoty a podmínky NOT NULL podpora standardu pravděpodobně velice dobrý výkon - poměrně velký patch.. cca 100-150KB 12

Možné komplikace při implementaci libxml2 - plochá učící křivka, málo příkladů odladěný software, ale občas je nutné se podívat do zdrojáků dvě různé správy paměti PostgreSQL palloc libxml2 nezbytné konverze mezi libxml2 a Postgresem xmlchar <=> char <=> text generické řešení - podobná funkce JSON_TABLE 13

Generování XML - pro úplnost SELECT xmlelement( NAME data, xmlagg(xmlelement( NAME user, xmlattributes(id), xmlforest(jmeno, prijmeni)))) FROM foo_x; 14

Implementace - části k modifikaci parser - stávající verze neumožňují definovat výstupní sloupce uvnitř funkce executor - je nutné někde spočítat výsledek 15

Postgres jako překladač SQL Překladač SQL do AST (parser) Transformace AST (analyzer/rewriter) Generátor variant (cest) prováděcího plánu (planner) Interpret prováděcích plánů (executor) Executor implementuje operace nad relacemi (join, agg) a získáva data z datových zdrojů - halda, různé typy indexů Programování PostgreSQL je podobné programování překladače programovacího jazyka. 16

Postgres jako překladač SQL Při správném použití je režie SQL zanedbatelná práce s IO, zajištění konzistence (zámky) I při nesprávném použití je režie SQL obvykle zanedbatelná (pozor na ISAM přístup). Postgres má interní ISAM API - nikdo nenapsal interface, kterým by se toto API zpřístupnilo uživatelům preferuje se komfortní SQL až na vyjímky zanedbatelný výkonostní benefit ohledně výkonu není snaha konkurovat zavedeným key/value databázím (ACID versus CAP) 17

Historie - Lisp v PostgreSQL Původně byl optimalizátor v Lispu Rychlost dostatečná Oceňovaná rychlost vývoje - interně je zpracování SQL dotazu několik transformací stromů (a následně evaluace stromu) Odstraněno kvůli problémům s integrací správy paměti v C a GC v Lispu Pozůstatek - intenzivně používaná struktura node 18

Historie - Lisp v PostgreSQL typedef struct Expr { NodeTag type; }Expr; typedef struct Param { Expr xpr; int paramid;... } -- Param lze bezpecne pretypovat na Expr Expr *ex = (Expr *) par; 19

Historie - Lisp v PostgreSQL -- funkce pro praci se seznamy List *l = NIL; l = make_list1(expr); l = lappend(l, expr); -- iterace ListCell *lc; foreach(lc, l) { Expr *x = (Expr *) lfirst(lc); }... 20

PostgreSQL Parser Používá překladač gramatik bison Gramatika musí být jednoznačná (bez kolizí) Pokud možno bez nových rezervovaných klíčových slov (nerezervovaná klíčová slova nejsou problém) První pravděpodobný blocker 21

Gramatika pro XMLTABLE xmltable: ; XMLTABLE '(' c_expr xmlexists_argument ')' XMLTABLE '(' c_expr xmlexists_argument COLUMNS xmltable_column_list ')' XMLTABLE '(' XMLNAMESPACES '(' xml_namespace_list ')' ',' c_expr xmlexists_argument ')' XMLTABLE '(' XMLNAMESPACES '(' xml_namespace_list ')' ',' xmltable_column_list: xmltable_column_el { $$ = list_make1($1); } xmltable_column_list ',' xmltable_column_el { $$ = lappend($1, $3); } ; xmltable_column_el: ColId Typename ColId Typename xmltable_column_opt_list ColId FOR ORDINALITY ; 22

Výkonná část Implementace jako variace SRF funkce výrazně kratší kód - mírné znásilnění SRF API část interpretu výrazů Implementace jako executor scan node generická čistá implementace výrazně delší kód + zásahy (většinou triviální/mechanické) do planneru 23

Postup POC - ukázat, že to lze nujsurovější možná forma Kompletní patch včetně dokumentace a testů Commitfest patch začišťování dokumentace a komentářů rozšiřování testů pročišťování kódu 24

Query pipeline Parser Planner Optimizer Rewriter Executor 25

Postup 1. funkční parser, 2. funkční parser, NULL executor (0 řádek) propojení obou komponent musí fungovat vytvoření a aplikace dynamického compozitního datového typu - TupleDesc 3. funkční parser, konstantní executor, fixní typy 4. funkční parser, funkční executor 5. regresní testy 6. dokumentace 26

PostgreSQL je komunitní software občas o váš kód nejeví nikdo zájem může se jednat opravdu o hloupost může odradit rozsahem, komplikovaností přínosy nemusí být zřejmé vysvětlovat, komunikovat, být trpělivý, asertivní ale respektovat, že ostatní mohou mít jiný názor některé patche potřebují uzrát podpora XML - 3 roky po prototypu GROUPING SETS - 10 let po prototypu psql \if command - 10 let po prototypu 27

Možné pokračování Podpora JSONu SQL/JSON funkce JSON_TABLE - v Postgresu je nutné uvažovat i jsonb složitější - umožňuje zanoření, pracuje se s poli čeká se na implementaci JSONPath chybí knihovna jako je libxml2 (jsonb je proprietární) 28

JSON_TABLE -- design neni konzistentni s xmltable() SELECT * FROM JSON_TABLE( JSON_VAR, '$' COLUMNS( first VARCHAR(10) PATH 'lax $.name.first', last VARCHAR(10) PATH 'lax $.name.last', NESTED '$.phones[*]'columns ( "type" VARCHAR(10), "number" VARCHAR(10) ) ) ) as t; 29