Commit 7fcdb5e0 authored by Alvaro Herrera's avatar Alvaro Herrera

pg_dump: store unused attribs as NULL instead of '\0'

Commit f831d4ac changed pg_dump to emit (and pg_restore to
understand) NULLs for unused members in ArchiveEntry structs, as a side
effect of some code beautification.  That broke pg_restore of dumps
generated with older pg_dump, however, so it was reverted in
19455c9f.  Since the archiver version number has been bumped in
3b925e90, we can put it back.

Author: Dmitry Dolgov
Discussion: https://postgr.es/m/CA+q6zcXx0XHqLsFJLaUU2j5BDiBAHig=YRoBC_YVq7VJGvzBEA@mail.gmail.com
parent 60bbf075
...@@ -1087,10 +1087,10 @@ ArchiveEntry(Archive *AHX, CatalogId catalogId, DumpId dumpId, ...@@ -1087,10 +1087,10 @@ ArchiveEntry(Archive *AHX, CatalogId catalogId, DumpId dumpId,
newToc->namespace = opts->namespace ? pg_strdup(opts->namespace) : NULL; newToc->namespace = opts->namespace ? pg_strdup(opts->namespace) : NULL;
newToc->tablespace = opts->tablespace ? pg_strdup(opts->tablespace) : NULL; newToc->tablespace = opts->tablespace ? pg_strdup(opts->tablespace) : NULL;
newToc->tableam = opts->tableam ? pg_strdup(opts->tableam) : NULL; newToc->tableam = opts->tableam ? pg_strdup(opts->tableam) : NULL;
newToc->owner = pg_strdup(opts->owner); newToc->owner = opts->owner ? pg_strdup(opts->owner) : NULL;
newToc->desc = pg_strdup(opts->description); newToc->desc = pg_strdup(opts->description);
newToc->defn = pg_strdup(opts->createStmt); newToc->defn = opts->createStmt ? pg_strdup(opts->createStmt) : NULL;
newToc->dropStmt = pg_strdup(opts->dropStmt); newToc->dropStmt = opts->dropStmt ? pg_strdup(opts->dropStmt) : NULL;
newToc->copyStmt = opts->copyStmt ? pg_strdup(opts->copyStmt) : NULL; newToc->copyStmt = opts->copyStmt ? pg_strdup(opts->copyStmt) : NULL;
if (opts->nDeps > 0) if (opts->nDeps > 0)
...@@ -3621,7 +3621,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData) ...@@ -3621,7 +3621,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData)
} }
else else
{ {
if (strlen(te->defn) > 0) if (te->defn && strlen(te->defn) > 0)
ahprintf(AH, "%s\n\n", te->defn); ahprintf(AH, "%s\n\n", te->defn);
} }
...@@ -3632,7 +3632,8 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData) ...@@ -3632,7 +3632,8 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData)
* with DROP commands must appear in one list or the other. * with DROP commands must appear in one list or the other.
*/ */
if (!ropt->noOwner && !ropt->use_setsessauth && if (!ropt->noOwner && !ropt->use_setsessauth &&
strlen(te->owner) > 0 && strlen(te->dropStmt) > 0) te->owner && strlen(te->owner) > 0 &&
te->dropStmt && strlen(te->dropStmt) > 0)
{ {
if (strcmp(te->desc, "AGGREGATE") == 0 || if (strcmp(te->desc, "AGGREGATE") == 0 ||
strcmp(te->desc, "BLOB") == 0 || strcmp(te->desc, "BLOB") == 0 ||
......
...@@ -96,12 +96,7 @@ typedef z_stream *z_streamp; ...@@ -96,12 +96,7 @@ typedef z_stream *z_streamp;
* behavior */ * behavior */
#define K_VERS_1_14 MAKE_ARCHIVE_VERSION(1, 14, 0) /* add tableam */ #define K_VERS_1_14 MAKE_ARCHIVE_VERSION(1, 14, 0) /* add tableam */
/* /* Current archive version number (the format we can output) */
* Current archive version number (the format we can output)
*
* Note: If you update the current archive version, consider
* https://postgr.es/m/20190227123217.GA27552@alvherre.pgsql
*/
#define K_VERS_MAJOR 1 #define K_VERS_MAJOR 1
#define K_VERS_MINOR 14 #define K_VERS_MINOR 14
#define K_VERS_REV 0 #define K_VERS_REV 0
......
...@@ -2244,8 +2244,6 @@ dumpTableData(Archive *fout, TableDataInfo *tdinfo) ...@@ -2244,8 +2244,6 @@ dumpTableData(Archive *fout, TableDataInfo *tdinfo)
.owner = tbinfo->rolname, .owner = tbinfo->rolname,
.description = "TABLE DATA", .description = "TABLE DATA",
.section = SECTION_DATA, .section = SECTION_DATA,
.createStmt = "",
.dropStmt = "",
.copyStmt = copyStmt, .copyStmt = copyStmt,
.deps = &(tbinfo->dobj.dumpId), .deps = &(tbinfo->dobj.dumpId),
.nDeps = 1, .nDeps = 1,
...@@ -2300,7 +2298,6 @@ refreshMatViewData(Archive *fout, TableDataInfo *tdinfo) ...@@ -2300,7 +2298,6 @@ refreshMatViewData(Archive *fout, TableDataInfo *tdinfo)
.description = "MATERIALIZED VIEW DATA", .description = "MATERIALIZED VIEW DATA",
.section = SECTION_POST_DATA, .section = SECTION_POST_DATA,
.createStmt = q->data, .createStmt = q->data,
.dropStmt = "",
.deps = tdinfo->dobj.dependencies, .deps = tdinfo->dobj.dependencies,
.nDeps = tdinfo->dobj.nDeps)); .nDeps = tdinfo->dobj.nDeps));
...@@ -2865,7 +2862,6 @@ dumpDatabase(Archive *fout) ...@@ -2865,7 +2862,6 @@ dumpDatabase(Archive *fout)
.description = "COMMENT", .description = "COMMENT",
.section = SECTION_NONE, .section = SECTION_NONE,
.createStmt = dbQry->data, .createStmt = dbQry->data,
.dropStmt = "",
.deps = &dbDumpId, .deps = &dbDumpId,
.nDeps = 1)); .nDeps = 1));
} }
...@@ -2895,7 +2891,6 @@ dumpDatabase(Archive *fout) ...@@ -2895,7 +2891,6 @@ dumpDatabase(Archive *fout)
.description = "SECURITY LABEL", .description = "SECURITY LABEL",
.section = SECTION_NONE, .section = SECTION_NONE,
.createStmt = seclabelQry->data, .createStmt = seclabelQry->data,
.dropStmt = "",
.deps = &dbDumpId, .deps = &dbDumpId,
.nDeps = 1)); .nDeps = 1));
destroyPQExpBuffer(seclabelQry); destroyPQExpBuffer(seclabelQry);
...@@ -3012,10 +3007,8 @@ dumpDatabase(Archive *fout) ...@@ -3012,10 +3007,8 @@ dumpDatabase(Archive *fout)
ArchiveEntry(fout, nilCatalogId, createDumpId(), ArchiveEntry(fout, nilCatalogId, createDumpId(),
ARCHIVE_OPTS(.tag = "pg_largeobject", ARCHIVE_OPTS(.tag = "pg_largeobject",
.description = "pg_largeobject", .description = "pg_largeobject",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = loOutQry->data, .createStmt = loOutQry->data));
.dropStmt = ""));
PQclear(lo_res); PQclear(lo_res);
...@@ -3122,10 +3115,8 @@ dumpEncoding(Archive *AH) ...@@ -3122,10 +3115,8 @@ dumpEncoding(Archive *AH)
ArchiveEntry(AH, nilCatalogId, createDumpId(), ArchiveEntry(AH, nilCatalogId, createDumpId(),
ARCHIVE_OPTS(.tag = "ENCODING", ARCHIVE_OPTS(.tag = "ENCODING",
.description = "ENCODING", .description = "ENCODING",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = qry->data, .createStmt = qry->data));
.dropStmt = ""));
destroyPQExpBuffer(qry); destroyPQExpBuffer(qry);
} }
...@@ -3149,10 +3140,8 @@ dumpStdStrings(Archive *AH) ...@@ -3149,10 +3140,8 @@ dumpStdStrings(Archive *AH)
ArchiveEntry(AH, nilCatalogId, createDumpId(), ArchiveEntry(AH, nilCatalogId, createDumpId(),
ARCHIVE_OPTS(.tag = "STDSTRINGS", ARCHIVE_OPTS(.tag = "STDSTRINGS",
.description = "STDSTRINGS", .description = "STDSTRINGS",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = qry->data, .createStmt = qry->data));
.dropStmt = ""));
destroyPQExpBuffer(qry); destroyPQExpBuffer(qry);
} }
...@@ -3205,10 +3194,8 @@ dumpSearchPath(Archive *AH) ...@@ -3205,10 +3194,8 @@ dumpSearchPath(Archive *AH)
ArchiveEntry(AH, nilCatalogId, createDumpId(), ArchiveEntry(AH, nilCatalogId, createDumpId(),
ARCHIVE_OPTS(.tag = "SEARCHPATH", ARCHIVE_OPTS(.tag = "SEARCHPATH",
.description = "SEARCHPATH", .description = "SEARCHPATH",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = qry->data, .createStmt = qry->data));
.dropStmt = ""));
/* Also save it in AH->searchpath, in case we're doing plain text dump */ /* Also save it in AH->searchpath, in case we're doing plain text dump */
AH->searchpath = pg_strdup(qry->data); AH->searchpath = pg_strdup(qry->data);
...@@ -3684,7 +3671,6 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo) ...@@ -3684,7 +3671,6 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo)
.description = "ROW SECURITY", .description = "ROW SECURITY",
.section = SECTION_POST_DATA, .section = SECTION_POST_DATA,
.createStmt = query->data, .createStmt = query->data,
.dropStmt = "",
.deps = &(tbinfo->dobj.dumpId), .deps = &(tbinfo->dobj.dumpId),
.nDeps = 1)); .nDeps = 1));
...@@ -4051,10 +4037,8 @@ dumpPublicationTable(Archive *fout, PublicationRelInfo *pubrinfo) ...@@ -4051,10 +4037,8 @@ dumpPublicationTable(Archive *fout, PublicationRelInfo *pubrinfo)
ARCHIVE_OPTS(.tag = tag, ARCHIVE_OPTS(.tag = tag,
.namespace = tbinfo->dobj.namespace->dobj.name, .namespace = tbinfo->dobj.namespace->dobj.name,
.description = "PUBLICATION TABLE", .description = "PUBLICATION TABLE",
.owner = "",
.section = SECTION_POST_DATA, .section = SECTION_POST_DATA,
.createStmt = query->data, .createStmt = query->data));
.dropStmt = ""));
free(tag); free(tag);
destroyPQExpBuffer(query); destroyPQExpBuffer(query);
...@@ -9502,7 +9486,6 @@ dumpComment(Archive *fout, const char *type, const char *name, ...@@ -9502,7 +9486,6 @@ dumpComment(Archive *fout, const char *type, const char *name,
.description = "COMMENT", .description = "COMMENT",
.section = SECTION_NONE, .section = SECTION_NONE,
.createStmt = query->data, .createStmt = query->data,
.dropStmt = "",
.deps = &dumpId, .deps = &dumpId,
.nDeps = 1)); .nDeps = 1));
...@@ -9572,7 +9555,6 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo, ...@@ -9572,7 +9555,6 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo,
.description = "COMMENT", .description = "COMMENT",
.section = SECTION_NONE, .section = SECTION_NONE,
.createStmt = query->data, .createStmt = query->data,
.dropStmt = "",
.deps = &(tbinfo->dobj.dumpId), .deps = &(tbinfo->dobj.dumpId),
.nDeps = 1)); .nDeps = 1));
} }
...@@ -9598,7 +9580,6 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo, ...@@ -9598,7 +9580,6 @@ dumpTableComment(Archive *fout, TableInfo *tbinfo,
.description = "COMMENT", .description = "COMMENT",
.section = SECTION_NONE, .section = SECTION_NONE,
.createStmt = query->data, .createStmt = query->data,
.dropStmt = "",
.deps = &(tbinfo->dobj.dumpId), .deps = &(tbinfo->dobj.dumpId),
.nDeps = 1)); .nDeps = 1));
} }
...@@ -9879,11 +9860,8 @@ dumpDumpableObject(Archive *fout, DumpableObject *dobj) ...@@ -9879,11 +9860,8 @@ dumpDumpableObject(Archive *fout, DumpableObject *dobj)
te = ArchiveEntry(fout, dobj->catId, dobj->dumpId, te = ArchiveEntry(fout, dobj->catId, dobj->dumpId,
ARCHIVE_OPTS(.tag = dobj->name, ARCHIVE_OPTS(.tag = dobj->name,
.description = "BLOBS", .description = "BLOBS",
.owner = "",
.section = SECTION_DATA, .section = SECTION_DATA,
.dumpFn = dumpBlobs, .dumpFn = dumpBlobs));
.createStmt = "",
.dropStmt = ""));
/* /*
* Set the TocEntry's dataLength in case we are doing a * Set the TocEntry's dataLength in case we are doing a
...@@ -10088,7 +10066,6 @@ dumpExtension(Archive *fout, ExtensionInfo *extinfo) ...@@ -10088,7 +10066,6 @@ dumpExtension(Archive *fout, ExtensionInfo *extinfo)
ArchiveEntry(fout, extinfo->dobj.catId, extinfo->dobj.dumpId, ArchiveEntry(fout, extinfo->dobj.catId, extinfo->dobj.dumpId,
ARCHIVE_OPTS(.tag = extinfo->dobj.name, ARCHIVE_OPTS(.tag = extinfo->dobj.name,
.description = "EXTENSION", .description = "EXTENSION",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = q->data, .createStmt = q->data,
.dropStmt = delq->data)); .dropStmt = delq->data));
...@@ -11232,7 +11209,6 @@ dumpCompositeTypeColComments(Archive *fout, TypeInfo *tyinfo) ...@@ -11232,7 +11209,6 @@ dumpCompositeTypeColComments(Archive *fout, TypeInfo *tyinfo)
.description = "COMMENT", .description = "COMMENT",
.section = SECTION_NONE, .section = SECTION_NONE,
.createStmt = query->data, .createStmt = query->data,
.dropStmt = "",
.deps = &(tyinfo->dobj.dumpId), .deps = &(tyinfo->dobj.dumpId),
.nDeps = 1)); .nDeps = 1));
} }
...@@ -11288,8 +11264,7 @@ dumpShellType(Archive *fout, ShellTypeInfo *stinfo) ...@@ -11288,8 +11264,7 @@ dumpShellType(Archive *fout, ShellTypeInfo *stinfo)
.owner = stinfo->baseType->rolname, .owner = stinfo->baseType->rolname,
.description = "SHELL TYPE", .description = "SHELL TYPE",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = q->data, .createStmt = q->data));
.dropStmt = ""));
destroyPQExpBuffer(q); destroyPQExpBuffer(q);
} }
...@@ -12234,7 +12209,6 @@ dumpCast(Archive *fout, CastInfo *cast) ...@@ -12234,7 +12209,6 @@ dumpCast(Archive *fout, CastInfo *cast)
ArchiveEntry(fout, cast->dobj.catId, cast->dobj.dumpId, ArchiveEntry(fout, cast->dobj.catId, cast->dobj.dumpId,
ARCHIVE_OPTS(.tag = labelq->data, ARCHIVE_OPTS(.tag = labelq->data,
.description = "CAST", .description = "CAST",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = defqry->data, .createStmt = defqry->data,
.dropStmt = delqry->data)); .dropStmt = delqry->data));
...@@ -12362,7 +12336,6 @@ dumpTransform(Archive *fout, TransformInfo *transform) ...@@ -12362,7 +12336,6 @@ dumpTransform(Archive *fout, TransformInfo *transform)
ArchiveEntry(fout, transform->dobj.catId, transform->dobj.dumpId, ArchiveEntry(fout, transform->dobj.catId, transform->dobj.dumpId,
ARCHIVE_OPTS(.tag = labelq->data, ARCHIVE_OPTS(.tag = labelq->data,
.description = "TRANSFORM", .description = "TRANSFORM",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = defqry->data, .createStmt = defqry->data,
.dropStmt = delqry->data, .dropStmt = delqry->data,
...@@ -12749,7 +12722,6 @@ dumpAccessMethod(Archive *fout, AccessMethodInfo *aminfo) ...@@ -12749,7 +12722,6 @@ dumpAccessMethod(Archive *fout, AccessMethodInfo *aminfo)
ArchiveEntry(fout, aminfo->dobj.catId, aminfo->dobj.dumpId, ArchiveEntry(fout, aminfo->dobj.catId, aminfo->dobj.dumpId,
ARCHIVE_OPTS(.tag = aminfo->dobj.name, ARCHIVE_OPTS(.tag = aminfo->dobj.name,
.description = "ACCESS METHOD", .description = "ACCESS METHOD",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = q->data, .createStmt = q->data,
.dropStmt = delq->data)); .dropStmt = delq->data));
...@@ -14211,7 +14183,6 @@ dumpTSParser(Archive *fout, TSParserInfo *prsinfo) ...@@ -14211,7 +14183,6 @@ dumpTSParser(Archive *fout, TSParserInfo *prsinfo)
ARCHIVE_OPTS(.tag = prsinfo->dobj.name, ARCHIVE_OPTS(.tag = prsinfo->dobj.name,
.namespace = prsinfo->dobj.namespace->dobj.name, .namespace = prsinfo->dobj.namespace->dobj.name,
.description = "TEXT SEARCH PARSER", .description = "TEXT SEARCH PARSER",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = q->data, .createStmt = q->data,
.dropStmt = delq->data)); .dropStmt = delq->data));
...@@ -14350,7 +14321,6 @@ dumpTSTemplate(Archive *fout, TSTemplateInfo *tmplinfo) ...@@ -14350,7 +14321,6 @@ dumpTSTemplate(Archive *fout, TSTemplateInfo *tmplinfo)
ARCHIVE_OPTS(.tag = tmplinfo->dobj.name, ARCHIVE_OPTS(.tag = tmplinfo->dobj.name,
.namespace = tmplinfo->dobj.namespace->dobj.name, .namespace = tmplinfo->dobj.namespace->dobj.name,
.description = "TEXT SEARCH TEMPLATE", .description = "TEXT SEARCH TEMPLATE",
.owner = "",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = q->data, .createStmt = q->data,
.dropStmt = delq->data)); .dropStmt = delq->data));
...@@ -14819,8 +14789,7 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo) ...@@ -14819,8 +14789,7 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo)
.owner = daclinfo->defaclrole, .owner = daclinfo->defaclrole,
.description = "DEFAULT ACL", .description = "DEFAULT ACL",
.section = SECTION_POST_DATA, .section = SECTION_POST_DATA,
.createStmt = q->data, .createStmt = q->data));
.dropStmt = ""));
destroyPQExpBuffer(tag); destroyPQExpBuffer(tag);
destroyPQExpBuffer(q); destroyPQExpBuffer(q);
...@@ -14916,7 +14885,6 @@ dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId, ...@@ -14916,7 +14885,6 @@ dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId,
.description = "ACL", .description = "ACL",
.section = SECTION_NONE, .section = SECTION_NONE,
.createStmt = sql->data, .createStmt = sql->data,
.dropStmt = "",
.deps = &objDumpId, .deps = &objDumpId,
.nDeps = 1)); .nDeps = 1));
destroyPQExpBuffer(tag); destroyPQExpBuffer(tag);
...@@ -15006,7 +14974,6 @@ dumpSecLabel(Archive *fout, const char *type, const char *name, ...@@ -15006,7 +14974,6 @@ dumpSecLabel(Archive *fout, const char *type, const char *name,
.description = "SECURITY LABEL", .description = "SECURITY LABEL",
.section = SECTION_NONE, .section = SECTION_NONE,
.createStmt = query->data, .createStmt = query->data,
.dropStmt = "",
.deps = &dumpId, .deps = &dumpId,
.nDeps = 1)); .nDeps = 1));
destroyPQExpBuffer(tag); destroyPQExpBuffer(tag);
...@@ -15090,7 +15057,6 @@ dumpTableSecLabel(Archive *fout, TableInfo *tbinfo, const char *reltypename) ...@@ -15090,7 +15057,6 @@ dumpTableSecLabel(Archive *fout, TableInfo *tbinfo, const char *reltypename)
.description = "SECURITY LABEL", .description = "SECURITY LABEL",
.section = SECTION_NONE, .section = SECTION_NONE,
.createStmt = query->data, .createStmt = query->data,
.dropStmt = "",
.deps = &(tbinfo->dobj.dumpId), .deps = &(tbinfo->dobj.dumpId),
.nDeps = 1)); .nDeps = 1));
} }
...@@ -16438,10 +16404,8 @@ dumpIndexAttach(Archive *fout, IndexAttachInfo *attachinfo) ...@@ -16438,10 +16404,8 @@ dumpIndexAttach(Archive *fout, IndexAttachInfo *attachinfo)
ARCHIVE_OPTS(.tag = attachinfo->dobj.name, ARCHIVE_OPTS(.tag = attachinfo->dobj.name,
.namespace = attachinfo->dobj.namespace->dobj.name, .namespace = attachinfo->dobj.namespace->dobj.name,
.description = "INDEX ATTACH", .description = "INDEX ATTACH",
.owner = "",
.section = SECTION_POST_DATA, .section = SECTION_POST_DATA,
.createStmt = q->data, .createStmt = q->data));
.dropStmt = ""));
destroyPQExpBuffer(q); destroyPQExpBuffer(q);
} }
...@@ -17071,7 +17035,6 @@ dumpSequence(Archive *fout, TableInfo *tbinfo) ...@@ -17071,7 +17035,6 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
.description = "SEQUENCE OWNED BY", .description = "SEQUENCE OWNED BY",
.section = SECTION_PRE_DATA, .section = SECTION_PRE_DATA,
.createStmt = query->data, .createStmt = query->data,
.dropStmt = "",
.deps = &(tbinfo->dobj.dumpId), .deps = &(tbinfo->dobj.dumpId),
.nDeps = 1)); .nDeps = 1));
} }
...@@ -17140,7 +17103,6 @@ dumpSequenceData(Archive *fout, TableDataInfo *tdinfo) ...@@ -17140,7 +17103,6 @@ dumpSequenceData(Archive *fout, TableDataInfo *tdinfo)
.description = "SEQUENCE SET", .description = "SEQUENCE SET",
.section = SECTION_DATA, .section = SECTION_DATA,
.createStmt = query->data, .createStmt = query->data,
.dropStmt = "",
.deps = &(tbinfo->dobj.dumpId), .deps = &(tbinfo->dobj.dumpId),
.nDeps = 1)); .nDeps = 1));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment