summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Taylor <davidt@yadt.co.uk>2012-10-19 01:18:33 +0200
committerFrédéric Buclin <LpSolit@gmail.com>2012-10-19 01:18:33 +0200
commit71ce45b150b938a2c18a7809f5afe23e2c2e7c49 (patch)
treee7ff9a2f8178c4473d8264b71f2f0c2ce6018f8a
parent1b7e8f9cfffcd8344620a1013c20fee8355028a1 (diff)
downloadbugzilla-71ce45b150b938a2c18a7809f5afe23e2c2e7c49.tar.gz
bugzilla-71ce45b150b938a2c18a7809f5afe23e2c2e7c49.tar.xz
Bug 780053: Oracle crashes when listing keywords or flags in buglists
r/a=LpSolit
-rw-r--r--Bugzilla/DB/Oracle.pm22
1 files changed, 13 insertions, 9 deletions
diff --git a/Bugzilla/DB/Oracle.pm b/Bugzilla/DB/Oracle.pm
index da263e084..4a69db16d 100644
--- a/Bugzilla/DB/Oracle.pm
+++ b/Bugzilla/DB/Oracle.pm
@@ -124,7 +124,8 @@ sub bz_explain {
sub sql_group_concat {
my ($self, $text, $separator) = @_;
$separator = $self->quote(', ') if !defined $separator;
- return "group_concat(T_CLOB_DELIM($text, $separator))";
+ my ($distinct, $rest) = $text =~/^(\s*DISTINCT\s|)(.+)$/i;
+ return "group_concat($distinct T_CLOB_DELIM(NVL($rest, ' '), $separator))";
}
sub sql_regexp {
@@ -545,14 +546,17 @@ sub bz_setup_database {
. " RETURN NUMBER IS BEGIN RETURN LENGTH(COLUMN_NAME); END;");
# Create types for group_concat
- my $t_clob_delim = $self->selectcol_arrayref("
- SELECT TYPE_NAME FROM USER_TYPES WHERE TYPE_NAME=?",
- undef, 'T_CLOB_DELIM');
-
- if ( !@$t_clob_delim ) {
- $self->do("CREATE OR REPLACE TYPE T_CLOB_DELIM AS OBJECT "
- . "( p_CONTENT CLOB, p_DELIMITER VARCHAR2(256));");
- }
+ $self->do("DROP TYPE T_GROUP_CONCAT");
+ $self->do("CREATE OR REPLACE TYPE T_CLOB_DELIM AS OBJECT "
+ . "( p_CONTENT CLOB, p_DELIMITER VARCHAR2(256)"
+ . ", MAP MEMBER FUNCTION T_CLOB_DELIM_ToVarchar return VARCHAR2"
+ . ");");
+ $self->do("CREATE OR REPLACE TYPE BODY T_CLOB_DELIM IS
+ MAP MEMBER FUNCTION T_CLOB_DELIM_ToVarchar return VARCHAR2 is
+ BEGIN
+ RETURN p_CONTENT;
+ END;
+ END;");
$self->do("CREATE OR REPLACE TYPE T_GROUP_CONCAT AS OBJECT
( CLOB_CONTENT CLOB,