<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Diplomov%C3%A9_pr%C3%A1ce_pro_FIT</id>
	<title>Diplomové práce pro FIT - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Diplomov%C3%A9_pr%C3%A1ce_pro_FIT"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Diplomov%C3%A9_pr%C3%A1ce_pro_FIT&amp;action=history"/>
	<updated>2026-04-29T20:44:04Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Diplomov%C3%A9_pr%C3%A1ce_pro_FIT&amp;diff=506&amp;oldid=prev</id>
		<title>imported&gt;Pavel: /* PostgreSQL PL proxy */</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Diplomov%C3%A9_pr%C3%A1ce_pro_FIT&amp;diff=506&amp;oldid=prev"/>
		<updated>2011-09-03T11:03:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;PostgreSQL PL proxy&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Tato zadání jsou určené pro studenty &amp;lt;i&amp;gt;MI_SWI_SI&amp;lt;/i&amp;gt; a &amp;lt;i&amp;gt;MI_TI_SP&amp;lt;/i&amp;gt;. Je žádoucí splnění předmětu &amp;lt;i&amp;gt;MIRUN&amp;lt;/i&amp;gt;. Předpokladem je znalost jazyka C a schopnost aktivně pracovat s cizími zdrojovými kódy (hacking). &lt;br /&gt;
&lt;br /&gt;
=Podpora uložených procedur v PostgreSQL=&lt;br /&gt;
RDBMS PostgreSQL nabízí pro vývoj uložených procedur několik programovacích jazyků. V této nabídce ovšem chybí programovací jazyk PSM, který byl navržen přímo pro vývoj uložených procedur. Paradoxně PostgreSQL také nepodporuje procedury (podporuje pouze funkce). &amp;#039;&amp;#039;&amp;#039;Cílem navržených témat je: zefektivnit stávající podporu uložených procedur, implementovat podporu jazyka PSM a konečně připravit prostředí pro spouštění procedur.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Témata mohou být použita pro bakalářské i magisterské práce. Po dohodě s zadavatelem dojde k upřesnění zadání a rozsahu práce.&lt;br /&gt;
&lt;br /&gt;
Zadavatel: Ing. Pavel Stěhule, pavel.stehule@gmail.com, tel: 724 101 000&lt;br /&gt;
&lt;br /&gt;
Organizace: CSPUG &lt;br /&gt;
&lt;br /&gt;
==Akcelerátor PL/pgSQL==&lt;br /&gt;
PL/pgSQL je standardní programovací jazyk pro uložené procedury v RDBMS PostgreSQL. Jedná se o jednoduchý interpret založený na rekurzivní interpretaci AST. Aktuálním hrdlem je vyhodnocení výrazů - což je volání AST interpretu (executoru SQL v PostgreSQL). &amp;#039;&amp;#039;&amp;#039;Cílem diplomové práce je převedení AST výrazů do bytecode (případně JIT) s vlastním rychlým interpretem.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* nastudujte si techniky použité pro urychlení zpracování interpretovaných jazyků (např. threading),&lt;br /&gt;
* nastudujte si architekturu vyhodnocení výrazů v PostgreSQL (exekutor),&lt;br /&gt;
* nastudujte si datové struktury používané pro uložení AST výrazů,&lt;br /&gt;
* navrhněte a realizujte vlastní interpret výrazů a posuďte jeho rychlost vůči exekutoru PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
==PostgreSQL PL proxy==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cílem diplomové práce je emulace reálných uložených procedur pro RDBMS PostgreSQL pomocí proxy serveru.&amp;#039;&amp;#039;&amp;#039; Proxy server filtruje komunikaci server/klient, přičemž všechny běžné požadavky posílá na server. V případě, že klient použije příkaz CALL, tak proxy server spustí modifikovaný interpret PL/pgSQL, který umožní exekuci kódu mimo vlastní jádro databáze. Další příkazy, které musí proxy server zpracovat, jsou příkazy CREATE OR REPLACE PROCEDURE a DROP PROCEDURE.&lt;br /&gt;
* nastudujte rozdíly v podpoře uložených procedur v RDBMS Oracle, DB2 a MSSQL,&lt;br /&gt;
* seznamte se s komunikačním protokolem použitým pro komunikaci db PostgreSQL,&lt;br /&gt;
* navrhněte jednoduchý proxy server podporující příkazy SHOW TABLES, SHOW DATABASES,&lt;br /&gt;
* proxy server rozšiřte o možnost aktivace kódu v programovacím jazyce LUA s možností předání relevantního db připojení,&lt;br /&gt;
* proxy server rozšiřte o podporu SQL uložených procedur - o příkaz CALL, CREATE PROCEDURE a DROP PROCEDURE&lt;br /&gt;
* proxy server rozšiřte o podporu session proměnných - příkaz DECLARE.&lt;br /&gt;
&lt;br /&gt;
Poznámka - jako programovací jazyk můžete použít Perl, Python, C nebo Lua.&lt;br /&gt;
&lt;br /&gt;
==Vytvoření interpretu PSM nad virtuálními stroji PARROT nebo LUA==&lt;br /&gt;
Jazyk PSM je procedurální programovací jazyk navržený pro vývoj uložených procedur - jeho definice je součástí standardu ANSI SQL (cca v letech 1993-1997). K dispozici je prototyp, k dispozici jsou regresní testy. &amp;#039;&amp;#039;&amp;#039;Cílem diplomové práce je vytvořit překladač PSM pro virtuální stroj PARROT nebo pro virtuální stroj LUA - a to tak, aby bylo možné použít JIT implementovanou pro tyto virtuání stroje.&amp;#039;&amp;#039;&amp;#039; Součástí diplomové práce bude bližší seznámení se s těmito vývojovými platformami.&lt;br /&gt;
* seznamte se s programovacím jazykem PSM,&lt;br /&gt;
* seznamte se s prostředím PARROT nebo LUA a návrhem překladačů v těchto prostředích&lt;br /&gt;
* realizujte jazyk PSM v prostředí PARROT nebo LUA,&lt;br /&gt;
* zhodnoťte efektivitu, složitost, objem Vaší implementace vůči vestavěnému programovacímu jazyku PL/pgSQL.&lt;br /&gt;
&lt;br /&gt;
==Návrh a realizace efektivního interpretu jazyka PSM==&lt;br /&gt;
Aktuálně existují dvě implementace programovacího jazyku PSM pro RDBMS PostgreSQL - PL/pgPSM (AST interpret) a PL/PSM0 (interpret bytecode). &amp;#039;&amp;#039;&amp;#039;Cílem diplomové práce je analyzovat implementace PSM, navrhnout a realizovat řešení, které urychlí interpretaci (např. použitím technik použitých pro urychlení provádění Javascriptu), a posoudit obě varianty (z hlediska rychlosti, z hlediska velikosti a komplexnosti kódu).&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* urychlete následující kód:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int data[10];&lt;br /&gt;
&lt;br /&gt;
typedef struct &lt;br /&gt;
{&lt;br /&gt;
	int op;&lt;br /&gt;
	int *param1;&lt;br /&gt;
	int *param2;&lt;br /&gt;
	int *result;&lt;br /&gt;
} instr;&lt;br /&gt;
&lt;br /&gt;
instr prg[20];&lt;br /&gt;
&lt;br /&gt;
static void &lt;br /&gt;
sum(instr *op, int *pc)&lt;br /&gt;
{&lt;br /&gt;
	*(op-&amp;gt;result) = *(op-&amp;gt;param1) + *(op-&amp;gt;param2);&lt;br /&gt;
	(*pc)++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
mul(instr *op, int *pc)&lt;br /&gt;
{&lt;br /&gt;
	*(op-&amp;gt;result) = *(op-&amp;gt;param1) * *(op-&amp;gt;param2);&lt;br /&gt;
	(*pc)++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
set(instr *op, int *pc)&lt;br /&gt;
{&lt;br /&gt;
	*(op-&amp;gt;result) = (int) op-&amp;gt;param1;&lt;br /&gt;
	(*pc)++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
jmpnz(instr *op, int *pc)&lt;br /&gt;
{&lt;br /&gt;
	if (*(op-&amp;gt;param1) != 0)&lt;br /&gt;
	{&lt;br /&gt;
		*pc = (int) op-&amp;gt;param2;&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		(*pc)++;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
eval()&lt;br /&gt;
{&lt;br /&gt;
	int exit_loop = 0;&lt;br /&gt;
	int pc = 0;&lt;br /&gt;
&lt;br /&gt;
	while (pc &amp;lt; 10 &amp;amp;&amp;amp; !exit_loop)&lt;br /&gt;
	{&lt;br /&gt;
		switch (prg[pc].op)&lt;br /&gt;
		{&lt;br /&gt;
			case 1:&lt;br /&gt;
				sum(&amp;amp;prg[pc], &amp;amp;pc);&lt;br /&gt;
				break;&lt;br /&gt;
			case 2:&lt;br /&gt;
				mul(&amp;amp;prg[pc], &amp;amp;pc);&lt;br /&gt;
				break;&lt;br /&gt;
			case 3:&lt;br /&gt;
				set(&amp;amp;prg[pc], &amp;amp;pc);&lt;br /&gt;
				break;&lt;br /&gt;
			case 4:&lt;br /&gt;
				jmpnz(&amp;amp;prg[pc], &amp;amp;pc);&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				exit_loop = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void&lt;br /&gt;
storeop(int op, int *param1, int *param2, int *result, int *pc)&lt;br /&gt;
{&lt;br /&gt;
	instr *addr = &amp;amp;prg[(*pc)++];&lt;br /&gt;
	addr-&amp;gt;op = op;&lt;br /&gt;
	addr-&amp;gt;param1 = param1;&lt;br /&gt;
	addr-&amp;gt;param2 = param2;&lt;br /&gt;
	addr-&amp;gt;result = result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	int pc = 0;&lt;br /&gt;
	int A = 1;&lt;br /&gt;
	int B = 1;&lt;br /&gt;
	int C = 1;&lt;br /&gt;
	int i = 10000000;&lt;br /&gt;
	int aux = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	memset(prg, 0, sizeof(prg));&lt;br /&gt;
	storeop(3, (int *) 0, 0, &amp;amp;B, &amp;amp;pc);&lt;br /&gt;
	storeop(1, &amp;amp;C, &amp;amp;B, &amp;amp;A, &amp;amp;pc);&lt;br /&gt;
	storeop(3, (int *) 1, 0, &amp;amp;B, &amp;amp;pc);&lt;br /&gt;
	storeop(1, &amp;amp;A, &amp;amp;B, &amp;amp;C, &amp;amp;pc);&lt;br /&gt;
	&lt;br /&gt;
	storeop(3, (int *) -1, 0, &amp;amp;aux, &amp;amp;pc);&lt;br /&gt;
	storeop(1, &amp;amp;i, &amp;amp;aux, &amp;amp;i, &amp;amp;pc);&lt;br /&gt;
	storeop(4, &amp;amp;i, (int *) 0, 0, &amp;amp;pc);&lt;br /&gt;
	&lt;br /&gt;
	eval();&lt;br /&gt;
	printf(&amp;quot;result: %d\n&amp;quot;, C);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* nastudujte stávající implementace jazyku PSM a PL/pgSQL,&lt;br /&gt;
* nastudujte implementaci jazyka Javascript v8,&lt;br /&gt;
* navrhněte efektivní interpret jazyka PSM a posuďte jeho výkon a složitost vůči stávajícímu interpretu PL/pgSQL.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
* http://forge.mysql.com/wiki/MySQL_Proxy&lt;br /&gt;
* http://sqlrelay.sourceforge.net/sqlrelay/router.html&lt;br /&gt;
* http://freshmeat.net/projects/postgresql-relay/&lt;br /&gt;
* http://www.postgresql.org/docs/8.1/static/protocol.html&lt;br /&gt;
* https://labs.omniti.com/labs/pgtreats/wiki/pgsniff&lt;br /&gt;
* https://github.com/dalibo/pgshark/wiki&lt;br /&gt;
* https://github.com/okbob/plpsm0&lt;br /&gt;
* http://parrot.org/&lt;br /&gt;
* http://www.inf.puc-rio.br/~roberto/talks/lua-ll3.pdf&lt;br /&gt;
* http://lamp.epfl.ch/teaching/courses2/_media/advanced_compiler/2011/acc2011_08_interpreters-and-vms_6.pdf&lt;br /&gt;
* [[C a PostgreSQL - interní mechanismy]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Pavel</name></author>
	</entry>
</feed>