diff --git a/.all-contributorsrc b/.all-contributorsrc
index 163b1a1c8c..49cbdc61ba 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -987,7 +987,8 @@
"avatar_url": "https://avatars.githubusercontent.com/u/12729644?v=4",
"profile": "https://github.com/Clint-Chester",
"contributions": [
- "code", "bug"
+ "code",
+ "bug"
]
},
{
@@ -6427,8 +6428,18 @@
"contributions": [
"bug"
]
+ },
+ {
+ "login": "kevingnet",
+ "name": "Kevin Guerra",
+ "avatar_url": "https://avatars.githubusercontent.com/u/5151740?v=4",
+ "profile": "https://github.com/kevingnet",
+ "contributions": [
+ "code"
+ ]
}
],
"contributorsPerLine": 7,
- "contributorsSortAlphabetically": true
+ "contributorsSortAlphabetically": true,
+ "skipCi": true
}
diff --git a/docs/_config.yml b/docs/_config.yml
index ca829f79b7..0e5f147a3d 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -2,7 +2,7 @@ repository: pmd/pmd
pmd:
version: 7.0.0-SNAPSHOT
- previous_version: 6.38.0
+ previous_version: 6.39.0
date: ??-?????-2021
release_type: major
diff --git a/docs/pages/next_major_development.md b/docs/pages/next_major_development.md
index 97d9c9329d..10b51e34d8 100644
--- a/docs/pages/next_major_development.md
+++ b/docs/pages/next_major_development.md
@@ -246,6 +246,10 @@ the breaking API changes will be performed in 7.0.0.
an API is tagged as `@Deprecated` or not in the latest minor release. During the development of 7.0.0,
we may decide to remove some APIs that were not tagged as deprecated, though we'll try to avoid it." %}
+#### 6.39.0
+
+No changes.
+
#### 6.38.0
No changes.
diff --git a/docs/pages/pmd/projectdocs/credits.md b/docs/pages/pmd/projectdocs/credits.md
index 0059d376f0..e2c76b6ce6 100644
--- a/docs/pages/pmd/projectdocs/credits.md
+++ b/docs/pages/pmd/projectdocs/credits.md
@@ -375,545 +375,546 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Keve MΓΌller π |
+ Kevin Guerra π» |
Kevin Jones π |
Kevin Wayne π |
Kieran Black π |
Kirill Zubov π |
Kirk Clemens π» π |
- Klaus Hartl π |
+ Klaus Hartl π |
Koen Van Looveren π |
Kris Scheibe π» π |
Kunal Thanki π |
Larry Diamond π» π |
Lars Knickrehm π |
Leo Gutierrez π |
- Lintsi π |
+ Lintsi π |
Linus Fernandes π |
Lixon Lookose π |
Logesh π |
Lorenzo Gabriele π |
LoΓ―c Ledoyen π |
Lucas Silva π |
- Lucas Soncini π» π |
+ Lucas Soncini π» π |
Lukasz Slonina π |
Lukebray π |
Lyor Goldstein π |
MCMicS π |
Macarse π |
Machine account for PMD π» |
- Maciek Siemczyk π |
+ Maciek Siemczyk π |
Maikel Steneker π» π |
Maksim Moiseikin π |
Manfred Koch π |
Manuel Moya Ferrer π» π |
Manuel Ryan π |
Marat Vyshegorodtsev π |
- Marcel HΓ€rle π |
+ Marcel HΓ€rle π |
Marcello Fialho π |
Marcin Rataj π |
Mark Adamcin π |
Mark Hall π» π |
Mark Kolich π |
Mark Pritchard π |
- Markus Rathgeb π |
+ Markus Rathgeb π |
Marquis Wang π |
Martin Feldsztejn π |
Martin Lehmann π |
Martin Spamer π |
Martin TarjΓ‘nyi π |
MatFl π |
- Mateusz Stefanski π |
+ Mateusz Stefanski π |
Mathieu Gouin π |
MatiasComercio π» π |
Matt Benson π |
Matt De Poorter π |
Matt Harrah π |
Matt Nelson π |
- Matthew Amos π |
+ Matthew Amos π |
Matthew Duggan π |
Matthew Hall π |
MatΓas Fraga π» π |
Maxime Robert π» π |
Michael π |
Michael Bell π |
- Michael Bernstein π |
+ Michael Bernstein π |
Michael Clay π |
Michael Dombrowski π |
Michael Hausegger π |
Michael Hoefer π |
Michael MΓΆbius π |
Michael N. Lipp π |
- Michael Pellegrini π |
+ Michael Pellegrini π |
Michal Kordas π |
MichaΕ Borek π |
MichaΕ KuliΕski π |
Miguel NΓΊΓ±ez DΓaz-Montes π |
Mihai Ionut π |
Mirek Hankus π |
- Mladjan Gadzic π |
+ Mladjan Gadzic π |
MrAngry52 π |
Muminur Choudhury π |
Mykhailo Palahuta π» π |
Nagendra Kumar Singh π |
Nahuel Barrios π |
Nathan Braun π |
- Nathan Reynolds π |
+ Nathan Reynolds π |
Nathan Reynolds π |
NathanaΓ«l π |
Nazdravi π |
Neha-Dhonde π |
Nicholas Doyle π |
Nick Butcher π |
- Nico Gallinal π |
+ Nico Gallinal π |
Nicola Dal Maso π |
Nikita Chursin π |
Niklas Baudy π |
Nikolas Havrikov π |
Nilesh Virkar π |
Nimit Patel π |
- Niranjan Harpale π |
+ Niranjan Harpale π |
Noah Sussman π |
Noah0120 π |
Noam Tamim π |
Noel Grandin π |
Olaf Haalstra π |
Oleg Pavlenko π |
- Oliver Eikemeier π |
+ Oliver Eikemeier π |
Olivier Parent π» π |
Ollie Abbey π» π |
OverDrone π |
Ozan Gulle π» π |
PUNEET JAIN π |
Parbati Bose π |
- Paul Berg π |
+ Paul Berg π |
Pavel Bludov π |
Pavel MiΔka π |
Pedro Nuno Santos π |
Pedro Rijo π |
Pelisse Romain π» π π |
Pete Davids π |
- Peter Bruin π |
+ Peter Bruin π |
Peter Chittum π» π |
Peter Cudmore π |
Peter Kasson π |
Peter Kofler π |
Pham Hai Trung π |
Philip Graf π» π |
- Philip Hachey π |
+ Philip Hachey π |
Philippe Ozil π |
Phinehas Artemix π |
Phokham Nonava π |
Piotr SzymaΕski π |
Piotrek Ε»ygieΕo π» π |
Pranay Jaiswal π |
- Prasad Kamath π |
+ Prasad Kamath π |
Prasanna π |
Presh-AR π |
Puneet1726 π |
Rafael CortΓͺs π |
RaheemShaik999 π |
RajeshR π» π |
- Ramachandra Mohan π |
+ Ramachandra Mohan π |
Raquel Pau π |
Ravikiran Janardhana π |
Reda Benhemmouche π |
Renato Oliveira π» π |
Rich DiCroce π |
Riot R1cket π |
- Rishabh Jain π |
+ Rishabh Jain π |
RishabhDeep Singh π |
Robbie Martinus π» π |
Robert Henry π |
Robert Painsi π |
Robert Russell π |
Robert SΓΆsemann π» π π’ π |
- Robert Whitebit π |
+ Robert Whitebit π |
Robin Richtsfeld π |
Robin Stocker π» π |
Robin Wils π |
RochusOest π |
Rodolfo Noviski π |
Rodrigo Casara π |
- Rodrigo Fernandes π |
+ Rodrigo Fernandes π |
Roman Salvador π» π |
Ronald Blaschke π |
RΓ³bert Papp π |
Saikat Sengupta π |
Saksham Handu π |
Saladoc π |
- Salesforce Bob Lightning π |
+ Salesforce Bob Lightning π |
Sam Carlberg π |
Satoshi Kubo π |
Scott Kennedy π |
Scott Wells π |
Sebastian BΓΆgl π |
Sebastian Schuberth π |
- Sebastian Schwarz π |
+ Sebastian Schwarz π |
Sergey Gorbaty π |
Sergey Kozlov π |
Sergey Yanzin π» π |
Shubham π» π |
Simon Xiao π |
Srinivasan Venkatachalam π |
- Stanislav Gromov π |
+ Stanislav Gromov π |
Stefan Birkner π |
Stefan Bohn π |
Stefan Endrullis π |
Stefan KlΓΆss-Schuster π |
Stefan Wolf π |
Stephan H. Wissel π |
- Stephen π |
+ Stephen π |
Stephen Friedrich π |
Stexxe π |
Stian LΓ₯gstad π |
StuartClayton5 π |
Supun Arunoda π |
Suren Abrahamyan π |
- SwatiBGupta1110 π |
+ SwatiBGupta1110 π |
SyedThoufich π |
Szymon Sasin π |
T-chuangxin π |
TERAI Atsuhiro π |
TIOBE Software π» π |
Taylor Smock π |
- Techeira DamiΓ‘n π» π |
+ Techeira DamiΓ‘n π» π |
Ted Husted π |
TehBakker π |
The Gitter Badger π |
Theodoor π |
Thiago Henrique HΓΌpner π |
Thibault Meyer π |
- Thomas GΓΌttler π |
+ Thomas GΓΌttler π |
Thomas Jones-Low π |
Thomas Smith π» π |
ThrawnCA π |
Thunderforge π» π |
Tim van der Lippe π |
Tobias Weimer π» π |
- Tom Daly π |
+ Tom Daly π |
Tomer Figenblat π |
Tomi De Lucca π» π |
Torsten Kleiber π |
TrackerSB π |
Ullrich Hafner π |
Utku Cuhadaroglu π» π |
- Valentin Brandl π |
+ Valentin Brandl π |
Valeria π |
Vasily Anisimov π |
Vickenty Fesunov π |
Victor NoΓ«l π |
Vincent HUYNH π |
Vincent Maurin π |
- Vincent Privat π |
+ Vincent Privat π |
Vishhwas π |
Vitaly π |
Vitaly Polonetsky π |
Vojtech Polivka π |
Vsevolod Zholobov π |
Wang Shidong π |
- Waqas Ahmed π |
+ Waqas Ahmed π |
Wayne J. Earl π |
Wchenghui π |
Will Winder π |
William Brockhus π» π |
Wilson Kurniawan π |
Wim Deblauwe π |
- Woongsik Choi π |
+ Woongsik Choi π |
XenoAmess π» π |
YaroslavTER π |
Young Chan π» π |
YuJin Kim π |
Yuri Dolzhenko π |
Yurii Dubinka π |
- Zoltan Farkas π |
+ Zoltan Farkas π |
Zustin π |
aaronhurst-google π |
alexmodis π |
andreoss π |
andrey81inmd π» π |
anicoara π |
- arunprasathav π |
+ arunprasathav π |
asiercamara π |
astillich-igniti π» |
avesolovksyy π |
avishvat π |
avivmu π |
axelbarfod1 π |
- b-3-n π |
+ b-3-n π |
balbhadra9 π |
base23de π |
bergander π |
berkam π» π |
breizh31 π |
caesarkim π |
- carolyujing π |
+ carolyujing π |
cesares-basilico π |
chrite π |
cobratbq π |
coladict π |
cosmoJFH π |
cristalp π |
- crunsk π |
+ crunsk π |
cwholmes π |
cyberjj999 π |
cyw3 π |
d1ss0nanz π |
danbrycefairsailcom π |
dariansanity π |
- darrenmiliband π |
+ darrenmiliband π |
davidburstrom π |
dbirkman-paloalto π |
deepak-patra π |
dependabot[bot] π» π |
dinesh150 π |
diziaq π |
- dreaminpast123 π |
+ dreaminpast123 π |
duanyanan π |
dutt-sanjay π |
dylanleung π |
dzeigler π |
ekkirala π |
emersonmoura π |
- fairy π |
+ fairy π |
foxmason π |
frankegabor π |
frankl π |
freafrea π |
fsapatin π |
gracia19 π |
- guo fei π |
+ guo fei π |
gurmsc5 π |
gwilymatgearset π» π |
haigsn π |
hemanshu070 π |
henrik242 π |
hongpuwu π |
- hvbtup π» π |
+ hvbtup π» π |
igniti GmbH π |
ilovezfs π |
itaigilo π |
jakivey32 π |
jbennett2091 π |
jcamerin π |
- jkeener1 π |
+ jkeener1 π |
jmetertea π |
josemanuelrolon π» π |
kabroxiko π» π |
karwer π |
kaulonline π |
kdaemonv π |
- kenji21 π» π |
+ kenji21 π» π |
kfranic π |
khalidkh π |
krzyk π |
lasselindqvist π |
lihuaib π |
lonelyma1021 π |
- lpeddy π |
+ lpeddy π |
lyriccoder π |
marcelmore π |
matchbox π |
matthiaskraaz π |
meandonlyme π |
mikesive π |
- milossesic π |
+ milossesic π |
mriddell95 π |
mrlzh π |
msloan π |
mucharlaravalika π |
mvenneman π |
nareshl119 π |
- nicolas-harraudeau-sonarsource π |
+ nicolas-harraudeau-sonarsource π |
noerremark π |
novsirion π |
oggboy π |
oinume π |
orimarko π» π |
pallavi agarwal π |
- parksungrin π |
+ parksungrin π |
patpatpat123 π |
patriksevallius π |
pbrajesh1 π |
phoenix384 π |
piotrszymanski-sc π» |
plan3d π |
- poojasix π |
+ poojasix π |
prabhushrikant π |
pujitha8783 π |
r-r-a-j π |
raghujayjunk π |
rajeshveera π |
rajeswarreddy88 π |
- recdevs π |
+ recdevs π |
reudismam π» π |
rijkt π |
rillig-tk π |
rmohan20 π» π |
rxmicro π |
ryan-gustafson π» π |
- sabi0 π |
+ sabi0 π |
scais π |
sebbASF π |
sergeygorbaty π» |
shilko2013 π |
simeonKondr π |
snajberk π |
- sniperrifle2004 π |
+ sniperrifle2004 π |
snuyanzin π |
sratz π |
stonio π |
sturton π» π |
sudharmohan π |
suruchidawar π |
- svenfinitiv π |
+ svenfinitiv π |
tashiscool π |
test-git-hook π |
testation21 π» π |
thanosa π |
tiandiyixian π |
tobwoerk π |
- tprouvot π |
+ tprouvot π |
trentchilders π |
triandicAnt π |
trishul14 π |
tsui π |
winhkey π |
witherspore π |
- wjljack π |
+ wjljack π |
wuchiuwong π |
xingsong π |
xioayuge π |
xnYi9wRezm π» π |
xuanuy π |
xyf0921 π |
- yalechen-cyw3 π |
+ yalechen-cyw3 π |
yasuharu-sato π |
zenglian π |
zgrzyt93 π» π |
zh3ng π |
zt_soft π |
ztt79 π |
- zzzzfeng π |
+ zzzzfeng π |
ΓrpΓ‘d MagosΓ‘nyi π |
δ»»θ΄΅ζ° π |
diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md
index 9fb8b6553b..8abb75f161 100644
--- a/docs/pages/release_notes.md
+++ b/docs/pages/release_notes.md
@@ -19,22 +19,8 @@ This is a {{ site.pmd.release_type }} release.
### New and noteworthy
-#### All Contributors
-
-PMD follows the [All Contributors](https://allcontributors.org/) specification.
-Contributions of any kind welcome!
-
-See [credits](https://pmd.github.io/latest/pmd_projectdocs_credits.html) for our complete contributors list.
-
### Fixed Issues
-* core
- * [#3499](https://github.com/pmd/pmd/pull/3499): \[core] Fix XPath rulechain with combined node tests
-* java-errorprone
- * [#3493](https://github.com/pmd/pmd/pull/3493): \[java] AvoidAccessibilityAlteration: add tests and fix rule
-* plsql
- * [#3487](https://github.com/pmd/pmd/issues/3487): \[plsql] Parsing exception OPEN ref_cursor_name FOR statement
-
### API Changes
### External Contributions
diff --git a/docs/pages/release_notes_old.md b/docs/pages/release_notes_old.md
index bb4f14fc50..f4e9390553 100644
--- a/docs/pages/release_notes_old.md
+++ b/docs/pages/release_notes_old.md
@@ -5,6 +5,55 @@ permalink: pmd_release_notes_old.html
Previous versions of PMD can be downloaded here: https://github.com/pmd/pmd/releases
+## 25-September-2021 - 6.39.0
+
+The PMD team is pleased to announce PMD 6.39.0.
+
+This is a minor release.
+
+### Table Of Contents
+
+* [New and noteworthy](#new-and-noteworthy)
+ * [All Contributors](#all-contributors)
+* [Fixed Issues](#fixed-issues)
+* [API Changes](#api-changes)
+* [External Contributions](#external-contributions)
+* [Stats](#stats)
+
+### New and noteworthy
+
+#### All Contributors
+
+PMD follows the [All Contributors](https://allcontributors.org/) specification.
+Contributions of any kind welcome!
+
+See [credits](https://pmd.github.io/latest/pmd_projectdocs_credits.html) for our complete contributors list.
+
+### Fixed Issues
+
+* core
+ * [#3499](https://github.com/pmd/pmd/pull/3499): \[core] Fix XPath rulechain with combined node tests
+* java-errorprone
+ * [#3493](https://github.com/pmd/pmd/pull/3493): \[java] AvoidAccessibilityAlteration: add tests and fix rule
+* javascript
+ * [#3516](https://github.com/pmd/pmd/pull/3516): \[javascript] NPE while creating rule violation when specifying explicit line numbers
+* plsql
+ * [#3487](https://github.com/pmd/pmd/issues/3487): \[plsql] Parsing exception OPEN ref_cursor_name FOR statement
+ * [#3515](https://github.com/pmd/pmd/issues/3515): \[plsql] Parsing exception SELECT...INTO on Associative Arrays Types
+
+### API Changes
+
+No changes.
+
+### External Contributions
+
+* [#3516](https://github.com/pmd/pmd/pull/3516): \[javascript] NPE while creating rule violation when specifying explicit line numbers - [Kevin Guerra](https://github.com/kevingnet)
+
+### Stats
+* 37 commits
+* 10 closed tickets & PRs
+* Days since last release: 27
+
## 28-August-2021 - 6.38.0
The PMD team is pleased to announce PMD 6.38.0.
diff --git a/pmd-javascript/src/test/java/net/sourceforge/pmd/lang/ecmascript/EcmasccriptLanguageModuleTest.java b/pmd-javascript/src/test/java/net/sourceforge/pmd/lang/ecmascript/EcmasccriptLanguageModuleTest.java
new file mode 100644
index 0000000000..60d698ebe5
--- /dev/null
+++ b/pmd-javascript/src/test/java/net/sourceforge/pmd/lang/ecmascript/EcmasccriptLanguageModuleTest.java
@@ -0,0 +1,46 @@
+/*
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+package net.sourceforge.pmd.lang.ecmascript;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import net.sourceforge.pmd.Rule;
+import net.sourceforge.pmd.RuleContext;
+import net.sourceforge.pmd.RuleViolation;
+import net.sourceforge.pmd.lang.LanguageRegistry;
+import net.sourceforge.pmd.lang.LanguageVersion;
+import net.sourceforge.pmd.lang.LanguageVersionHandler;
+import net.sourceforge.pmd.lang.ecmascript.ast.ASTAstRoot;
+import net.sourceforge.pmd.lang.ecmascript.ast.JsParsingHelper;
+import net.sourceforge.pmd.lang.ecmascript.rule.AbstractEcmascriptRule;
+import net.sourceforge.pmd.lang.rule.RuleViolationFactory;
+
+public class EcmasccriptLanguageModuleTest {
+ private Rule rule = new AbstractEcmascriptRule() { };
+ private ASTAstRoot node = JsParsingHelper.DEFAULT.parse("function a() {}");
+ private LanguageVersion js = LanguageRegistry.getLanguage(EcmascriptLanguageModule.NAME).getDefaultVersion();
+ private LanguageVersionHandler languageVersionHandler = js.getLanguageVersionHandler();
+ private RuleViolationFactory ruleViolationFactory = languageVersionHandler.getRuleViolationFactory();
+
+ @Test
+ public void canCreateRuleViolation() {
+ RuleContext context = new RuleContext();
+ ruleViolationFactory.addViolation(context, rule, node, "the message", new Object[0]);
+ Assert.assertEquals(1, context.getReport().getViolations().size());
+ RuleViolation ruleViolation = context.getReport().getViolations().get(0);
+ Assert.assertEquals(1, ruleViolation.getBeginLine());
+ }
+
+ @Test
+ public void canCreateRuleViolationWithLineNumbers() {
+ RuleContext context = new RuleContext();
+ ruleViolationFactory.addViolation(context, rule, node, "the message", 5, 7, new Object[0]);
+ Assert.assertEquals(1, context.getReport().getViolations().size());
+ RuleViolation ruleViolation = context.getReport().getViolations().get(0);
+ Assert.assertEquals(5, ruleViolation.getBeginLine());
+ Assert.assertEquals(7, ruleViolation.getEndLine());
+ }
+}
diff --git a/pmd-plsql/etc/grammar/PLSQL.jjt b/pmd-plsql/etc/grammar/PLSQL.jjt
index 762ad31b63..9b36d5eb48 100644
--- a/pmd-plsql/etc/grammar/PLSQL.jjt
+++ b/pmd-plsql/etc/grammar/PLSQL.jjt
@@ -2000,10 +2000,13 @@ ASTIntoClause IntoClause() :
{ return jjtThis; }
}
+// This might also be a associative array dereference...
+// see https://github.com/pmd/pmd/issues/3515
ASTVariableName VariableName() :
-{ ASTID id; StringBuilder name = new StringBuilder(); }
+{ ASTID id; ASTLiteral lit; StringBuilder name = new StringBuilder(); }
{
id = ID() { name.append(id.getImage()); }
+ [ "(" lit = Literal() ")" { name.append('(').append(lit.getImage()).append(')'); } ]
[ "." id = ID() { name.append('.').append(id.getImage()); } ]
[ "." id = ID() { name.append('.').append(id.getImage()); } ]
{
diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/PlsqlTreeDumpTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/PlsqlTreeDumpTest.java
index 089c16f76a..3a4c1cc8f8 100644
--- a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/PlsqlTreeDumpTest.java
+++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/PlsqlTreeDumpTest.java
@@ -36,4 +36,9 @@ public class PlsqlTreeDumpTest extends BaseTreeDumpTest {
public void parseOpenForStatement() {
doTest("OpenForStatement");
}
+
+ @Test
+ public void parseSelectIntoAssociativeArrayType() {
+ doTest("SelectIntoArray");
+ }
}
diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectIntoArray.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectIntoArray.pls
new file mode 100644
index 0000000000..b8698f8422
--- /dev/null
+++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectIntoArray.pls
@@ -0,0 +1,22 @@
+--
+-- See https://github.com/pmd/pmd/issues/3515
+--
+
+CREATE OR REPLACE PROCEDURE EXAMPLE_PROCEDURE IS
+ --
+ TYPE example_data_rt IS RECORD(
+ field_one PLS_INTEGER,
+ field_two PLS_INTEGER,
+ field_three PLS_INTEGER);
+ --
+ TYPE example_data_aat IS TABLE OF example_data_rt INDEX BY BINARY_INTEGER;
+ --
+ l_example_data example_data_aat;
+ --
+BEGIN
+ --
+ SELECT 1 field_value_one, 2 field_value_two, 3 field_value_three
+ INTO l_example_data(1).field_one,l_example_data(1).field_two,l_example_data(1).field_three
+ FROM DUAL;
+ --
+END EXAMPLE_PROCEDURE;
diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectIntoArray.txt b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectIntoArray.txt
new file mode 100644
index 0000000000..2709539e5e
--- /dev/null
+++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectIntoArray.txt
@@ -0,0 +1,103 @@
++- Input[@CanonicalImage = null, @ExcludedLinesCount = 0, @ExcludedRangesCount = 0, @Sourcecode = "--
+-- See https://github.com/pmd/pmd/issues/3515
+--
+
+CREATE OR REPLACE PROCEDURE EXAMPLE_PROCEDURE IS
+ --
+ TYPE example_data_rt IS RECORD(
+ field_one PLS_INTEGER,
+ field_two PLS_INTEGER,
+ field_three PLS_INTEGER);
+ --
+ TYPE example_data_aat IS TABLE OF example_data_rt INDEX BY BINARY_INTEGER;
+ --
+ l_example_data example_data_aat;
+ --
+BEGIN
+ --
+ SELECT 1 field_value_one, 2 field_value_two, 3 field_value_three
+ INTO l_example_data(1).field_one,l_example_data(1).field_two,l_example_data(1).field_three
+ FROM DUAL;
+ --
+END EXAMPLE_PROCEDURE;
+"]
+ +- Global[@CanonicalImage = null]
+ +- ProgramUnit[@CanonicalImage = null, @MethodName = "EXAMPLE_PROCEDURE", @Name = "EXAMPLE_PROCEDURE", @ObjectName = null]
+ +- MethodDeclarator[@CanonicalImage = "EXAMPLE_PROCEDURE", @Image = "EXAMPLE_PROCEDURE", @ParameterCount = 1]
+ | +- ObjectNameDeclaration[@CanonicalImage = "EXAMPLE_PROCEDURE", @Image = "EXAMPLE_PROCEDURE"]
+ | +- ID[@CanonicalImage = "EXAMPLE_PROCEDURE", @Image = "EXAMPLE_PROCEDURE"]
+ +- DeclarativeSection[@CanonicalImage = null]
+ | +- DeclarativeUnit[@CanonicalImage = null]
+ | | +- SubTypeDefinition[@CanonicalImage = "EXAMPLE_DATA_RT", @Image = "example_data_rt"]
+ | | +- QualifiedID[@CanonicalImage = "EXAMPLE_DATA_RT", @Image = "example_data_rt"]
+ | | +- FieldDeclaration[@CanonicalImage = "FIELD_ONE", @Image = "field_one"]
+ | | | +- ID[@CanonicalImage = "FIELD_ONE", @Image = "field_one"]
+ | | | +- Datatype[@CanonicalImage = "PLS_INTEGER", @Image = "PLS_INTEGER", @TypeImage = "PLS_INTEGER"]
+ | | | +- ScalarDataTypeName[@CanonicalImage = "PLS_INTEGER", @Image = "PLS_INTEGER"]
+ | | +- FieldDeclaration[@CanonicalImage = "FIELD_TWO", @Image = "field_two"]
+ | | | +- ID[@CanonicalImage = "FIELD_TWO", @Image = "field_two"]
+ | | | +- Datatype[@CanonicalImage = "PLS_INTEGER", @Image = "PLS_INTEGER", @TypeImage = "PLS_INTEGER"]
+ | | | +- ScalarDataTypeName[@CanonicalImage = "PLS_INTEGER", @Image = "PLS_INTEGER"]
+ | | +- FieldDeclaration[@CanonicalImage = "FIELD_THREE", @Image = "field_three"]
+ | | +- ID[@CanonicalImage = "FIELD_THREE", @Image = "field_three"]
+ | | +- Datatype[@CanonicalImage = "PLS_INTEGER", @Image = "PLS_INTEGER", @TypeImage = "PLS_INTEGER"]
+ | | +- ScalarDataTypeName[@CanonicalImage = "PLS_INTEGER", @Image = "PLS_INTEGER"]
+ | +- DeclarativeUnit[@CanonicalImage = null]
+ | | +- SubTypeDefinition[@CanonicalImage = "EXAMPLE_DATA_AAT", @Image = "example_data_aat"]
+ | | +- QualifiedID[@CanonicalImage = "EXAMPLE_DATA_AAT", @Image = "example_data_aat"]
+ | | +- Datatype[@CanonicalImage = "EXAMPLE_DATA_RT", @Image = "example_data_rt", @TypeImage = "example_data_rt"]
+ | | | +- QualifiedName[@CanonicalImage = "EXAMPLE_DATA_RT", @Image = "example_data_rt"]
+ | | | +- UnqualifiedID[@CanonicalImage = "EXAMPLE_DATA_RT", @Image = "example_data_rt"]
+ | | +- Datatype[@CanonicalImage = "BINARY_INTEGER", @Image = "BINARY_INTEGER", @TypeImage = "BINARY_INTEGER"]
+ | | +- ScalarDataTypeName[@CanonicalImage = "BINARY_INTEGER", @Image = "BINARY_INTEGER"]
+ | +- DeclarativeUnit[@CanonicalImage = null]
+ | +- VariableOrConstantDeclaration[@CanonicalImage = null]
+ | +- VariableOrConstantDeclarator[@CanonicalImage = "L_EXAMPLE_DATA EXAMPLE_DATA_AAT", @Image = "l_example_data example_data_aat"]
+ | +- VariableOrConstantDeclaratorId[@Array = false, @ArrayDepth = 0, @CanonicalImage = "L_EXAMPLE_DATA", @Image = "l_example_data"]
+ | | +- ID[@CanonicalImage = "L_EXAMPLE_DATA", @Image = "l_example_data"]
+ | +- Datatype[@CanonicalImage = "EXAMPLE_DATA_AAT", @Image = "example_data_aat", @TypeImage = "example_data_aat"]
+ | +- QualifiedName[@CanonicalImage = "EXAMPLE_DATA_AAT", @Image = "example_data_aat"]
+ | +- UnqualifiedID[@CanonicalImage = "EXAMPLE_DATA_AAT", @Image = "example_data_aat"]
+ +- Statement[@CanonicalImage = null]
+ | +- UnlabelledStatement[@CanonicalImage = null]
+ | +- SelectIntoStatement[@All = false, @CanonicalImage = null, @Distinct = false, @Unique = false]
+ | +- SelectList[@CanonicalImage = null]
+ | | +- SqlExpression[@CanonicalImage = "1", @Image = "1"]
+ | | | +- PrimaryPrefix[@CanonicalImage = "1", @Image = "1", @SelfModifier = false]
+ | | | +- Literal[@CanonicalImage = "1", @Image = "1"]
+ | | | +- NumericLiteral[@CanonicalImage = "1", @Image = "1"]
+ | | +- ColumnAlias[@CanonicalImage = "FIELD_VALUE_ONE", @Image = "field_value_one"]
+ | | | +- ID[@CanonicalImage = "FIELD_VALUE_ONE", @Image = "field_value_one"]
+ | | +- SqlExpression[@CanonicalImage = "2", @Image = "2"]
+ | | | +- PrimaryPrefix[@CanonicalImage = "2", @Image = "2", @SelfModifier = false]
+ | | | +- Literal[@CanonicalImage = "2", @Image = "2"]
+ | | | +- NumericLiteral[@CanonicalImage = "2", @Image = "2"]
+ | | +- ColumnAlias[@CanonicalImage = "FIELD_VALUE_TWO", @Image = "field_value_two"]
+ | | | +- ID[@CanonicalImage = "FIELD_VALUE_TWO", @Image = "field_value_two"]
+ | | +- SqlExpression[@CanonicalImage = "3", @Image = "3"]
+ | | | +- PrimaryPrefix[@CanonicalImage = "3", @Image = "3", @SelfModifier = false]
+ | | | +- Literal[@CanonicalImage = "3", @Image = "3"]
+ | | | +- NumericLiteral[@CanonicalImage = "3", @Image = "3"]
+ | | +- ColumnAlias[@CanonicalImage = "FIELD_VALUE_THREE", @Image = "field_value_three"]
+ | | +- ID[@CanonicalImage = "FIELD_VALUE_THREE", @Image = "field_value_three"]
+ | +- IntoClause[@CanonicalImage = null]
+ | | +- VariableName[@CanonicalImage = "L_EXAMPLE_DATA(1).FIELD_ONE", @Image = "l_example_data(1).field_one"]
+ | | | +- ID[@CanonicalImage = "L_EXAMPLE_DATA", @Image = "l_example_data"]
+ | | | +- Literal[@CanonicalImage = "1", @Image = "1"]
+ | | | | +- NumericLiteral[@CanonicalImage = "1", @Image = "1"]
+ | | | +- ID[@CanonicalImage = "FIELD_ONE", @Image = "field_one"]
+ | | +- VariableName[@CanonicalImage = "L_EXAMPLE_DATA(1).FIELD_TWO", @Image = "l_example_data(1).field_two"]
+ | | | +- ID[@CanonicalImage = "L_EXAMPLE_DATA", @Image = "l_example_data"]
+ | | | +- Literal[@CanonicalImage = "1", @Image = "1"]
+ | | | | +- NumericLiteral[@CanonicalImage = "1", @Image = "1"]
+ | | | +- ID[@CanonicalImage = "FIELD_TWO", @Image = "field_two"]
+ | | +- VariableName[@CanonicalImage = "L_EXAMPLE_DATA(1).FIELD_THREE", @Image = "l_example_data(1).field_three"]
+ | | +- ID[@CanonicalImage = "L_EXAMPLE_DATA", @Image = "l_example_data"]
+ | | +- Literal[@CanonicalImage = "1", @Image = "1"]
+ | | | +- NumericLiteral[@CanonicalImage = "1", @Image = "1"]
+ | | +- ID[@CanonicalImage = "FIELD_THREE", @Image = "field_three"]
+ | +- FromClause[@CanonicalImage = null]
+ | +- TableReference[@CanonicalImage = null]
+ | +- TableName[@CanonicalImage = "DUAL", @Image = "DUAL"]
+ | +- ID[@CanonicalImage = "DUAL", @Image = "DUAL"]
+ +- ID[@CanonicalImage = "EXAMPLE_PROCEDURE", @Image = "EXAMPLE_PROCEDURE"]
diff --git a/pom.xml b/pom.xml
index 6f5b89d5d9..5dd7f00910 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,7 +76,7 @@
- 2021-08-28T15:27:18Z
+ 2021-09-25T11:46:09Z
8