diff options
Diffstat (limited to 'weed/query/engine/postgresql_only_test.go')
| -rw-r--r-- | weed/query/engine/postgresql_only_test.go | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/weed/query/engine/postgresql_only_test.go b/weed/query/engine/postgresql_only_test.go new file mode 100644 index 000000000..d98cab9f0 --- /dev/null +++ b/weed/query/engine/postgresql_only_test.go @@ -0,0 +1,110 @@ +package engine + +import ( + "context" + "strings" + "testing" +) + +// TestPostgreSQLOnlySupport ensures that non-PostgreSQL syntax is properly rejected +func TestPostgreSQLOnlySupport(t *testing.T) { + engine := NewTestSQLEngine() + + testCases := []struct { + name string + sql string + shouldError bool + errorMsg string + desc string + }{ + // Test that MySQL backticks are not supported for identifiers + { + name: "MySQL_Backticks_Table", + sql: "SELECT * FROM `user_events` LIMIT 1", + shouldError: true, + desc: "MySQL backticks for table names should be rejected", + }, + { + name: "MySQL_Backticks_Column", + sql: "SELECT `column_name` FROM user_events LIMIT 1", + shouldError: true, + desc: "MySQL backticks for column names should be rejected", + }, + + // Test that PostgreSQL double quotes work (should NOT error) + { + name: "PostgreSQL_Double_Quotes_OK", + sql: `SELECT "user_id" FROM user_events LIMIT 1`, + shouldError: false, + desc: "PostgreSQL double quotes for identifiers should work", + }, + + // Note: MySQL functions like YEAR(), MONTH() may parse but won't have proper implementations + // They're removed from the engine so they won't work correctly, but we don't explicitly reject them + + // Test that PostgreSQL EXTRACT works (should NOT error) + { + name: "PostgreSQL_EXTRACT_OK", + sql: "SELECT EXTRACT(YEAR FROM CURRENT_DATE) FROM user_events LIMIT 1", + shouldError: false, + desc: "PostgreSQL EXTRACT function should work", + }, + + // Test that single quotes work for string literals but not identifiers + { + name: "Single_Quotes_String_Literal_OK", + sql: "SELECT 'hello world' FROM user_events LIMIT 1", + shouldError: false, + desc: "Single quotes for string literals should work", + }, + } + + passCount := 0 + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result, err := engine.ExecuteSQL(context.Background(), tc.sql) + + if tc.shouldError { + // We expect this query to fail + if err == nil && result.Error == nil { + t.Errorf("❌ Expected error for %s, but query succeeded", tc.desc) + return + } + + // Check for specific error message if provided + if tc.errorMsg != "" { + errorText := "" + if err != nil { + errorText = err.Error() + } else if result.Error != nil { + errorText = result.Error.Error() + } + + if !strings.Contains(errorText, tc.errorMsg) { + t.Errorf("❌ Expected error containing '%s', got: %s", tc.errorMsg, errorText) + return + } + } + + t.Logf("CORRECTLY REJECTED: %s", tc.desc) + passCount++ + } else { + // We expect this query to succeed + if err != nil { + t.Errorf("Unexpected error for %s: %v", tc.desc, err) + return + } + + if result.Error != nil { + t.Errorf("Unexpected result error for %s: %v", tc.desc, result.Error) + return + } + + t.Logf("CORRECTLY ACCEPTED: %s", tc.desc) + passCount++ + } + }) + } + + t.Logf("PostgreSQL-only compliance: %d/%d tests passed", passCount, len(testCases)) +} |
