mirror of
https://github.com/sqlitebrowser/sqlitebrowser.git
synced 2026-01-20 02:50:46 -06:00
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user