Diplomové práce pro FIT

Z PostgreSQL
Skočit na navigaci Skočit na vyhledávání

Tato zadání jsou určené pro studenty MI_SWI_SI a MI_TI_SP. Je žádoucí splnění předmětu MIRUN. Předpokladem je znalost jazyka C a schopnost aktivně pracovat s cizími zdrojovými kódy (hacking).

Podpora uložených procedur v PostgreSQL

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). 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.

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.

Zadavatel: Ing. Pavel Stěhule, pavel.stehule@gmail.com, tel: 724 101 000

Organizace: CSPUG

Akcelerátor PL/pgSQL

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). Cílem diplomové práce je převedení AST výrazů do bytecode (případně JIT) s vlastním rychlým interpretem.

  • nastudujte si techniky použité pro urychlení zpracování interpretovaných jazyků (např. threading),
  • nastudujte si architekturu vyhodnocení výrazů v PostgreSQL (exekutor),
  • nastudujte si datové struktury používané pro uložení AST výrazů,
  • navrhněte a realizujte vlastní interpret výrazů a posuďte jeho rychlost vůči exekutoru PostgreSQL.

PostgreSQL PL proxy

Cílem diplomové práce je emulace reálných uložených procedur pro RDBMS PostgreSQL pomocí proxy serveru. 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.

  • nastudujte rozdíly v podpoře uložených procedur v RDBMS Oracle, DB2 a MSSQL,
  • seznamte se s komunikačním protokolem použitým pro komunikaci db PostgreSQL,
  • navrhněte jednoduchý proxy server podporující příkazy SHOW TABLES, SHOW DATABASES,
  • 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í,
  • proxy server rozšiřte o podporu SQL uložených procedur - o příkaz CALL, CREATE PROCEDURE a DROP PROCEDURE
  • proxy server rozšiřte o podporu session proměnných - příkaz DECLARE.

Poznámka - jako programovací jazyk můžete použít Perl, Python, C nebo Lua.

Vytvoření interpretu PSM nad virtuálními stroji PARROT nebo LUA

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. 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. Součástí diplomové práce bude bližší seznámení se s těmito vývojovými platformami.

  • seznamte se s programovacím jazykem PSM,
  • seznamte se s prostředím PARROT nebo LUA a návrhem překladačů v těchto prostředích
  • realizujte jazyk PSM v prostředí PARROT nebo LUA,
  • zhodnoťte efektivitu, složitost, objem Vaší implementace vůči vestavěnému programovacímu jazyku PL/pgSQL.

Návrh a realizace efektivního interpretu jazyka PSM

Aktuálně existují dvě implementace programovacího jazyku PSM pro RDBMS PostgreSQL - PL/pgPSM (AST interpret) a PL/PSM0 (interpret bytecode). 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).

  • urychlete následující kód:
#include <stdio.h>
#include <string.h>

int data[10];

typedef struct 
{
	int op;
	int *param1;
	int *param2;
	int *result;
} instr;

instr prg[20];

static void 
sum(instr *op, int *pc)
{
	*(op->result) = *(op->param1) + *(op->param2);
	(*pc)++;
}

static void
mul(instr *op, int *pc)
{
	*(op->result) = *(op->param1) * *(op->param2);
	(*pc)++;
}

static void
set(instr *op, int *pc)
{
	*(op->result) = (int) op->param1;
	(*pc)++;
}

static void
jmpnz(instr *op, int *pc)
{
	if (*(op->param1) != 0)
	{
		*pc = (int) op->param2;
	}
	else
	{
		(*pc)++;
	}
}


static void
eval()
{
	int exit_loop = 0;
	int pc = 0;

	while (pc < 10 && !exit_loop)
	{
		switch (prg[pc].op)
		{
			case 1:
				sum(&prg[pc], &pc);
				break;
			case 2:
				mul(&prg[pc], &pc);
				break;
			case 3:
				set(&prg[pc], &pc);
				break;
			case 4:
				jmpnz(&prg[pc], &pc);
				break;
			default:
				exit_loop = 1;
		}
	}
}

static void
storeop(int op, int *param1, int *param2, int *result, int *pc)
{
	instr *addr = &prg[(*pc)++];
	addr->op = op;
	addr->param1 = param1;
	addr->param2 = param2;
	addr->result = result;
}

int main()
{
	int pc = 0;
	int A = 1;
	int B = 1;
	int C = 1;
	int i = 10000000;
	int aux = 0;


	memset(prg, 0, sizeof(prg));
	storeop(3, (int *) 0, 0, &B, &pc);
	storeop(1, &C, &B, &A, &pc);
	storeop(3, (int *) 1, 0, &B, &pc);
	storeop(1, &A, &B, &C, &pc);
	
	storeop(3, (int *) -1, 0, &aux, &pc);
	storeop(1, &i, &aux, &i, &pc);
	storeop(4, &i, (int *) 0, 0, &pc);
	
	eval();
	printf("result: %d\n", C);
}
  • nastudujte stávající implementace jazyku PSM a PL/pgSQL,
  • nastudujte implementaci jazyka Javascript v8,
  • navrhněte efektivní interpret jazyka PSM a posuďte jeho výkon a složitost vůči stávajícímu interpretu PL/pgSQL.

Odkazy