From aaf11b931f2fbb5a3f9c520d4c3c7e9cd32dd4e1 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 22 Mar 2003 02:12:24 +0000 Subject: [PATCH] Back out to_char fixes until regression tests are fixed. --- src/backend/utils/adt/formatting.c | 91 +++++++++++++----------------- 1 file changed, 38 insertions(+), 53 deletions(-) diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 89671b7f20..0b97519d43 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- * formatting.c * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.59 2003/03/20 05:19:26 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.60 2003/03/22 02:12:24 momjian Exp $ * * * Portions Copyright (c) 1999-2002, PostgreSQL Global Development Group @@ -276,19 +276,17 @@ typedef struct * Flags for NUMBER version * ---------- */ -#define NUM_F_DECIMAL 1 << 1 -#define NUM_F_LDECIMAL 1 << 2 -#define NUM_F_ZERO 1 << 3 -#define NUM_F_BLANK 1 << 4 -#define NUM_F_FILLMODE 1 << 5 -#define NUM_F_LSIGN 1 << 6 -#define NUM_F_BRACKET 1 << 7 -#define NUM_F_MINUS 1 << 8 -#define NUM_F_PLUS 1 << 9 -#define NUM_F_ROMAN 1 << 10 -#define NUM_F_MULTI 1 << 11 -#define NUM_F_PLUS_POST 1 << 12 -#define NUM_F_MINUS_POST 1 << 13 +#define NUM_F_DECIMAL 0x01 +#define NUM_F_LDECIMAL 0x02 +#define NUM_F_ZERO 0x04 +#define NUM_F_BLANK 0x08 +#define NUM_F_FILLMODE 0x10 +#define NUM_F_LSIGN 0x20 +#define NUM_F_BRACKET 0x40 +#define NUM_F_MINUS 0x80 +#define NUM_F_PLUS 0x100 +#define NUM_F_ROMAN 0x200 +#define NUM_F_MULTI 0x400 #define NUM_LSIGN_PRE -1 #define NUM_LSIGN_POST 1 @@ -1054,8 +1052,6 @@ NUMDesc_prepare(NUMDesc *num, FormatNode *n) elog(ERROR, "to_char/to_number(): can't use 'S' and 'MI' together."); } num->flag |= NUM_F_MINUS; - if (IS_DECIMAL(num)) - num->flag |= NUM_F_MINUS_POST; break; case NUM_PL: @@ -1065,8 +1061,6 @@ NUMDesc_prepare(NUMDesc *num, FormatNode *n) elog(ERROR, "to_char/to_number(): can't use 'S' and 'PL' together."); } num->flag |= NUM_F_PLUS; - if (IS_DECIMAL(num)) - num->flag |= NUM_F_PLUS_POST; break; case NUM_SG: @@ -3886,36 +3880,28 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, else { Np->sign = sign; - - /* MI/PL/SG - write sign itself and not in number */ - if (IS_PLUS(Np->Num) || IS_MINUS(Np->Num)) + + if (Np->sign != '-') { - if (IS_PLUS(Np->Num) && IS_MINUS(Np->Num)==FALSE) - Np->sign_wrote = FALSE; - Np->sign_pos = -1; + Np->Num->flag &= ~NUM_F_BRACKET; + Np->Num->flag &= ~NUM_F_MINUS; } + else if (Np->sign != '+') + Np->Num->flag &= ~NUM_F_PLUS; + + if (Np->sign == '+' && IS_FILLMODE(Np->Num) && !IS_LSIGN(Np->Num)) + Np->sign_wrote = TRUE; /* needn't sign */ else - { - if (Np->sign != '-') - { - if (IS_BRACKET(Np->Num)) - Np->Num->flag &= ~NUM_F_BRACKET; - if (IS_MINUS(Np->Num)) - Np->Num->flag &= ~NUM_F_MINUS; - } - else if (Np->sign != '+' && IS_PLUS(Np->Num)) - Np->Num->flag &= ~NUM_F_PLUS; + Np->sign_wrote = FALSE; /* need sign */ - if (Np->sign == '+' && IS_FILLMODE(Np->Num) && !IS_LSIGN(Np->Num)) - Np->sign_wrote = TRUE; /* needn't sign */ - else - Np->sign_wrote = FALSE; /* need sign */ + Np->sign_pos = -1; - Np->sign_pos = -1; + if (Np->Num->lsign == NUM_LSIGN_PRE && Np->Num->pre == Np->Num->pre_lsign_num) + Np->Num->lsign = NUM_LSIGN_POST; - if (Np->Num->lsign == NUM_LSIGN_PRE && Np->Num->pre == Np->Num->pre_lsign_num) - Np->Num->lsign = NUM_LSIGN_POST; - } + /* MI/PL/SG - write sign itself and not in number */ + if (IS_PLUS(Np->Num) || IS_MINUS(Np->Num)) + Np->sign_wrote = TRUE; /* needn't sign */ } /* @@ -3931,7 +3917,7 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, { if (IS_DECIMAL(Np->Num)) Np->last_relevant = get_last_relevant_decnum( - Np->number + + Np->number + ((Np->Num->zero_end - Np->num_pre > 0) ? Np->Num->zero_end - Np->num_pre : 0)); } @@ -3960,15 +3946,17 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, /* * terrible Ora format */ - if (IS_ZERO(Np->Num)==FALSE && *Np->number == '0' && - IS_FILLMODE(Np->Num)==FALSE && Np->Num->post) + if (!IS_ZERO(Np->Num) && *Np->number == '0' && + !IS_FILLMODE(Np->Num) && Np->Num->post != 0) { ++Np->sign_pos; if (IS_LSIGN(Np->Num)) { - if (Np->Num->lsign != NUM_LSIGN_PRE) + if (Np->Num->lsign == NUM_LSIGN_PRE) + ++Np->sign_pos; + else --Np->sign_pos; } } @@ -3987,8 +3975,8 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, #ifdef DEBUG_TO_FROM_CHAR elog(DEBUG_elog_output, - "\n\tSIGN: '%c'\n\tNUM: '%s'\n\tPRE: %d\n\tPOST: %d\n\tNUM_COUNT: %d\n\tNUM_PRE: %d\n\tSIGN_POS: %d\n\tSIGN_WROTE: %s\n\tZERO: %s\n\tZERO_START: %d\n\tZERO_END: %d\n\tLAST_RELEVANT: %s\n\tBRACKET: %s\n\tPLUS: %s\n\tMINUS: %s", - Np->sign, + + "\n\tNUM: '%s'\n\tPRE: %d\n\tPOST: %d\n\tNUM_COUNT: %d\n\tNUM_PRE: %d\n\tSIGN_POS: %d\n\tSIGN_WROTE: %s\n\tZERO: %s\n\tZERO_START: %d\n\tZERO_END: %d\n\tLAST_RELEVANT: %s", Np->number, Np->Num->pre, Np->Num->post, @@ -3999,11 +3987,8 @@ NUM_processor(FormatNode *node, NUMDesc *Num, char *inout, char *number, IS_ZERO(Np->Num) ? "Yes" : "No", Np->Num->zero_start, Np->Num->zero_end, - Np->last_relevant ? Np->last_relevant : "", - IS_BRACKET(Np->Num) ? "Yes" : "No", - IS_PLUS(Np->Num) ? "Yes" : "No", - IS_MINUS(Np->Num) ? "Yes" : "No" - ); + Np->last_relevant ? Np->last_relevant : "" + ); #endif /* -- 2.40.0