mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Commit of a *MAJOR* patch from Dan McGuirk <djm@indirect.com>
Changes: * Unique index capability works using the syntax 'create unique index'. * Duplicate OID's in the system tables are removed. I put little scripts called 'duplicate_oids' and 'find_oid' in include/catalog that help to find and remove duplicate OID's. I also moved 'unused_oids' from backend/catalog to include/catalog, since it has to be in the same directory as the include files in order to work. * The backend tries converting the name of a function or aggregate to all lowercase if the original name given doesn't work (mostly for compatibility with ODBC). * You can 'SELECT NULL' to your heart's content. * I put my _bt_updateitem fix in instead, which uses _bt_insertonpg so that even if the new key is so big that the page has to be split, everything still works. * All literal references to system catalog OID's have been replaced with references to define'd constants from the catalog header files. * I added a couple of node copy functions. I think this was a preliminary attempt to get rules to work.
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.14 1996/11/10 03:01:10 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.15 1996/11/13 20:48:55 scrappy Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -77,6 +77,9 @@ static void AddAggToParseState(ParseState *pstate, Aggreg *aggreg);
|
||||
static void finalizeAggregates(ParseState *pstate, Query *qry);
|
||||
static void parseCheckAggregates(ParseState *pstate, Query *qry);
|
||||
|
||||
static bool is_lowercase(char *string);
|
||||
static void make_lowercase(char *string);
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
*****************************************************************************/
|
||||
@@ -1869,6 +1872,30 @@ ParseComplexProjection(ParseState *pstate,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static bool is_lowercase(char *string)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i < strlen(string); i++) {
|
||||
if(string[i] >= 'A' && string[i] <= 'Z') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void make_lowercase(char *string)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i < strlen(string); i++) {
|
||||
if(string[i] >= 'A' && string[i] <= 'Z') {
|
||||
string[i] = (string[i] - 'A') + 'a';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Node *
|
||||
ParseFunc(ParseState *pstate, char *funcname, List *fargs, int *curr_resno)
|
||||
{
|
||||
@@ -1987,6 +2014,27 @@ ParseFunc(ParseState *pstate, char *funcname, List *fargs, int *curr_resno)
|
||||
|
||||
AddAggToParseState(pstate, aggreg);
|
||||
return (Node*)aggreg;
|
||||
} else {
|
||||
/* try one more time with lowercase --djm 8/17/96 */
|
||||
if(!is_lowercase(funcname)) {
|
||||
char *lowercase_funcname = strdup(funcname);
|
||||
|
||||
make_lowercase(lowercase_funcname);
|
||||
if (strcmp(lowercase_funcname, "count") == 0)
|
||||
basetype = 0;
|
||||
else
|
||||
basetype = exprType(lfirst(fargs));
|
||||
if (SearchSysCacheTuple(AGGNAME,
|
||||
PointerGetDatum(lowercase_funcname),
|
||||
ObjectIdGetDatum(basetype),
|
||||
0, 0)) {
|
||||
Aggreg *aggreg = ParseAgg(lowercase_funcname,
|
||||
basetype, lfirst(fargs));
|
||||
|
||||
AddAggToParseState(pstate, aggreg);
|
||||
return (Node*)aggreg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user