Add a sqlite3 antlr2 "create table" grammar + generated parser files

There is also a "create table" ast walker which fills
info for the new sqlitetype objects.
A dependency to the antlr2 runtime was added.
The grammar most probably still contain bugs.
Why all this?
First writing grammars is fun and this is the only way
we can get all information for proper table editing + some time
in the future when the grammar is finished we can provide real
auto completion.
This commit is contained in:
Peinthor Rene
2013-03-16 20:18:57 +01:00
parent 56d8103e17
commit 5737925079
12 changed files with 5247 additions and 35 deletions

View File

@@ -11,17 +11,20 @@ private slots:
void sqlOutput();
void autoincrement();
void notnull();
void parseSQL();
void parseSQLMultiPk();
};
void TestTable::sqlOutput()
{
Table tt("testtable");
Field* f = new Field("id", "integer");
Field* fkm = new Field("km", "integer", false, "km > 1000");
FieldPtr f = FieldPtr(new Field("id", "integer"));
FieldPtr fkm = FieldPtr(new Field("km", "integer", false, "", "km > 1000"));
tt.addField(f);
tt.addField(new Field("car", "text"));
tt.addField(FieldPtr(new Field("car", "text")));
tt.addField(fkm);
QList<Field*> pk;
FieldList pk;
pk.append(f);
pk.append(fkm);
tt.setPrimaryKey(pk);
@@ -31,16 +34,16 @@ void TestTable::sqlOutput()
"\tcar\ttext,\n"
"\tkm\tinteger CHECK(km > 1000),\n"
"\tPRIMARY KEY(id,km)\n"
")"));
");"));
}
void TestTable::autoincrement()
{
Table tt("testtable");
Field* f = new Field("id", "integer");
Field* fkm = new Field("km", "integer");
FieldPtr f = FieldPtr(new Field("id", "integer"));
FieldPtr fkm = FieldPtr(new Field("km", "integer"));
tt.addField(f);
tt.addField(new Field("car", "text"));
tt.addField(FieldPtr(new Field("car", "text")));
tt.addField(fkm);
tt.setPrimaryKey(f, true);
@@ -48,16 +51,16 @@ void TestTable::autoincrement()
"\tid\tinteger PRIMARY KEY AUTOINCREMENT,\n"
"\tcar\ttext,\n"
"\tkm\tinteger\n"
")"));
");"));
}
void TestTable::notnull()
{
Table tt("testtable");
Field* f = new Field("id", "integer");
Field* fkm = new Field("km", "integer");
FieldPtr f = FieldPtr(new Field("id", "integer"));
FieldPtr fkm = FieldPtr(new Field("km", "integer"));
tt.addField(f);
tt.addField(new Field("car", "text", true));
tt.addField(FieldPtr(new Field("car", "text", true)));
tt.addField(fkm);
tt.setPrimaryKey(f, true);
@@ -65,7 +68,56 @@ void TestTable::notnull()
"\tid\tinteger PRIMARY KEY AUTOINCREMENT,\n"
"\tcar\ttext NOT NULL,\n"
"\tkm\tinteger\n"
")"));
");"));
}
void TestTable::parseSQL()
{
QString sSQL = "CREATE TABLE hero (\n"
"\tid integer PRIMARY KEY AUTOINCREMENT,\n"
"\tname text NOT NULL DEFAULT 'xxxx',\n"
"\tinfo VARCHAR(255) CHECK (info == x)\n"
");";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "hero");
QVERIFY(tab.fields().at(0)->name() == "id");
QVERIFY(tab.fields().at(1)->name() == "name");
QVERIFY(tab.fields().at(2)->name() == "info");
QVERIFY(tab.fields().at(0)->type() == "integer");
QVERIFY(tab.fields().at(1)->type() == "text");
QVERIFY(tab.fields().at(2)->type() == "VARCHAR(255)");
QVERIFY(tab.fields().at(0)->autoIncrement());
QVERIFY(tab.fields().at(1)->notnull());
QCOMPARE(tab.fields().at(1)->check(), QString(""));
QCOMPARE(tab.fields().at(2)->check(), QString("(info==x)"));
QVERIFY(tab.primarykey().contains(tab.fields().at(0)));
}
void TestTable::parseSQLMultiPk()
{
QString sSQL = "CREATE TABLE hero (\n"
"\tid1 integer,\n"
"\tid2 integer,\n"
"\tnonpkfield blob,\n"
"PRIMARY KEY(id1,id2)\n"
");";
Table tab = Table::parseSQL(sSQL);
QVERIFY(tab.name() == "hero");
QVERIFY(tab.fields().at(0)->name() == "id1");
QVERIFY(tab.fields().at(1)->name() == "id2");
QVERIFY(tab.fields().at(0)->type() == "integer");
QVERIFY(tab.fields().at(1)->type() == "integer");
QVERIFY(tab.primarykey().contains(tab.fields().at(0)));
QVERIFY(tab.primarykey().contains(tab.fields().at(1)));
}
QTEST_MAIN(TestTable)