Example #1
0
CUNIT_TEST(DBSuite, _string_literal)
{
    EagleDbInstance *db = EagleInstanceTest(10);
    EagleBoolean success;
    EagleLoggerEvent *error = NULL;

    success = EagleDbInstance_execute(db, "CREATE TABLE mytable2 (col1 int, col2 text);", &error);
    if (EagleFalse == success) {
        CUNIT_FAIL("%s", error->message);
    }
    CUNIT_ASSERT_TRUE(success);

    success = EagleDbInstance_execute(db, "INSERT INTO mytable2 (col1, col2) VALUES (123, 'some '' cool \' text');", &error);
    if (EagleFalse == success) {
        CUNIT_FAIL("%s", error->message);
    }
    CUNIT_ASSERT_TRUE(success);

    // SELECT data back
    EagleDbParser *p = EagleDbParser_ParseWithString("SELECT col1, col2, 'some string' FROM mytable2;");
    CUNIT_ASSERT_FALSE(EagleDbParser_hasError(p));

    EaglePlan *plan = EagleDbSqlSelect_parse((EagleDbSqlSelect*) p->yyparse_ast, db);
    //printf("%s\n", EaglePlan_toString(plan));

    // catch compilation error
    CUNIT_ASSERT_FALSE(EaglePlan_isError(plan));

    // execute
    EagleInstance *eagle = EagleInstance_New(1);
    EagleInstance_addPlan(eagle, plan);
    EagleInstance_run(eagle);

    // validate data
    EaglePage *page1 = EaglePageProvider_nextPage(plan->result[0]);
    EaglePage *page2 = EaglePageProvider_nextPage(plan->result[1]);
    EaglePage *page3 = EaglePageProvider_nextPage(plan->result[2]);

    CUNIT_ASSERT_EQUAL_INT(page1->type, EagleDataTypeInteger);
    CUNIT_ASSERT_EQUAL_INT(page2->type, EagleDataTypeVarchar);
    CUNIT_ASSERT_EQUAL_INT(page3->type, EagleDataTypeVarchar);
    CUNIT_ASSERT_EQUAL_INT(1, page1->count);
    CUNIT_ASSERT_EQUAL_INT(1, page2->count);
    CUNIT_ASSERT_EQUAL_INT(10, page3->count);
    CUNIT_ASSERT_EQUAL_INT(((int*) page1->data)[0], 123);
    CUNIT_ASSERT_EQUAL_STRING(((char**) page2->data)[0], "some ' cool ' text");
    CUNIT_ASSERT_EQUAL_STRING(((char**) page3->data)[0], "some string");

    EaglePage_Delete(page1);
    EaglePage_Delete(page2);
    EaglePage_Delete(page3);

    EagleInstance_Delete(eagle);
    EaglePlan_Delete(plan);

    EagleDbSqlSelect_DeleteRecursive((EagleDbSqlSelect*) p->yyparse_ast);
    EagleDbParser_Delete(p);

    EagleInstanceTest_Cleanup(db);
}
Example #2
0
CUNIT_TEST(BenchSuite, distance)
{
    int pageSize = 1000, rows = 1000000, cores = 8;
    EagleDbInstance *db = EagleDbInstance_New(pageSize, cores);
    EagleLoggerEvent *error = NULL;
    EagleBoolean success;
    
    // create table
    success = EagleDbInstance_execute(db, "CREATE TABLE point (id INT, x DOUBLE, y DOUBLE);", &error);
    if(EagleFalse == success) {
        CUNIT_FAIL("%s", error->message);
    }
    
    // add data
    srand(0);
    EagleDbParser *p = _BenchSuite_distance(db, rows);
        
    // execute
    for(int i = 0; i < 10; ++i) {
        EaglePlan *plan = EagleDbSqlSelect_parse((EagleDbSqlSelect*) p->yyparse_ast, db);
        if(EagleTrue == EaglePlan_isError(plan)) {
            CUNIT_FAIL("%s", plan->errorMessage);
        }
        //printf("%s\n", EaglePlan_toString(plan));
        
        EagleInstance *eagle = EagleInstance_New(cores);
        EagleInstance_addPlan(eagle, plan);
        EagleInstance_run(eagle);
        
        // print results
        /*while(EaglePageProvider_pagesRemaining(plan->result[0]) > 0) {
         EaglePage *id = EaglePageProvider_nextPage(plan->result[0]);
         EaglePage *x = EaglePageProvider_nextPage(plan->result[1]);
         EaglePage *y = EaglePageProvider_nextPage(plan->result[2]);
         
         for(int i = 0; i < id->count; ++i) {
         EagleDataTypeFloatType _x = ((EagleDataTypeFloatType*) x->data)[i];
         EagleDataTypeFloatType _y = ((EagleDataTypeFloatType*) y->data)[i];
         
         printf("(id = %d, x = %g, y = %g) -> %g\n", ((EagleDataTypeIntegerType*) id->data)[i], _x, _y,
         sqrt((500.0 - _x) * (500.0 - _x) + (500.0 - _y) * (500.0 - _y)));
         }
         }*/
        
        // check timing
        CUNIT_ASSERT_BENCH_RESULT(plan, cores);
        EaglePlan_Delete(plan);
    }
    
    EagleDbSqlSelect_DeleteRecursive((EagleDbSqlSelect*) p->yyparse_ast);
    EagleDbParser_Delete(p);
    EagleDbInstance_Delete(db);
}
Example #3
0
CUNIT_TEST(DBSuite, EagleDbInformationSchema_tables)
{
    int cores = 1;
    EagleDbInstance *db = EagleDbInstance_New(10, cores);

    /* parse sql */
    EagleDbParser *p = EagleDbParser_ParseWithString("select table_schema, table_name from information_schema_tables;");
    if (EagleTrue == EagleDbParser_hasError(p)) {
        CUNIT_FAIL("%s", EagleDbParser_lastError(p));
    }
    CUNIT_ASSERT_FALSE(EagleDbParser_hasError(p));

    EaglePlan *plan = EagleDbSqlSelect_parse((EagleDbSqlSelect*) p->yyparse_ast, db);
    if (EagleTrue == EaglePlan_isError(plan)) {
        CUNIT_FAIL("%s", plan->errorMessage);
    }
    CUNIT_ASSERT_FALSE(EaglePlan_isError(plan));

    /* execute */
    EagleInstance *eagle = EagleInstance_New(cores);
    EagleInstance_addPlan(eagle, plan);
    EagleInstance_run(eagle);

    /* check results */
    EaglePage *page1 = EaglePageProvider_nextPage(plan->result[0]);
    EaglePage *page2 = EaglePageProvider_nextPage(plan->result[1]);
    CUNIT_ASSERT_NOT_NULL(page1);
    CUNIT_ASSERT_NOT_NULL(page2);

    EaglePage_Delete(page1);
    EaglePage_Delete(page2);

    EagleDbSqlExpression_DeleteRecursive((EagleDbSqlExpression*) p->yyparse_ast);
    EaglePlan_Delete(plan);
    EagleInstance_Delete(eagle);
    EagleDbParser_Delete(p);
    EagleDbInstance_Delete(db);
}
Example #4
0
CUNIT_TEST(DBSuite, _CREATE)
{
    EagleDbInstance *db = EagleInstanceTest(10);
    EagleBoolean success;
    EagleLoggerEvent *error = NULL;

    success = EagleDbInstance_execute(db, "CREATE TABLE mytable2 (col1 int, col2 integer, col3 varchar, col4 text);", &error);
    if (EagleFalse == success) {
        CUNIT_FAIL("%s", error->message);
    }
    CUNIT_ASSERT_TRUE(success);

    success = EagleDbInstance_execute(db, "CREATE TABLE mytable2 (col1 int, col2 badtype, col4 text);", &error);
    CUNIT_ASSERT_FALSE(success);
    CUNIT_ASSERT_LAST_ERROR("Error: syntax error, unexpected identifier");

    EagleInstanceTest_Cleanup(db);
}
Example #5
0
CUNIT_TEST(DBSuite, _comment_multi)
{
    EagleDbInstance *db = EagleInstanceTest(10);
    EagleBoolean success;
    EagleLoggerEvent *error = NULL;

    success = EagleDbInstance_execute(db, "CREATE TABLE /* abc */ mytable2 (col1 int);", &error);
    if (EagleFalse == success) {
        CUNIT_FAIL("%s", error->message);
    }
    CUNIT_ASSERT_TRUE(success);

    success = EagleDbInstance_execute(db, "CREATE TABLE /* abc", &error);
    CUNIT_ASSERT_FALSE(success);
    CUNIT_ASSERT_LAST_ERROR("Error: syntax error, unexpected end of file");

    EagleInstanceTest_Cleanup(db);
}
Example #6
0
CUNIT_TEST(SQLFuzzSuite, FirstToken)
{
    EagleDbInstance *db = EagleDbInstance_New(10, 1);
    
    for(int i = 0; i < totalTokens; ++i) {
        if(!strcmp(tokens[i], ";")) {
            continue;
        }
        
        EagleLoggerEvent *error = NULL;
        EagleBoolean success = EagleDbInstance_execute(db, tokens[i], &error);
        if(EagleTrue == success) {
            CUNIT_FAIL("First token \"%s\" did not fail.", tokens[i]);
        }
    }
    
    EagleDbInstance_Delete(db);
}
Example #7
0
EagleDbParser* _BenchSuite_distance(EagleDbInstance *db, int rows)
{
    /*
     SLOW INSERT
     for(int i = 0; i < rows; ++i) {
     char sql[1024];
     sprintf(sql, "INSERT INTO point (id, x, y) VALUES (%d, %g, %g);", i + 1, frand(1000.0), frand(1000.0));
     //printf("%s\n", sql);
     
     success = EagleDbInstance_execute(db, sql, &error);
     if(EagleFalse == success) {
     CUNIT_FAIL("%s", error->message);
     }
     }
     */
    
    EagleDbTableData *td = EagleDbInstance_getTable(db, "point");
    EagleDbTuple *tuple = EagleDbTuple_New(td->table);
    for(int i = 0; i < rows; ++i) {
        EagleDbTuple_setInt(tuple, 0, i + 1);
        EagleDbTuple_setFloat(tuple, 1, frand(1000.0));
        EagleDbTuple_setFloat(tuple, 2, frand(1000.0));
        EagleDbTableData_insert(td, tuple);
        
        // this is a bit naughty, to save time on recreating the tuple for every row we are reusing it
        free(tuple->data[0]);
        free(tuple->data[1]);
        free(tuple->data[2]);
        tuple->data[0] = NULL;
        tuple->data[1] = NULL;
        tuple->data[2] = NULL;
    }
    EagleDbTuple_Delete(tuple);
    
    // do a distance search
    EagleDbParser *p = EagleDbParser_ParseWithString("SELECT id, x, y FROM point WHERE sqrt((500.0 - x) * (500.0 - x) + (500.0 - y) * (500.0 - y)) < 1.0");
    if(EagleTrue == EagleDbParser_hasError(p)) {
        CUNIT_FAIL("%s", EagleDbParser_lastError(p));
    }
    
    return p;
}
Example #8
0
void runFuzzTests(const char *pre, int totalFuzzTests, int length)
{
    // setup
    int pageSize = 10;
    EagleDbInstance *db = EagleDbInstance_New(pageSize, 1);
    
    EagleDbSchema *schema = EagleDbInstance_getSchema(db, EagleDbSchema_DefaultSchemaName);
    
    EagleDbTable *table = EagleDbTable_New("mytable");
    EagleDbTable_addColumn(table, EagleDbColumn_New("col1", EagleDataTypeInteger));
    
    EagleDbTableData *td = EagleDbTableData_New(table, pageSize);
    EagleDbSchema_addTable(schema, td);
    
    // begin fuzz testing
    for(int i = 0; i < totalFuzzTests; ++i) {
        char *sql = getSQLFuzz(pre, length);
        
        /*EagleLogger_Get()->out = stderr;
        fprintf(stderr, "\n%d: %s\n", i, sql);*/
        
        EagleLoggerEvent *error = NULL;
        EagleBoolean success = EagleDbInstance_execute(db, sql, &error);
        if(EagleTrue == success) {
            CUNIT_FAIL("%s", sql);
        }
        free(sql);
    }
    
    printf(" %d fuzz tests ", totalFuzzTests);
    
    // tear down
    EagleDbSchema *_schema = EagleDbInstance_getSchema(db, EagleDbSchema_DefaultSchemaName);
    EagleDbTableData *_td = EagleDbSchema_getTable(_schema, "mytable");
    EagleDbTable_DeleteWithColumns(_td->table);
    EagleDbTableData_Delete(_td);
    EagleDbInstance_Delete(db);
}