Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
Postgres FD Implementation
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Abuhujair Javed
Postgres FD Implementation
Commits
92c8437d
Commit
92c8437d
authored
Feb 15, 2000
by
Thomas G. Lockhart
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update "join syntax" test for new capabilities.
parent
ebd697a3
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
312 additions
and
76 deletions
+312
-76
src/test/regress/expected/join.out
src/test/regress/expected/join.out
+225
-46
src/test/regress/sql/join.sql
src/test/regress/sql/join.sql
+87
-30
No files found.
src/test/regress/expected/join.out
View file @
92c8437d
...
...
@@ -2,12 +2,12 @@
-- JOIN
-- Test join clauses
--
CREATE TABLE J
OIN
1_TBL (
CREATE TABLE J1_TBL (
i integer,
j integer,
t text
);
CREATE TABLE J
OIN
2_TBL (
CREATE TABLE J2_TBL (
i integer,
k integer
);
...
...
@@ -20,21 +20,99 @@ CREATE TABLE JOIN4_TBL (
k integer,
z integer
);
INSERT INTO JOIN1_TBL VALUES (1, 3, 'one');
INSERT INTO JOIN1_TBL VALUES (2, 2, 'two');
INSERT INTO JOIN1_TBL VALUES (3, 1, 'three');
INSERT INTO JOIN1_TBL VALUES (4, 0, 'four');
INSERT INTO JOIN2_TBL VALUES (1, -1);
INSERT INTO JOIN2_TBL VALUES (2, 2);
INSERT INTO JOIN2_TBL VALUES (3, -3);
INSERT INTO JOIN2_TBL VALUES (2, 4);
INSERT INTO J1_TBL VALUES (1, 3, 'one');
INSERT INTO J1_TBL VALUES (2, 2, 'two');
INSERT INTO J1_TBL VALUES (3, 1, 'three');
INSERT INTO J1_TBL VALUES (4, 0, 'four');
INSERT INTO J2_TBL VALUES (1, -1);
INSERT INTO J2_TBL VALUES (2, 2);
INSERT INTO J2_TBL VALUES (3, -3);
INSERT INTO J2_TBL VALUES (2, 4);
--
-- CORRELATION NAMES
-- Make sure that table/column aliases are supported
-- before diving into more complex join syntax.
--
SELECT '' AS "xxx", *
FROM J1_TBL AS tx;
xxx | i | j | t
-----+---+---+-------
| 1 | 3 | one
| 2 | 2 | two
| 3 | 1 | three
| 4 | 0 | four
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL tx;
xxx | i | j | t
-----+---+---+-------
| 1 | 3 | one
| 2 | 2 | two
| 3 | 1 | three
| 4 | 0 | four
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL AS t1 (a, b, c);
xxx | a | b | c
-----+---+---+-------
| 1 | 3 | one
| 2 | 2 | two
| 3 | 1 | three
| 4 | 0 | four
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c);
xxx | a | b | c
-----+---+---+-------
| 1 | 3 | one
| 2 | 2 | two
| 3 | 1 | three
| 4 | 0 | four
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e);
xxx | a | b | c | d | e
-----+---+---+-------+---+----
| 1 | 3 | one | 1 | -1
| 2 | 2 | two | 1 | -1
| 3 | 1 | three | 1 | -1
| 4 | 0 | four | 1 | -1
| 1 | 3 | one | 2 | 2
| 2 | 2 | two | 2 | 2
| 3 | 1 | three | 2 | 2
| 4 | 0 | four | 2 | 2
| 1 | 3 | one | 3 | -3
| 2 | 2 | two | 3 | -3
| 3 | 1 | three | 3 | -3
| 4 | 0 | four | 3 | -3
| 1 | 3 | one | 2 | 4
| 2 | 2 | two | 2 | 4
| 3 | 1 | three | 2 | 4
| 4 | 0 | four | 2 | 4
(16 rows)
SELECT '' AS "xxx", t1.a, t2.e
FROM J1_TBL t1 (a, b, c), J2_TBL t2 (d, e)
WHERE t1.a = t2.d;
xxx | a | e
-----+---+----
| 1 | -1
| 2 | 2
| 2 | 4
| 3 | -3
(4 rows)
--
-- CROSS JOIN
-- Qualifications are not allowed on cross joins,
-- which degenerate into a standard unqualified inner join.
--
SELECT '' AS "xxx", *
FROM J
OIN1_TBL CROSS JOIN JOIN
2_TBL;
FROM J
1_TBL CROSS JOIN J
2_TBL;
xxx | i | j | t | i | k
-----+---+---+-------+---+----
| 1 | 3 | one | 1 | -1
...
...
@@ -55,15 +133,41 @@ SELECT '' AS "xxx", *
| 4 | 0 | four | 2 | 4
(16 rows)
-- ambiguous column
SELECT '' AS "xxx", i, k, t
FROM J
OIN1_TBL CROSS JOIN JOIN
2_TBL;
FROM J
1_TBL CROSS JOIN J
2_TBL;
ERROR: Column 'i' is ambiguous
-- resolve previous ambiguity by specifying the table name
SELECT '' AS "xxx", t1.i, k, t
FROM J1_TBL t1 CROSS JOIN J2_TBL t2;
xxx | i | k | t
-----+---+----+-------
| 1 | -1 | one
| 2 | -1 | two
| 3 | -1 | three
| 4 | -1 | four
| 1 | 2 | one
| 2 | 2 | two
| 3 | 2 | three
| 4 | 2 | four
| 1 | -3 | one
| 2 | -3 | two
| 3 | -3 | three
| 4 | -3 | four
| 1 | 4 | one
| 2 | 4 | two
| 3 | 4 | three
| 4 | 4 | four
(16 rows)
SELECT '' AS "xxx", ii, tt, kk
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL AS JT (ii, jj, tt, ii2, kk);
ERROR: parser: parse error at or near "("
SELECT '' AS "xxx", jt.ii, jt.jj, jt.kk
FROM JOIN1_TBL CROSS JOIN JOIN2_TBL AS JT (ii, jj, tt, ii2, kk);
ERROR: parser: parse error at or near "("
FROM (J1_TBL CROSS JOIN J2_TBL)
AS tx (ii, jj, tt, ii2, kk);
ERROR: JOIN table aliases are not supported
SELECT '' AS "xxx", tx.ii, tx.jj, tx.kk
FROM (J1_TBL t1 (a, b, c) CROSS JOIN J2_TBL t2 (d, e))
AS tx (ii, jj, tt, ii2, kk);
ERROR: JOIN table aliases are not supported
--
--
-- Inner joins (equi-joins)
...
...
@@ -74,29 +178,108 @@ ERROR: parser: parse error at or near "("
-- The USING syntax changes the shape of the resulting table
-- by including a column in the USING clause only once in the result.
--
-- Inner equi-join on all columns with the same name
SELECT '' AS "xxx", *
FROM JOIN1_TBL NATURAL JOIN JOIN2_TBL;
ERROR: JOIN expressions are not yet implemented
-- Inner equi-join on specified column
SELECT '' AS "xxx", *
FROM JOIN1_TBL INNER JOIN JOIN2_TBL USING (i);
ERROR: JOIN expressions are not yet implemented
FROM J1_TBL INNER JOIN J2_TBL USING (i);
xxx | i | j | t | k
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
-- Same as above, slightly different syntax
SELECT '' AS "xxx", *
FROM JOIN1_TBL JOIN JOIN2_TBL USING (i);
ERROR: JOIN expressions are not yet implemented
FROM J1_TBL JOIN J2_TBL USING (i);
xxx | i | j | t | k
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, d) USING (a);
xxx | a | b | c | d
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) JOIN J2_TBL t2 (a, b) USING (b);
xxx | b | a | c | a
-----+---+---+-----+---
| 2 | 2 | two | 2
(1 row)
--
-- NATURAL JOIN
-- Inner equi-join on all columns with the same name
--
SELECT '' AS "xxx", *
FROM J1_TBL NATURAL JOIN J2_TBL;
xxx | i | j | t | k
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (a, d);
xxx | a | b | c | d
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a);
xxx | a | b | c | d
-----+---+---+------+---
| 2 | 2 | two | 2
| 4 | 0 | four | 2
(2 rows)
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b, c) NATURAL JOIN J2_TBL t2 (d, a);
xxx | a | b | c | d
-----+---+---+------+---
| 2 | 2 | two | 2
| 4 | 0 | four | 2
(2 rows)
-- mismatch number of columns
-- currently, Postgres will fill in with underlying names
SELECT '' AS "xxx", *
FROM J1_TBL t1 (a, b) NATURAL JOIN J2_TBL t2 (a);
xxx | a | b | t | k
-----+---+---+-------+----
| 1 | 3 | one | -1
| 2 | 2 | two | 2
| 2 | 2 | two | 4
| 3 | 1 | three | -3
(4 rows)
--
-- Inner joins (equi-joins)
--
SELECT '' AS "xxx", *
FROM J
OIN1_TBL JOIN JOIN2_TBL ON (JOIN1_TBL.i = JOIN
2_TBL.i);
ERROR:
JOIN expressions are not yet implemented
FROM J
1_TBL JOIN J2_TBL ON (J1_TBL.i = J
2_TBL.i);
ERROR:
transformExpr: does not know how to transform node 501 (internal error)
SELECT '' AS "xxx", *
FROM J
OIN1_TBL JOIN JOIN2_TBL ON (JOIN1_TBL.i = JOIN
2_TBL.k);
ERROR:
JOIN expressions are not yet implemented
FROM J
1_TBL JOIN J2_TBL ON (J1_TBL.i = J
2_TBL.k);
ERROR:
transformExpr: does not know how to transform node 501 (internal error)
SELECT '' AS "xxx", *
FROM J
OIN1_TBL CROSS JOIN JOIN
2_TBL;
FROM J
1_TBL CROSS JOIN J
2_TBL;
xxx | i | j | t | i | k
-----+---+---+-------+---+----
| 1 | 3 | one | 1 | -1
...
...
@@ -121,32 +304,28 @@ SELECT '' AS "xxx", *
-- Non-equi-joins
--
SELECT '' AS "xxx", *
FROM J
OIN1_TBL JOIN JOIN2_TBL ON (JOIN1_TBL.i <= JOIN
2_TBL.k);
ERROR:
JOIN expressions are not yet implemented
FROM J
1_TBL JOIN J2_TBL ON (J1_TBL.i <= J
2_TBL.k);
ERROR:
transformExpr: does not know how to transform node 501 (internal error)
--
-- Outer joins
--
SELECT '' AS "xxx", *
FROM JOIN1_TBL OUTER JOIN JOIN2_TBL USING (i);
NOTICE: OUTER JOIN not yet implemented
ERROR: JOIN expressions are not yet implemented
FROM J1_TBL OUTER JOIN J2_TBL USING (i);
ERROR: OUTER JOIN is not yet supported
SELECT '' AS "xxx", *
FROM JOIN1_TBL LEFT OUTER JOIN JOIN2_TBL USING (i);
NOTICE: LEFT OUTER JOIN not yet implemented
ERROR: JOIN expressions are not yet implemented
FROM J1_TBL LEFT OUTER JOIN J2_TBL USING (i);
ERROR: OUTER JOIN is not yet supported
SELECT '' AS "xxx", *
FROM JOIN1_TBL RIGHT OUTER JOIN JOIN2_TBL USING (i);
NOTICE: RIGHT OUTER JOIN not yet implemented
ERROR: JOIN expressions are not yet implemented
FROM J1_TBL RIGHT OUTER JOIN J2_TBL USING (i);
ERROR: OUTER JOIN is not yet supported
SELECT '' AS "xxx", *
FROM JOIN1_TBL FULL OUTER JOIN JOIN2_TBL USING (i);
NOTICE: FULL OUTER JOIN not yet implemented
ERROR: JOIN expressions are not yet implemented
FROM J1_TBL FULL OUTER JOIN J2_TBL USING (i);
ERROR: OUTER JOIN is not yet supported
--
-- More complicated constructs
--
--
-- Clean up
--
DROP TABLE J
OIN
1_TBL;
DROP TABLE J
OIN
2_TBL;
DROP TABLE J1_TBL;
DROP TABLE J2_TBL;
src/test/regress/sql/join.sql
View file @
92c8437d
...
...
@@ -3,13 +3,13 @@
-- Test join clauses
--
CREATE
TABLE
J
OIN
1_TBL
(
CREATE
TABLE
J1_TBL
(
i
integer
,
j
integer
,
t
text
);
CREATE
TABLE
J
OIN
2_TBL
(
CREATE
TABLE
J2_TBL
(
i
integer
,
k
integer
);
...
...
@@ -25,15 +25,40 @@ CREATE TABLE JOIN4_TBL (
z
integer
);
INSERT
INTO
J
OIN
1_TBL
VALUES
(
1
,
3
,
'one'
);
INSERT
INTO
J
OIN
1_TBL
VALUES
(
2
,
2
,
'two'
);
INSERT
INTO
J
OIN
1_TBL
VALUES
(
3
,
1
,
'three'
);
INSERT
INTO
J
OIN
1_TBL
VALUES
(
4
,
0
,
'four'
);
INSERT
INTO
J1_TBL
VALUES
(
1
,
3
,
'one'
);
INSERT
INTO
J1_TBL
VALUES
(
2
,
2
,
'two'
);
INSERT
INTO
J1_TBL
VALUES
(
3
,
1
,
'three'
);
INSERT
INTO
J1_TBL
VALUES
(
4
,
0
,
'four'
);
INSERT
INTO
JOIN2_TBL
VALUES
(
1
,
-
1
);
INSERT
INTO
JOIN2_TBL
VALUES
(
2
,
2
);
INSERT
INTO
JOIN2_TBL
VALUES
(
3
,
-
3
);
INSERT
INTO
JOIN2_TBL
VALUES
(
2
,
4
);
INSERT
INTO
J2_TBL
VALUES
(
1
,
-
1
);
INSERT
INTO
J2_TBL
VALUES
(
2
,
2
);
INSERT
INTO
J2_TBL
VALUES
(
3
,
-
3
);
INSERT
INTO
J2_TBL
VALUES
(
2
,
4
);
--
-- CORRELATION NAMES
-- Make sure that table/column aliases are supported
-- before diving into more complex join syntax.
--
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
AS
tx
;
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
tx
;
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
AS
t1
(
a
,
b
,
c
);
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
t1
(
a
,
b
,
c
);
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
t1
(
a
,
b
,
c
),
J2_TBL
t2
(
d
,
e
);
SELECT
''
AS
"xxx"
,
t1
.
a
,
t2
.
e
FROM
J1_TBL
t1
(
a
,
b
,
c
),
J2_TBL
t2
(
d
,
e
)
WHERE
t1
.
a
=
t2
.
d
;
--
...
...
@@ -43,16 +68,23 @@ INSERT INTO JOIN2_TBL VALUES (2, 4);
--
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
CROSS
JOIN
JOIN
2_TBL
;
FROM
J
1_TBL
CROSS
JOIN
J
2_TBL
;
-- ambiguous column
SELECT
''
AS
"xxx"
,
i
,
k
,
t
FROM
JOIN1_TBL
CROSS
JOIN
JOIN2_TBL
;
FROM
J1_TBL
CROSS
JOIN
J2_TBL
;
-- resolve previous ambiguity by specifying the table name
SELECT
''
AS
"xxx"
,
t1
.
i
,
k
,
t
FROM
J1_TBL
t1
CROSS
JOIN
J2_TBL
t2
;
SELECT
''
AS
"xxx"
,
ii
,
tt
,
kk
FROM
JOIN1_TBL
CROSS
JOIN
JOIN2_TBL
AS
JT
(
ii
,
jj
,
tt
,
ii2
,
kk
);
FROM
(
J1_TBL
CROSS
JOIN
J2_TBL
)
AS
tx
(
ii
,
jj
,
tt
,
ii2
,
kk
);
SELECT
''
AS
"xxx"
,
jt
.
ii
,
jt
.
jj
,
jt
.
kk
FROM
JOIN1_TBL
CROSS
JOIN
JOIN2_TBL
AS
JT
(
ii
,
jj
,
tt
,
ii2
,
kk
);
SELECT
''
AS
"xxx"
,
tx
.
ii
,
tx
.
jj
,
tx
.
kk
FROM
(
J1_TBL
t1
(
a
,
b
,
c
)
CROSS
JOIN
J2_TBL
t2
(
d
,
e
))
AS
tx
(
ii
,
jj
,
tt
,
ii2
,
kk
);
--
...
...
@@ -67,17 +99,42 @@ SELECT '' AS "xxx", jt.ii, jt.jj, jt.kk
-- by including a column in the USING clause only once in the result.
--
-- Inner equi-join on specified column
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
INNER
JOIN
J2_TBL
USING
(
i
);
-- Same as above, slightly different syntax
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
JOIN
J2_TBL
USING
(
i
);
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
t1
(
a
,
b
,
c
)
JOIN
J2_TBL
t2
(
a
,
d
)
USING
(
a
);
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
t1
(
a
,
b
,
c
)
JOIN
J2_TBL
t2
(
a
,
b
)
USING
(
b
);
--
-- NATURAL JOIN
-- Inner equi-join on all columns with the same name
--
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
NATURAL
JOIN
JOIN
2_TBL
;
FROM
J
1_TBL
NATURAL
JOIN
J
2_TBL
;
-- Inner equi-join on specified column
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
INNER
JOIN
JOIN2_TBL
USING
(
i
);
FROM
J
1_TBL
t1
(
a
,
b
,
c
)
NATURAL
JOIN
J2_TBL
t2
(
a
,
d
);
-- Same as above, slightly different syntax
SELECT
''
AS
"xxx"
,
*
FROM
JOIN1_TBL
JOIN
JOIN2_TBL
USING
(
i
);
FROM
J1_TBL
t1
(
a
,
b
,
c
)
NATURAL
JOIN
J2_TBL
t2
(
d
,
a
);
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
t1
(
a
,
b
,
c
)
NATURAL
JOIN
J2_TBL
t2
(
d
,
a
);
-- mismatch number of columns
-- currently, Postgres will fill in with underlying names
SELECT
''
AS
"xxx"
,
*
FROM
J1_TBL
t1
(
a
,
b
)
NATURAL
JOIN
J2_TBL
t2
(
a
);
--
...
...
@@ -85,13 +142,13 @@ SELECT '' AS "xxx", *
--
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
JOIN
JOIN2_TBL
ON
(
JOIN1_TBL
.
i
=
JOIN
2_TBL
.
i
);
FROM
J
1_TBL
JOIN
J2_TBL
ON
(
J1_TBL
.
i
=
J
2_TBL
.
i
);
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
JOIN
JOIN2_TBL
ON
(
JOIN1_TBL
.
i
=
JOIN
2_TBL
.
k
);
FROM
J
1_TBL
JOIN
J2_TBL
ON
(
J1_TBL
.
i
=
J
2_TBL
.
k
);
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
CROSS
JOIN
JOIN
2_TBL
;
FROM
J
1_TBL
CROSS
JOIN
J
2_TBL
;
--
...
...
@@ -99,7 +156,7 @@ SELECT '' AS "xxx", *
--
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
JOIN
JOIN2_TBL
ON
(
JOIN1_TBL
.
i
<=
JOIN
2_TBL
.
k
);
FROM
J
1_TBL
JOIN
J2_TBL
ON
(
J1_TBL
.
i
<=
J
2_TBL
.
k
);
--
...
...
@@ -107,16 +164,16 @@ SELECT '' AS "xxx", *
--
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
OUTER
JOIN
JOIN
2_TBL
USING
(
i
);
FROM
J
1_TBL
OUTER
JOIN
J
2_TBL
USING
(
i
);
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
LEFT
OUTER
JOIN
JOIN
2_TBL
USING
(
i
);
FROM
J
1_TBL
LEFT
OUTER
JOIN
J
2_TBL
USING
(
i
);
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
RIGHT
OUTER
JOIN
JOIN
2_TBL
USING
(
i
);
FROM
J
1_TBL
RIGHT
OUTER
JOIN
J
2_TBL
USING
(
i
);
SELECT
''
AS
"xxx"
,
*
FROM
J
OIN1_TBL
FULL
OUTER
JOIN
JOIN
2_TBL
USING
(
i
);
FROM
J
1_TBL
FULL
OUTER
JOIN
J
2_TBL
USING
(
i
);
--
...
...
@@ -127,6 +184,6 @@ SELECT '' AS "xxx", *
-- Clean up
--
DROP
TABLE
J
OIN
1_TBL
;
DROP
TABLE
J
OIN
2_TBL
;
DROP
TABLE
J1_TBL
;
DROP
TABLE
J2_TBL
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment