Index: misc.h =================================================================== RCS file: /projects/pgadmin3/src/include/misc.h,v retrieving revision 1.44 retrieving revision 1.45 diff -Lsrc/include/misc.h -Lsrc/include/misc.h -u -w -r1.44 -r1.45 --- src/include/misc.h +++ src/include/misc.h @@ -94,18 +94,13 @@ // Quoting wxString qtString(const wxString& value); // add ' and escape if necessary wxString qtIdent(const wxString& value); // add " if necessary +wxString qtTypeIdent(const wxString& value); // add " if necessary wxString qtStringDollar(const wxString &value); wxString qtStrip(const wxString& value); // remove \" // check if size/pos have reasonable values void CheckOnScreen(wxPoint &pos, wxSize &size, const int w0=100, const int h0=70); -// Keith 2003.03.11 -// We need an identifier validation function - -// Validation -bool IsValidIdentifier(wxString ident); - // string build helper void AppendIfFilled(wxString &str, const wxString &delimiter, const wxString &what); Index: version.h =================================================================== RCS file: /projects/pgadmin3/src/include/version.h,v retrieving revision 1.9 retrieving revision 1.10 diff -Lsrc/include/version.h -Lsrc/include/version.h -u -w -r1.9 -r1.10 --- src/include/version.h +++ src/include/version.h @@ -11,9 +11,9 @@ // Application Versions -#define VERSION_STR wxT("1.2.0 Beta 1") +#define VERSION_STR wxT("1.2.0 Post Beta 1") #define VERSION_NUM 1,2,0,0 -#define VERSION_PACKAGE 1.2.0-beta1 +#define VERSION_PACKAGE 1.2.0-post-beta1 #define PRERELEASE 1 // #define BUILD "..." Index: pgDatatype.h =================================================================== RCS file: /projects/pgadmin3/src/include/pgDatatype.h,v retrieving revision 1.10 retrieving revision 1.11 diff -Lsrc/include/pgDatatype.h -Lsrc/include/pgDatatype.h -u -w -r1.10 -r1.11 --- src/include/pgDatatype.h +++ src/include/pgDatatype.h @@ -29,7 +29,7 @@ wxString LengthString() const { return length; } wxString Array() const { return array; } wxString FullName() const { return name + length + array; } - wxString QuotedFullName() const { return qtIdent(name) + length + array; } + wxString QuotedFullName() const { return qtTypeIdent(name) + length + array; } wxString GetSchemaPrefix(pgDatabase *db) const; wxString GetQuotedSchemaPrefix(pgDatabase *db) const; long Length() const { return len; } Index: pgOperator.cpp =================================================================== RCS file: /projects/pgadmin3/src/schema/pgOperator.cpp,v retrieving revision 1.23 retrieving revision 1.24 diff -Lsrc/schema/pgOperator.cpp -Lsrc/schema/pgOperator.cpp -u -w -r1.23 -r1.24 --- src/schema/pgOperator.cpp +++ src/schema/pgOperator.cpp @@ -34,12 +34,12 @@ wxString sql = wxT("DROP OPERATOR ") + GetFullIdentifier(); if (GetLeftType().Length() > 0) - sql += wxT(" (") + qtIdent(GetLeftType()); + sql += wxT(" (") + qtTypeIdent(GetLeftType()); else sql += wxT(") (NONE"); if (GetRightType().Length() > 0) - sql += wxT(", ") + qtIdent(GetLeftType()) + wxT(")"); + sql += wxT(", ") + qtTypeIdent(GetLeftType()) + wxT(")"); else sql += wxT(", NONE)"); @@ -56,8 +56,8 @@ + wxT("(") + GetOperands() + wxT(");\n\n") wxT("CREATE OPERATOR ") + GetFullIdentifier() + wxT("(\n PROCEDURE = ") + qtIdent(GetOperatorFunction()); - AppendIfFilled(sql, wxT(",\n LEFTARG = "), qtIdent(GetLeftType())); - AppendIfFilled(sql, wxT(",\n RIGHTARG = "), qtIdent(GetRightType())); + AppendIfFilled(sql, wxT(",\n LEFTARG = "), qtTypeIdent(GetLeftType())); + AppendIfFilled(sql, wxT(",\n RIGHTARG = "), qtTypeIdent(GetRightType())); AppendIfFilled(sql, wxT(",\n COMMUTATOR = "), GetCommutator()); AppendIfFilled(sql, wxT(",\n RESTRICT = "), qtIdent(GetRestrictFunction())); AppendIfFilled(sql, wxT(",\n JOIN = "), qtIdent(GetJoinFunction())); Index: misc.cpp =================================================================== RCS file: /projects/pgadmin3/src/utils/misc.cpp,v retrieving revision 1.56 retrieving revision 1.57 diff -Lsrc/utils/misc.cpp -Lsrc/utils/misc.cpp -u -w -r1.56 -r1.57 --- src/utils/misc.cpp +++ src/utils/misc.cpp @@ -39,7 +39,10 @@ extern "C" { +#define YYSTYPE +#define DECIMAL DECIMAL_P #include "parser/keywords.h" +#include "parser/parse.h" } // we dont have an appropriate wxLongLong method @@ -246,41 +249,94 @@ } -wxString qtIdent(const wxString& value) -{ - wxString result = value; - bool needQuoting=false; - - if (result.Length() == 0) - return result; - - int pos = 0; +static bool needsQuoting(wxString& value, bool forTypes) +{ // Replace Double Quotes - result.Replace(wxT("\""), wxT("\"\"")); + if (value.Replace(wxT("\""), wxT("\"\"")) > 0) + return true; // Is it a number? - if (result.IsNumber()) - needQuoting = true; + if (value.IsNumber()) + return true; else { - while (pos < (int)result.length()) + int pos = 0; + while (pos < (int)value.length()) { - if (!((result.GetChar(pos) >= '0') && (result.GetChar(pos) <= '9')) && - !((result.GetChar(pos) >= 'a') && (result.GetChar(pos) <= 'z')) && - !(result.GetChar(pos) == '_')) + wxChar c=value.GetChar(pos); + if (!(c >= '0' && c <= '9') && + !(c >= 'a' && c <= 'z') && + !(c == '_')) { - needQuoting = true; - break; + return true; } pos++; } } - if (!needQuoting && ScanKeywordLookup(value.ToAscii())) - needQuoting = true; + // is it a keyword? + const ScanKeyword *sk=ScanKeywordLookup(value.ToAscii()); + if (sk) + { + if (forTypes) + { + switch (sk->value) + { + case ANY: + case BIGINT: + case BIT: + case BOOLEAN_P: + case CHAR_P: + case CHARACTER: + case DECIMAL: + case DOUBLE_P: + case FLOAT_P: + case INT_P: + case INTEGER: + case INTERVAL: + case NUMERIC: + case SET: + case SMALLINT: + case TIME: + case TIMESTAMP: + case TRIGGER: + case VARCHAR: + break; + default: + return true; + } + } + else + return true; + } + + return false; +} + + +wxString qtTypeIdent(const wxString& value) +{ + if (value.Length() == 0) + return value; - if (needQuoting) + wxString result = value; + + if (needsQuoting(result, true)) + return wxT("\"") + result + wxT("\""); + else + return result; +} + + +wxString qtIdent(const wxString& value) +{ + if (value.Length() == 0) + return value; + + wxString result = value; + + if (needsQuoting(result, false)) return wxT("\"") + result + wxT("\""); else return result; @@ -344,34 +400,6 @@ } -// Keith 2003.03.11 -// We need an identifier validation function -bool IsValidIdentifier(wxString ident) -{ - // compiler complains if not unsigned - unsigned int len = ident.length(); - if (!len) - return false; - - wxString first = - wxT("_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); - wxString second = - wxT("_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); - - if (!first.Contains(ident.Left(1))) - return false; - - unsigned int si; - for ( si = 1; si < len; si++) - { - if (!second.Contains(ident.Mid(si, 1))) - return false; - } - - return true; -} - - queryTokenizer::queryTokenizer(const wxString& str, const wxChar delim) : wxStringTokenizer() {